Skip to content
Snippets Groups Projects
Commit 13600a80 authored by srosse's avatar srosse
Browse files

Merge branch 'OpenOLAT_14.2' of...

Merge branch 'OpenOLAT_14.2' of ssh://srosse@office.frentix.com/home/srosse/repositories/OpenOLAT.git into OpenOLAT_14.2
parents 32a8e684 ca98dc2e
No related branches found
No related tags found
No related merge requests found
Showing with 167 additions and 10 deletions
...@@ -34,6 +34,8 @@ import org.olat.modules.forms.model.jpa.EvaluationFormResponses; ...@@ -34,6 +34,8 @@ import org.olat.modules.forms.model.jpa.EvaluationFormResponses;
import org.olat.modules.forms.model.xml.AbstractElement; import org.olat.modules.forms.model.xml.AbstractElement;
import org.olat.modules.forms.model.xml.Form; import org.olat.modules.forms.model.xml.Form;
import org.olat.modules.forms.model.xml.Rubric; import org.olat.modules.forms.model.xml.Rubric;
import org.olat.modules.forms.ui.model.CountRatioResult;
import org.olat.modules.forms.ui.model.CountResult;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryRef; import org.olat.repository.RepositoryEntryRef;
...@@ -235,5 +237,7 @@ public interface EvaluationFormManager { ...@@ -235,5 +237,7 @@ public interface EvaluationFormManager {
public RubricStatistic getRubricStatistic(Rubric rubric, SlidersStatistic slidersStatistic); public RubricStatistic getRubricStatistic(Rubric rubric, SlidersStatistic slidersStatistic);
public RubricRating getRubricRating(Rubric rubric, Double value); public RubricRating getRubricRating(Rubric rubric, Double value);
public List<CountRatioResult> calculateRatio(List<CountResult> countResults);
} }
...@@ -76,6 +76,8 @@ import org.olat.modules.forms.model.xml.Form; ...@@ -76,6 +76,8 @@ import org.olat.modules.forms.model.xml.Form;
import org.olat.modules.forms.model.xml.FormXStream; import org.olat.modules.forms.model.xml.FormXStream;
import org.olat.modules.forms.model.xml.Rubric; import org.olat.modules.forms.model.xml.Rubric;
import org.olat.modules.forms.model.xml.Slider; import org.olat.modules.forms.model.xml.Slider;
import org.olat.modules.forms.ui.model.CountRatioResult;
import org.olat.modules.forms.ui.model.CountResult;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryRef; import org.olat.repository.RepositoryEntryRef;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -580,4 +582,19 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager { ...@@ -580,4 +582,19 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager {
public RubricRating getRubricRating(Rubric rubric, Double value) { public RubricRating getRubricRating(Rubric rubric, Double value) {
return RubricRatingEvaluator.rate(rubric, value); return RubricRatingEvaluator.rate(rubric, value);
} }
@Override
public List<CountRatioResult> calculateRatio(List<CountResult> countResults) {
if (countResults == null || countResults.isEmpty()) return new ArrayList<>(0);
long sum = countResults.stream().mapToLong(CountResult::getCount).sum();
if (sum == 0) return new ArrayList<>(0);
List<CountRatioResult> ratios = new ArrayList<>(countResults.size());
for (CountResult countResult : countResults) {
double ratio = (double)countResult.getCount() / sum;
ratios.add(new CountRatioResult(countResult, ratio));
}
return ratios;
}
} }
...@@ -27,7 +27,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSorta ...@@ -27,7 +27,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSorta
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; 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.SortableFlexiTableDataModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
import org.olat.modules.forms.ui.model.CountResult; import org.olat.modules.forms.ui.model.CountRatioResult;
/** /**
* *
...@@ -35,8 +35,8 @@ import org.olat.modules.forms.ui.model.CountResult; ...@@ -35,8 +35,8 @@ import org.olat.modules.forms.ui.model.CountResult;
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
* *
*/ */
public class CountDataModel extends DefaultFlexiTableDataModel<CountResult> public class CountDataModel extends DefaultFlexiTableDataModel<CountRatioResult>
implements SortableFlexiTableDataModel<CountResult> { implements SortableFlexiTableDataModel<CountRatioResult> {
public CountDataModel(FlexiTableColumnModel columnsModel) { public CountDataModel(FlexiTableColumnModel columnsModel) {
super(columnsModel); super(columnsModel);
...@@ -44,33 +44,35 @@ implements SortableFlexiTableDataModel<CountResult> { ...@@ -44,33 +44,35 @@ implements SortableFlexiTableDataModel<CountResult> {
@Override @Override
public void sort(SortKey orderBy) { public void sort(SortKey orderBy) {
List<CountResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort(); List<CountRatioResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort();
super.setObjects(rows); super.setObjects(rows);
} }
@Override @Override
public Object getValueAt(int row, int col) { public Object getValueAt(int row, int col) {
CountResult countResult = getObject(row); CountRatioResult countResult = getObject(row);
return getValueAt(countResult, col); return getValueAt(countResult, col);
} }
@Override @Override
public Object getValueAt(CountResult row, int col) { public Object getValueAt(CountRatioResult row, int col) {
switch(CountReportCols.values()[col]) { switch(CountReportCols.values()[col]) {
case name: return row.getName(); case name: return row.getName();
case count: return row.getCount(); case count: return row.getCount();
case percent: return row.getRatio();
default: return null; default: return null;
} }
} }
@Override @Override
public DefaultFlexiTableDataModel<CountResult> createCopyWithEmptyList() { public DefaultFlexiTableDataModel<CountRatioResult> createCopyWithEmptyList() {
return new CountDataModel(getTableColumnModel()); return new CountDataModel(getTableColumnModel());
} }
public enum CountReportCols implements FlexiSortableColumnDef { public enum CountReportCols implements FlexiSortableColumnDef {
name("report.count.name.title"), name("report.count.name.title"),
count("report.count.count.title"); count("report.count.count.title"),
percent("report.count.percent.title");
private final String i18nKey; private final String i18nKey;
......
...@@ -19,18 +19,25 @@ ...@@ -19,18 +19,25 @@
*/ */
package org.olat.modules.forms.ui; package org.olat.modules.forms.ui;
import java.util.List;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItemContainer; 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.FlexiTableElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; 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.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.util.CodeHelper; import org.olat.core.util.CodeHelper;
import org.olat.modules.forms.EvaluationFormManager;
import org.olat.modules.forms.ui.CountDataModel.CountReportCols; import org.olat.modules.forms.ui.CountDataModel.CountReportCols;
import org.olat.modules.forms.ui.component.PercentCellRenderer;
import org.olat.modules.forms.ui.model.CountDataSource; import org.olat.modules.forms.ui.model.CountDataSource;
import org.olat.modules.forms.ui.model.CountRatioResult;
import org.springframework.beans.factory.annotation.Autowired;
/** /**
* *
...@@ -41,6 +48,9 @@ import org.olat.modules.forms.ui.model.CountDataSource; ...@@ -41,6 +48,9 @@ import org.olat.modules.forms.ui.model.CountDataSource;
public class CountTableController extends FormBasicController { public class CountTableController extends FormBasicController {
private final CountDataSource dataSource; private final CountDataSource dataSource;
@Autowired
private EvaluationFormManager evaluationFormManager;
public CountTableController(UserRequest ureq, WindowControl wControl, CountDataSource dataSource) { public CountTableController(UserRequest ureq, WindowControl wControl, CountDataSource dataSource) {
super(ureq, wControl, LAYOUT_HORIZONTAL); super(ureq, wControl, LAYOUT_HORIZONTAL);
...@@ -52,10 +62,19 @@ public class CountTableController extends FormBasicController { ...@@ -52,10 +62,19 @@ public class CountTableController extends FormBasicController {
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.name)); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.name));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.count)); DefaultFlexiColumnModel countModel = new DefaultFlexiColumnModel(CountReportCols.count);
countModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
countModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
columnsModel.addFlexiColumnModel(countModel);
DefaultFlexiColumnModel percentModel = new DefaultFlexiColumnModel(CountReportCols.percent, new PercentCellRenderer());
percentModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
percentModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
columnsModel.addFlexiColumnModel(percentModel);
CountDataModel dataModel = new CountDataModel(columnsModel); CountDataModel dataModel = new CountDataModel(columnsModel);
dataModel.setObjects(dataSource.getResponses());
List<CountRatioResult> calculateRatio = evaluationFormManager.calculateRatio(dataSource.getResponses());
dataModel.setObjects(calculateRatio);
FlexiTableElement tableEl = uifactory.addTableElement(getWindowControl(), FlexiTableElement tableEl = uifactory.addTableElement(getWindowControl(),
"counts" + CodeHelper.getRAMUniqueID(), dataModel, getTranslator(), formLayout); "counts" + CodeHelper.getRAMUniqueID(), dataModel, getTranslator(), formLayout);
tableEl.setNumOfRowsEnabled(false); tableEl.setNumOfRowsEnabled(false);
......
...@@ -67,6 +67,7 @@ no.response=Keine Antwort m\u00F6glich ...@@ -67,6 +67,7 @@ no.response=Keine Antwort m\u00F6glich
report.anonymous.user=Anonym report.anonymous.user=Anonym
report.count.count.title=Anzahl report.count.count.title=Anzahl
report.count.name.title=Wert report.count.name.title=Wert
report.count.percent.title=%
report.excel.legend=Legende report.excel.legend=Legende
report.excel.text=Text report.excel.text=Text
report.export=Export Excel report.export=Export Excel
......
...@@ -66,6 +66,7 @@ no.response=No answer ...@@ -66,6 +66,7 @@ no.response=No answer
report.anonymous.user=Anonymous report.anonymous.user=Anonymous
report.count.count.title=Count report.count.count.title=Count
report.count.name.title=Value report.count.name.title=Value
report.count.percent.title=%
report.excel.legend=Legend report.excel.legend=Legend
report.excel.text=Text report.excel.text=Text
report.export=Export Excel report.export=Export Excel
......
/**
* <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.forms.ui.component;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.translator.Translator;
/**
*
* Initial date: 05.02.2020<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class PercentCellRenderer implements FlexiCellRenderer {
@Override
public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source,
URLBuilder ubu, Translator translator) {
if(cellValue instanceof Double) {
double percent = ((Double)cellValue).doubleValue() * 100.0d;
long rounded = Math.round(percent);
target.append(rounded).append("%");
}
}
}
/**
* <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.forms.ui.model;
/**
*
* Initial date: 5 Feb 2020<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class CountRatioResult extends CountResult {
private final Double ratio;
public CountRatioResult(CountResult countResult, Double ratio) {
super(countResult.getName(), countResult.getCount());
this.ratio = ratio;
}
public Double getRatio() {
return ratio;
}
}
...@@ -27,6 +27,11 @@ import static org.mockito.Mockito.never; ...@@ -27,6 +27,11 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
...@@ -39,6 +44,8 @@ import org.olat.modules.forms.EvaluationFormSessionStatus; ...@@ -39,6 +44,8 @@ import org.olat.modules.forms.EvaluationFormSessionStatus;
import org.olat.modules.forms.EvaluationFormSurvey; import org.olat.modules.forms.EvaluationFormSurvey;
import org.olat.modules.forms.RubricRating; import org.olat.modules.forms.RubricRating;
import org.olat.modules.forms.model.xml.Rubric; import org.olat.modules.forms.model.xml.Rubric;
import org.olat.modules.forms.ui.model.CountRatioResult;
import org.olat.modules.forms.ui.model.CountResult;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
/** /**
...@@ -284,6 +291,25 @@ public class EvaluationFormMangerImplTest { ...@@ -284,6 +291,25 @@ public class EvaluationFormMangerImplTest {
assertThat(rating).isEqualTo(expectedRating); assertThat(rating).isEqualTo(expectedRating);
} }
@Test
public void shouldCalculateRatioList() {
List<CountResult> countResults = new ArrayList<>();
countResults.add(new CountResult("1", 5));
countResults.add(new CountResult("2", 5));
countResults.add(new CountResult("3", 10));
countResults.add(new CountResult("4", 0));
List<CountRatioResult> ratios = sut.calculateRatio(countResults);
Map<String, Double> percentMap = ratios.stream()
.collect(Collectors.toMap(CountRatioResult::getName, CountRatioResult::getRatio));
assertThat(percentMap.get("1")).isEqualTo(0.25);
assertThat(percentMap.get("2")).isEqualTo(0.25);
assertThat(percentMap.get("3")).isEqualTo(0.5);
assertThat(percentMap.get("4")).isEqualTo(0);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment