diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java index a197408fed316515775b48f8f5918c2774a6c298..b75bc99ac9d33bdf4da15fab521fbaf8394d28a9 100644 --- a/src/main/java/org/olat/admin/user/UserAdminController.java +++ b/src/main/java/org/olat/admin/user/UserAdminController.java @@ -361,7 +361,7 @@ public class UserAdminController extends BasicController implements Activateable } if(lectureModule.isEnabled()) { - lecturesCtrl = new ParticipantLecturesOverviewController(ureq, getWindowControl(), identity, true, true); + lecturesCtrl = new ParticipantLecturesOverviewController(ureq, getWindowControl(), identity, true, true, true); listenTo(lecturesCtrl); BreadcrumbedStackedPanel stackPanel = new BreadcrumbedStackedPanel("lectures", getTranslator(), lecturesCtrl); stackPanel.pushController(translate(NLS_VIEW_LECTURES), lecturesCtrl); diff --git a/src/main/java/org/olat/modules/lecture/LectureService.java b/src/main/java/org/olat/modules/lecture/LectureService.java index 2053c39050846b309876f3ca5fcdbf6eb0cd72a1..e5a80313b2a4d7ed5c4db84243f3788f85409eb3 100644 --- a/src/main/java/org/olat/modules/lecture/LectureService.java +++ b/src/main/java/org/olat/modules/lecture/LectureService.java @@ -281,6 +281,13 @@ public interface LectureService { * @return */ public List<LectureBlockWithTeachers> getLectureBlocksWithTeachers(RepositoryEntryRef entry, IdentityRef teacher); + + /** + * The list of lecture blocks of a specific teacher + * @param teacher The teacher to search with. + * @return A list of lecture blocks. + */ + public List<LectureBlock> getLectureBlocks(IdentityRef teacher); /** * Returns the lecture block for the specified learning resource diff --git a/src/main/java/org/olat/modules/lecture/_spring/lectureContext.xml b/src/main/java/org/olat/modules/lecture/_spring/lectureContext.xml index 99b57b928370521d742d54eff1581ef906c47719..f76a74dbe3f3ca499da47904ef9b55d42acdf87d 100644 --- a/src/main/java/org/olat/modules/lecture/_spring/lectureContext.xml +++ b/src/main/java/org/olat/modules/lecture/_spring/lectureContext.xml @@ -35,7 +35,7 @@ <property name="iconCssClass" value="o_icon o_icon-fw o_icon_lecture" /> <property name="actionController"> <bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype"> - <property name="className" value="org.olat.modules.lecture.ui.ParticipantLecturesOverviewController"/> + <property name="className" value="org.olat.modules.lecture.ui.LecturesToolController"/> </bean> </property> <property name="securityCallbackClassName" value="org.olat.core.extensions.security.UserOnlyExtensionSecurityCallback" /> diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java index f6785892b07395754ff0378f9dfbbc541de92028..6c6a7f43478a7a0198234ad3ac1fcc02b7bd1223 100644 --- a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java +++ b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java @@ -107,6 +107,21 @@ public class LectureBlockDAO { return blocks; } + public List<LectureBlock> loadByTeacher(IdentityRef identityRef) { + StringBuilder sb = new StringBuilder(); + sb.append("select block from lectureblock block") + .append(" inner join block.teacherGroup tGroup") + .append(" inner join tGroup.members membership") + .append(" inner join fetch block.entry entry") + .append(" where membership.identity.key=:teacherKey"); + + List<LectureBlock> blocks = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), LectureBlock.class) + .setParameter("teacherKey", identityRef.getKey()) + .getResultList(); + return blocks; + } + /** * Delete the relation to group, the roll call, the reminders and at the * end the lecture block itself. diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java b/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java index 6c507950cb97c6384aaa7c4bb5b8a357ff2ef8b8..9d1393427af286778c1573d377547691df387372 100644 --- a/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java +++ b/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java @@ -503,6 +503,11 @@ public class LectureServiceImpl implements LectureService, UserDataDeletable { public List<LectureBlock> getLectureBlocks(RepositoryEntryRef entry) { return lectureBlockDao.loadByEntry(entry); } + + @Override + public List<LectureBlock> getLectureBlocks(IdentityRef teacher) { + return lectureBlockDao.loadByTeacher(teacher); + } @Override public List<LectureBlockWithTeachers> getLectureBlocksWithTeachers(RepositoryEntryRef entry) { diff --git a/src/main/java/org/olat/modules/lecture/model/LectureBlockRow.java b/src/main/java/org/olat/modules/lecture/model/LectureBlockRow.java index 27f4e1bd7746e6331787c91d51382e0409b5f79d..ee66fa1dd3ddbc0872ee96a429103c1c54853732 100644 --- a/src/main/java/org/olat/modules/lecture/model/LectureBlockRow.java +++ b/src/main/java/org/olat/modules/lecture/model/LectureBlockRow.java @@ -33,14 +33,16 @@ public class LectureBlockRow implements LectureBlockRef { private final String teachers; private final boolean iamTeacher; + private final String entryDisplayname; private final LectureBlock lectureBlock; private FormLink toolsLink; - public LectureBlockRow(LectureBlock lectureBlock, String teachers, boolean iamTeacher) { + public LectureBlockRow(LectureBlock lectureBlock, String entryDisplayname, String teachers, boolean iamTeacher) { this.lectureBlock = lectureBlock; this.teachers = teachers; this.iamTeacher = iamTeacher; + this.entryDisplayname = entryDisplayname; } @Override @@ -51,6 +53,10 @@ public class LectureBlockRow implements LectureBlockRef { public boolean isIamTeacher() { return iamTeacher; } + + public String getEntryDisplayname() { + return entryDisplayname; + } public LectureBlock getLectureBlock() { return lectureBlock; diff --git a/src/main/java/org/olat/modules/lecture/ui/LectureListRepositoryController.java b/src/main/java/org/olat/modules/lecture/ui/LectureListRepositoryController.java index deee95d5e7682c2efd78cd320439d6b78fdf498c..4ccae590e057841f26fca1216a9d6f84884a0cc8 100644 --- a/src/main/java/org/olat/modules/lecture/ui/LectureListRepositoryController.java +++ b/src/main/java/org/olat/modules/lecture/ui/LectureListRepositoryController.java @@ -158,7 +158,7 @@ public class LectureListRepositoryController extends FormBasicController { teachers.append(userManager.getUserDisplayName(teacher)); } - LectureBlockRow row = new LectureBlockRow(b, teachers.toString(), false); + LectureBlockRow row = new LectureBlockRow(b, entry.getDisplayname(), teachers.toString(), false); rows.add(row); String linkName = "tools-" + counter++; diff --git a/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java b/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java new file mode 100644 index 0000000000000000000000000000000000000000..3d23e932a726f35e3829876c18e25447066305f4 --- /dev/null +++ b/src/main/java/org/olat/modules/lecture/ui/LecturesToolController.java @@ -0,0 +1,110 @@ +/** + * <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.lecture.ui; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.segmentedview.SegmentViewComponent; +import org.olat.core.gui.components.segmentedview.SegmentViewEvent; +import org.olat.core.gui.components.segmentedview.SegmentViewFactory; +import org.olat.core.gui.components.stack.BreadcrumbPanel; +import org.olat.core.gui.components.stack.BreadcrumbPanelAware; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; + +/** + * + * Initial date: 13 juin 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LecturesToolController extends BasicController implements BreadcrumbPanelAware { + + private final VelocityContainer mainVC; + private SegmentViewComponent segmentView; + private Link teacherLink, participantLink; + + private final TeacherToolOverviewController teacherOverviewCtrl; + private final ParticipantLecturesOverviewController participantOverviewCtrl; + + public LecturesToolController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl); + + mainVC = createVelocityContainer("user_tool"); + + teacherOverviewCtrl = new TeacherToolOverviewController(ureq, getWindowControl()); + listenTo(teacherOverviewCtrl); + boolean withTitle = teacherOverviewCtrl.getRowCount() == 0; + participantOverviewCtrl = new ParticipantLecturesOverviewController(ureq, getWindowControl(), withTitle); + listenTo(participantOverviewCtrl); + + if(teacherOverviewCtrl.getRowCount() > 0 && participantOverviewCtrl.getRowCount() > 0) { + segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); + teacherLink = LinkFactory.createLink("tool.teacher", mainVC, this); + segmentView.addSegment(teacherLink, true); + participantLink = LinkFactory.createLink("tool.participant", mainVC, this); + segmentView.addSegment(participantLink, false); + mainVC.put("segmentCmp", teacherOverviewCtrl.getInitialComponent()); + } else if(teacherOverviewCtrl.getRowCount() > 0) { + mainVC.put("teacherView", teacherOverviewCtrl.getInitialComponent()); + } else if(participantOverviewCtrl.getRowCount() > 0) { + mainVC.put("participantView", participantOverviewCtrl.getInitialComponent()); + } else { + + } + putInitialPanel(mainVC); + } + + @Override + public void setBreadcrumbPanel(BreadcrumbPanel stackPanel) { + participantOverviewCtrl.setBreadcrumbPanel(stackPanel); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if(event instanceof SegmentViewEvent) { + SegmentViewEvent sve = (SegmentViewEvent)event; + String segmentCName = sve.getComponentName(); + Component clickedLink = mainVC.getComponent(segmentCName); + if (clickedLink == teacherLink) { + doOpenTeacherView(); + } else if (clickedLink == participantLink) { + doOpenParticipantView(); + } + } + } + + private void doOpenTeacherView() { + mainVC.put("segmentCmp", teacherOverviewCtrl.getInitialComponent()); + } + + private void doOpenParticipantView() { + mainVC.put("segmentCmp", participantOverviewCtrl.getInitialComponent()); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java index 599090c7d6c0de8b06dc50a83344d9bee7caf5eb..bfe99e553bbf8acd97a63d7c6d37aa1bb7844452 100644 --- a/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java +++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantLecturesOverviewController.java @@ -69,6 +69,7 @@ public class ParticipantLecturesOverviewController extends FormBasicController i private ParticipantLecturesDataModel tableModel; private final boolean withPrint; + private final boolean withTitle; private final boolean withSelect; private final Identity assessedIdentity; private ParticipantLectureBlocksController lectureBlocksCtrl; @@ -82,14 +83,15 @@ public class ParticipantLecturesOverviewController extends FormBasicController i @Autowired private RepositoryService repositoryService; - public ParticipantLecturesOverviewController(UserRequest ureq, WindowControl wControl) { - this(ureq, wControl, ureq.getIdentity(), true, true); + public ParticipantLecturesOverviewController(UserRequest ureq, WindowControl wControl, boolean withTitle) { + this(ureq, wControl, ureq.getIdentity(), true, true, withTitle); } public ParticipantLecturesOverviewController(UserRequest ureq, WindowControl wControl, - Identity assessedIdentity, boolean withPrint, boolean withSelect) { + Identity assessedIdentity, boolean withPrint, boolean withSelect, boolean withTitle) { super(ureq, wControl, "participant_overview"); this.withPrint = withPrint; + this.withTitle = withTitle; this.withSelect = withSelect; this.assessedIdentity = assessedIdentity; initForm(ureq); @@ -100,6 +102,10 @@ public class ParticipantLecturesOverviewController extends FormBasicController i public void setBreadcrumbPanel(BreadcrumbPanel stackPanel) { this.stackPanel = stackPanel; } + + public int getRowCount() { + return tableModel.getRowCount(); + } @Override protected void doDispose() { @@ -113,8 +119,10 @@ public class ParticipantLecturesOverviewController extends FormBasicController i layoutCont.contextPut("winid", "w" + layoutCont.getFormItemComponent().getDispatchID()); layoutCont.getFormItemComponent().addListener(this); layoutCont.getFormItemComponent().contextPut("withPrint", Boolean.TRUE); - setFormTitle("menu.my.lectures.alt"); - } else { + if(withTitle) { + setFormTitle("menu.my.lectures.alt"); + } + } else if(withTitle) { setFormTitle("lectures.print.title", new String[]{ StringHelper.escapeHtml(userManager.getUserDisplayName(assessedIdentity)) }); @@ -148,6 +156,10 @@ public class ParticipantLecturesOverviewController extends FormBasicController i tableModel.setObjects(statistics); tableEl.reset(true, true, true); } + + public boolean hasRows() { + return tableModel.getRowCount() > 0; + } @Override public void event(UserRequest ureq, Component source, Event event) { @@ -193,7 +205,7 @@ public class ParticipantLecturesOverviewController extends FormBasicController i @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { lwControl.getWindowBackOffice().getChiefController().addBodyCssClass("o_lectures_print"); - Controller printCtrl = new ParticipantLecturesOverviewController(lureq, lwControl, assessedIdentity, false, false); + Controller printCtrl = new ParticipantLecturesOverviewController(lureq, lwControl, assessedIdentity, false, false, true); listenTo(printCtrl); return printCtrl; } diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewController.java index 05d96b655ca4803ab54cc120ec950e0bd8da397a..133eaa87e09d7b9e8f66d06a8d8d38adc6d1408d 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewController.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewController.java @@ -166,7 +166,7 @@ public class TeacherOverviewController extends BasicController implements Tooled teachers.append(userManager.getUserDisplayName(teacher)); } - LectureBlockRow row = new LectureBlockRow(block, teachers.toString(), teacherList.contains(getIdentity())); + LectureBlockRow row = new LectureBlockRow(block, entry.getDisplayname(), teachers.toString(), teacherList.contains(getIdentity())); if(canStartRollCall(blockWithTeachers)) { startButton.setVisible(true); startButton.setUserObject(block); diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewDataModel.java b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewDataModel.java index cc2b965e3eb7e5ce383fef9c4cdc1551ad5c9ac8..615d270f60d6d929d3e1d66094f2fd730d5982ce 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewDataModel.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewDataModel.java @@ -65,6 +65,7 @@ public class TeacherOverviewDataModel extends DefaultFlexiTableDataModel<Lecture case date: return row.getLectureBlock().getStartDate(); case startTime: return row.getLectureBlock().getStartDate(); case endTime: return row.getLectureBlock().getEndDate(); + case entry: return row.getEntryDisplayname(); case lectureBlock: return row.getLectureBlock().getTitle(); case teachers: return row.getTeachers(); case location: return row.getLectureBlock().getLocation(); @@ -91,6 +92,7 @@ public class TeacherOverviewDataModel extends DefaultFlexiTableDataModel<Lecture date("table.header.date"), startTime("table.header.start.time"), endTime("table.header.end.time"), + entry("table.header.entry"), lectureBlock("table.header.lecture.block"), location("table.header.location"), teachers("table.header.teachers"), diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherToolLecturesTableController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherToolLecturesTableController.java new file mode 100644 index 0000000000000000000000000000000000000000..3445773d4ee2b3f53f6a9cb0ac557da93ca8df23 --- /dev/null +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherToolLecturesTableController.java @@ -0,0 +1,126 @@ +/** + * <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.lecture.ui; + +import java.util.List; + +import org.olat.NewControllerFactory; +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.UserRequest; +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.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DateFlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +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.SelectionEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.TimeFlexiCellRenderer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.modules.lecture.model.LectureBlockRow; +import org.olat.modules.lecture.ui.TeacherOverviewDataModel.TeachCols; +import org.olat.modules.lecture.ui.component.LectureBlockStatusCellRenderer; + +/** + * + * Initial date: 13 juin 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class TeacherToolLecturesTableController extends FormBasicController { + + private FlexiTableElement tableEl; + private TeacherOverviewDataModel tableModel; + + private final String emptyI18nKey; + + public TeacherToolLecturesTableController(UserRequest ureq, WindowControl wControl, String emptyI18nKey) { + super(ureq, wControl, "teacher_view_table"); + this.emptyI18nKey = emptyI18nKey; + initForm(ureq); + } + + public int getRowCount() { + return tableModel.getRowCount(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.date, new DateFlexiCellRenderer(getLocale()))); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.startTime, new TimeFlexiCellRenderer(getLocale()))); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.endTime, new TimeFlexiCellRenderer(getLocale()))); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.entry, "open.course")); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.lectureBlock)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.location)); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TeachCols.status, new LectureBlockStatusCellRenderer(getTranslator()))); + + tableModel = new TeacherOverviewDataModel(columnsModel, getLocale()); + tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout); + + FlexiTableSortOptions sortOptions = new FlexiTableSortOptions(); + sortOptions.setDefaultOrderBy(new SortKey(TeachCols.date.name(), false)); + tableEl.setSortSettings(sortOptions); + tableEl.setCustomizeColumns(false); + tableEl.setNumOfRowsEnabled(false); + tableEl.setEmtpyTableMessageKey(emptyI18nKey); + //TODO absence tableEl.setAndLoadPersistedPreferences(ureq, "lecture-teacher-overview"); + } + + protected void loadModel(List<LectureBlockRow> blocks) { + tableModel.setObjects(blocks); + tableEl.reset(true, true, true); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == tableEl) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + String cmd = se.getCommand(); + LectureBlockRow row = tableModel.getObject(se.getIndex()); + if("open.course".equals(cmd)) { + doOpenCourse(ureq, row); + } + } + } + super.formInnerEvent(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + private void doOpenCourse(UserRequest ureq, LectureBlockRow row) { + Long repoKey = row.getLectureBlock().getEntry().getKey(); + String businessPath = "[RepositoryEntry:" + repoKey + "]"; + NewControllerFactory.getInstance().launch(businessPath, ureq, getWindowControl()); + } +} diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherToolOverviewController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherToolOverviewController.java new file mode 100644 index 0000000000000000000000000000000000000000..191ed5095942820efb8d7eb8214b9699fbba58c1 --- /dev/null +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherToolOverviewController.java @@ -0,0 +1,138 @@ +/** + * <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.lecture.ui; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; +import org.olat.modules.lecture.LectureBlock; +import org.olat.modules.lecture.LectureRollCallStatus; +import org.olat.modules.lecture.LectureService; +import org.olat.modules.lecture.model.LectureBlockRow; +import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 13 juin 2017<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class TeacherToolOverviewController extends BasicController { + + private final VelocityContainer mainVC; + + private TeacherToolLecturesTableController currentLecturesBlockCtrl; + private TeacherToolLecturesTableController pendingLecturesBlockCtrl; + private TeacherToolLecturesTableController nextLecturesBlockCtrl; + private TeacherToolLecturesTableController closedLecturesBlockCtrl; + + @Autowired + private LectureService lectureService; + + public TeacherToolOverviewController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl); + + mainVC = createVelocityContainer("teacher_view"); + + currentLecturesBlockCtrl = new TeacherToolLecturesTableController(ureq, getWindowControl(), "empty.table.current.lectures.blocks"); + listenTo(currentLecturesBlockCtrl); + mainVC.put("currentLectures", currentLecturesBlockCtrl.getInitialComponent()); + pendingLecturesBlockCtrl = new TeacherToolLecturesTableController(ureq, getWindowControl(), "empty.table.lectures.blocks"); + listenTo(pendingLecturesBlockCtrl); + mainVC.put("pendingLectures", pendingLecturesBlockCtrl.getInitialComponent()); + nextLecturesBlockCtrl = new TeacherToolLecturesTableController(ureq, getWindowControl(), "empty.table.lectures.blocks"); + listenTo(nextLecturesBlockCtrl); + mainVC.put("nextLectures", nextLecturesBlockCtrl.getInitialComponent()); + closedLecturesBlockCtrl = new TeacherToolLecturesTableController(ureq, getWindowControl(), "empty.table.lectures.blocks"); + listenTo(closedLecturesBlockCtrl); + mainVC.put("closedLectures", closedLecturesBlockCtrl.getInitialComponent()); + + loadModel(); + putInitialPanel(mainVC); + } + + public int getRowCount() { + return currentLecturesBlockCtrl.getRowCount() + pendingLecturesBlockCtrl.getRowCount() + + nextLecturesBlockCtrl.getRowCount() + closedLecturesBlockCtrl.getRowCount(); + } + + private void loadModel() { + List<LectureBlock> blocksWithTeachers = lectureService.getLectureBlocks(getIdentity()); + + //reset + List<LectureBlockRow> currentBlocks = new ArrayList<>(); + List<LectureBlockRow> pendingBlocks = new ArrayList<>(); + List<LectureBlockRow> nextBlocks = new ArrayList<>(); + List<LectureBlockRow> closedBlocks = new ArrayList<>(); + + // only show the start button if + Date now = new Date(); + for(LectureBlock block:blocksWithTeachers) { + RepositoryEntry entry = block.getEntry(); + LectureBlockRow row = new LectureBlockRow(block, entry.getDisplayname(), "", true); + if(canStartRollCall(block)) { + currentBlocks.add(row); + } else if(block.getRollCallStatus() == LectureRollCallStatus.closed || block.getRollCallStatus() == LectureRollCallStatus.autoclosed) { + closedBlocks.add(row); + } else if(block.getStartDate() != null && block.getStartDate().after(now)) { + nextBlocks.add(row); + } else { + pendingBlocks.add(row); + } + } + + currentLecturesBlockCtrl.loadModel(currentBlocks); + mainVC.contextPut("currentBlockSize", currentBlocks.size()); + pendingLecturesBlockCtrl.loadModel(pendingBlocks); + mainVC.contextPut("pendingBlockSize", pendingBlocks.size()); + nextLecturesBlockCtrl.loadModel(nextBlocks); + mainVC.contextPut("nextBlockSize", nextBlocks.size()); + closedLecturesBlockCtrl.loadModel(closedBlocks); + mainVC.contextPut("closedBlockSize", closedBlocks.size()); + } + + private boolean canStartRollCall(LectureBlock lectureBlock) { + Date start = lectureBlock.getStartDate(); + Date end = lectureBlock.getEndDate(); + Date now = new Date(); + if(start.compareTo(now) <= 0 && end.compareTo(now) >= 0) { + return true; + } + return false; + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + // + } +} diff --git a/src/main/java/org/olat/modules/lecture/ui/_content/participant_overview.html b/src/main/java/org/olat/modules/lecture/ui/_content/participant_overview.html index d2b5eb566fdde3bcd4af8ba33c087d26629b7a18..943411312d900190e7237b89b245ed67546b3331 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_content/participant_overview.html +++ b/src/main/java/org/olat/modules/lecture/ui/_content/participant_overview.html @@ -1,5 +1,7 @@ <fieldset> +#if($r.isNotEmpty($off_title)) <legend><i class="o_icon o_icon-fw o_icon_lecture"> </i> $off_title</legend> +#end #if($r.isNotNull($withPrint) && $withPrint) <div class="o_button_group o_button_group_right"> <script type="text/javascript"> diff --git a/src/main/java/org/olat/modules/lecture/ui/_content/user_tool.html b/src/main/java/org/olat/modules/lecture/ui/_content/user_tool.html new file mode 100644 index 0000000000000000000000000000000000000000..6d7afacca40a4245672207edcf44e56a226cc003 --- /dev/null +++ b/src/main/java/org/olat/modules/lecture/ui/_content/user_tool.html @@ -0,0 +1,14 @@ +#if($r.available("segments")) +<div class="o_lectures_overviewview clearfix"> + $r.render("segments") + #if($r.available("segmentCmp")) + <div class="o_segments_content">$r.render("segmentCmp")</div> + #end +</div> +#elseif($r.available("teacherView")) +<div class="o_lectures_teacher_view">$r.render("teacherView")</div> +#elseif($r.available("participantView")) +<div class="o_lectures_participant_view">$r.render("participantView")</div> +#else +<div class=o_info>$r.translate("info.no.lectures")</div> +#end diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties index efc4ac3d011f49a1c6596e9360ab475cc465088c..aa5cd9a9ffaf8799398734be4f12756b25d95b07 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties @@ -46,6 +46,7 @@ error.integer.positive=Der Eingabe muss ein positives Zahl sein. error.reason.mandatory=Begr\u00FCndung ist erforderlich first.admission=Erstzulassung form.managedflags.intro=Diese LektionBlock wurde von einem externen Werkzeug erstellt. Einige Einstellungen und Module k\u00F6nnen daher in OpenOLAT nicht ver\u00E4ndert und benutzt werden. Folgende Elemente sind in OpenOLAT gesperrt\: {0} +info.no.lectures=Sie folgen zur Zeit kein Lektionen lecture.absence.default.authorized=Absenzen per default entschuldigt lecture.admin.course.override.title=Konfiguration - Auf Kursebene \u00FCbersteuerbar lecture.admin.enabled=Lektionen- und Absenzenmanagement einschalten @@ -167,4 +168,6 @@ table.header.start.time=Von table.header.status=Status table.header.teachers=Dozenten table.header.username=Benutzername +tool.teacher=Als Dozent +tool.participant=Als Teilnehmer tools=Aktion diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties index 4042681adc788839fab7e60f78aa021791250e80..92bc3fa279e03b89bfff7b9633d3e46c992a8d59 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties @@ -46,6 +46,7 @@ error.integer.positive=The number must be positive. error.reason.mandatory=Reason is mandatory first.admission=First admission form.managedflags.intro=This lecture block has been created by an external tool. Therefore some settings and modules can not be modified and used within OpenOLAT. The following elements are blocked within OpenOLAT\: {0} +info.no.lectures=You don't follow any lectures for the moment. lecture.absence.default.authorized=Absence per default authorized lecture.admin.course.override.title=Configuration - can be override at course level lecture.admin.enabled=Enable lectures and absence management @@ -166,4 +167,6 @@ table.header.start.time=From table.header.status=Status table.header.teachers=Coaches table.header.username=Username +tool.teacher=As teacher +tool.participant=As participant tools=Action