diff --git a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java index 6c3502456478724a6705add2c236e9d0536fae03..922a6bf5fe1ea54eae4306b684cdb813c73a4887 100644 --- a/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java +++ b/src/main/java/org/olat/course/nodes/livestream/manager/LiveStreamLaunchDAO.java @@ -22,9 +22,12 @@ package org.olat.course.nodes.livestream.manager; import java.util.Date; import java.util.List; +import javax.persistence.TypedQuery; + import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.QueryBuilder; import org.olat.core.id.Identity; +import org.olat.core.util.StringHelper; import org.olat.course.nodes.livestream.Launch; import org.olat.course.nodes.livestream.model.LaunchImpl; import org.olat.repository.RepositoryEntry; @@ -60,17 +63,21 @@ public class LiveStreamLaunchDAO { sb.append("select count(distinct launch.identity.key)"); sb.append(" from livestreamlaunch launch"); sb.and().append("launch.courseEntry.key = :courseEntryKey"); - sb.and().append("launch.subIdent = :subIdent"); sb.and().append("launch.launchDate >= :from"); sb.and().append("launch.launchDate <= :to"); + if (StringHelper.containsNonWhitespace(subIdent)) { + sb.and().append("launch.subIdent = :subIdent"); + } - List<Long> counts = dbInstance.getCurrentEntityManager() + TypedQuery<Long> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Long.class) .setParameter("courseEntryKey", courseEntry.getKey()) - .setParameter("subIdent", subIdent) .setParameter("from", from) - .setParameter("to", to) - .getResultList(); + .setParameter("to", to); + if (StringHelper.containsNonWhitespace(subIdent)) { + query.setParameter("subIdent", subIdent); + } + List<Long> counts = query.getResultList(); return !counts.isEmpty()? counts.get(0): null; } diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java index 7b4daec2c73188122ca45c28595a1003d6f85200..da0af44234856e994be8dc08d75a553c1242f57f 100644 --- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java +++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamEventDataModel.java @@ -19,11 +19,15 @@ */ package org.olat.course.nodes.livestream.ui; +import java.util.List; import java.util.Locale; +import org.olat.core.commons.persistence.SortKey; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; -import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnDef; +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.SortableFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; /** * @@ -31,7 +35,8 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com * */ -public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStreamEventRow> { +public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStreamEventRow> + implements SortableFlexiTableDataModel<LiveStreamEventRow> { private final Locale locale; @@ -39,6 +44,13 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr super(columnsModel); this.locale = locale; } + + @Override + public void sort(SortKey orderBy) { + SortableFlexiTableModelDelegate<LiveStreamEventRow> sorter = new SortableFlexiTableModelDelegate<>(orderBy, this, null); + List<LiveStreamEventRow> rows = sorter.sort(); + super.setObjects(rows); + } @Override public Object getValueAt(int row, int col) { @@ -46,6 +58,7 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr return getValueAt(reason, col); } + @Override public Object getValueAt(LiveStreamEventRow row, int col) { switch(EventCols.values()[col]) { case begin: return row.getEvent().getBegin(); @@ -63,7 +76,7 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr return new LiveStreamEventDataModel(getTableColumnModel(), locale); } - public enum EventCols implements FlexiColumnDef { + public enum EventCols implements FlexiSortableColumnDef { subject("table.header.subject"), begin("table.header.begin"), end("table.header.end"), @@ -81,5 +94,15 @@ public class LiveStreamEventDataModel extends DefaultFlexiTableDataModel<LiveStr public String i18nHeaderKey() { return i18nKey; } + + @Override + public boolean sortable() { + return true; + } + + @Override + public String sortKey() { + return name(); + } } } diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java index 6e3997f5a212fe4b041847b2096cdaae55852b0d..9279f5a29047cfbefc7451f1715b66947ed9f5b0 100644 --- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java +++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamListController.java @@ -97,6 +97,7 @@ public class LiveStreamListController extends FormBasicController { for (LiveStreamEvent liveStreamEvent : upcomingEvents) { rows.add(new LiveStreamEventRow(liveStreamEvent)); } + // ascending Collections.sort(rows, (e1, e2) -> e1.getEvent().getBegin().compareTo(e2.getEvent().getBegin())); dataModel.setObjects(rows); tableEl.reset(false, false, true); diff --git a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java index d8b33f2f5f6f5e06f709239b89444d24a0edb215..47c96e70536338175495c0c08fc7edad484d19c3 100644 --- a/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java +++ b/src/main/java/org/olat/course/nodes/livestream/ui/LiveStreamStatisticController.java @@ -101,12 +101,13 @@ public class LiveStreamStatisticController extends FormBasicController { List<LiveStreamEventRow> rows = new ArrayList<>(upcomingEvents.size()); for (LiveStreamEvent liveStreamEvent : upcomingEvents) { LiveStreamEventRow row = new LiveStreamEventRow(liveStreamEvent); - Long viewers = liveStreamService.getLaunchers(courseEntry, courseNodeIdent, liveStreamEvent.getBegin(), + Long viewers = liveStreamService.getLaunchers(courseEntry, null, liveStreamEvent.getBegin(), liveStreamEvent.getEnd()); row.setViewers(viewers); rows.add(row); } - Collections.sort(rows, (e1, e2) -> e1.getEvent().getBegin().compareTo(e2.getEvent().getBegin())); + // descending + Collections.sort(rows, (e1, e2) -> e2.getEvent().getBegin().compareTo(e1.getEvent().getBegin())); dataModel.setObjects(rows); tableEl.reset(false, false, true); }