Skip to content
Snippets Groups Projects
Commit 93efa541 authored by srosse's avatar srosse
Browse files

OO-1000: port back coaching tool

parent 09ea9aa4
No related branches found
No related tags found
No related merge requests found
Showing
with 1580 additions and 0 deletions
/**
* <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.coach.ui;
import java.util.Locale;
import org.olat.core.gui.components.table.CustomCssCellRenderer;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.translator.Translator;
import org.olat.modules.coach.ui.ProgressValue;
/**
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class ProgressRenderer extends CustomCssCellRenderer {
private final boolean neutral;
private final Translator translator;
public ProgressRenderer(boolean neutral, Translator translator) {
this.neutral = neutral;
this.translator = translator;
}
@Override
protected String getCssClass(Object val) {
return neutral ? "o_eff_statement_progress_neutral" : "o_eff_statement_rg";
}
@Override
public void render(StringOutput sb, Renderer renderer, Object val, Locale locale, int alignment, String action) {
if(renderer == null) {
ProgressValue progress = (ProgressValue)val;
int green = progress.getGreen();
int total = progress.getTotal();
sb.append(green).append(" / ").append(total);
} else {
super.render(sb, renderer, val, locale, alignment, action);
}
}
@Override
protected String getCellValue(Object val) {
StringBuilder sb = new StringBuilder();
if(val instanceof ProgressValue) {
ProgressValue progress = (ProgressValue)val;
int green = Math.round(100.0f * ((float)progress.getGreen() / (float)progress.getTotal()));
String[] values = new String[]{ Integer.toString(progress.getGreen()), Integer.toString(progress.getTotal()) };
String tooltip = translator.translate("tooltip.of", values);
sb.append("<div class='o_eff_statement_progress' ext:qtip='").append(tooltip).append("'>")
.append("<div class='o_eff_statement_solved' style='width: ").append(green).append("%;'/>")
.append("&#160;")
.append("</div>")
.append("</div>");
}
return sb.toString();
}
@Override
protected String getHoverText(Object val) {
return null;
}
}
/**
* <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.coach.ui;
import java.util.Locale;
import org.olat.core.gui.components.table.CustomCellRenderer;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.course.assessment.AssessmentHelper;
/**
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class ScoreCellRenderer implements CustomCellRenderer {
@Override
public void render(StringOutput sb, Renderer renderer, Object val, Locale locale, int alignment, String action) {
if(val instanceof Float) {
String score = AssessmentHelper.getRoundedScore((Float)val);
sb.append(score);
}
}
}
/**
* <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.coach.ui;
import java.util.ArrayList;
import java.util.List;
import org.olat.NewControllerFactory;
import org.olat.core.CoreSpringFactory;
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.table.BooleanColumnDescriptor;
import org.olat.core.gui.components.table.ColumnDescriptor;
import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.core.gui.components.table.TableEvent;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.text.TextComponent;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
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.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.dtabs.Activateable2;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.BusinessControl;
import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry;
import org.olat.core.util.StringHelper;
import org.olat.core.util.mail.ContactList;
import org.olat.core.util.mail.ContactMessage;
import org.olat.core.util.resource.OresHelper;
import org.olat.modules.co.ContactFormController;
import org.olat.modules.coach.CoachingService;
import org.olat.modules.coach.model.EfficiencyStatementEntry;
import org.olat.modules.coach.model.StudentStatEntry;
import org.olat.repository.RepositoryEntry;
import org.olat.user.UserManager;
import org.olat.modules.coach.ui.EfficiencyStatementEntryTableDataModel.Columns;
import org.olat.modules.coach.ui.ToolbarController.Position;
/**
*
* Description:<br>
* Overview of all students under the scrutiny of a coach.
*
* <P>
* Initial Date: 8 févr. 2012 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class StudentCoursesController extends BasicController implements Activateable2 {
private final Link backLink, next, previous;
private final Link nextStudent, previousStudent;
private final Link homeLink, contactLink;
private final TextComponent detailsCmp, detailsStudentCmp;
private final TableController tableCtr;
private final VelocityContainer mainVC;
private final VelocityContainer detailsVC;
private CloseableModalController cmc;
private ContactFormController contactCtrl;
private final ToolbarController toolbar;
private EfficiencyStatementDetailsController statementCtrl;
private boolean hasChanged = false;
private final Identity student;
private final StudentStatEntry statEntry;
private final UserManager userManager;
private final CoachingService coachingService;
public StudentCoursesController(UserRequest ureq, WindowControl wControl, StudentStatEntry statEntry, Identity student, int index, int numOfStudents) {
super(ureq, wControl);
this.student = student;
this.statEntry = statEntry;
coachingService = CoreSpringFactory.getImpl(CoachingService.class);
userManager = CoreSpringFactory.getImpl(UserManager.class);
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableConfig.setTableEmptyMessage(translate("error.no.found"));
tableConfig.setDownloadOffered(true);
tableConfig.setPreferencesOffered(true, "studentCourseListController");
tableCtr = new TableController(tableConfig, ureq, getWindowControl(), null, null, null, null, true, getTranslator());
tableCtr.addColumnDescriptor(false, new DefaultColumnDescriptor("student.name", Columns.studentName.ordinal(), "select", getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.course.name", Columns.repoName.ordinal(), "select", getLocale()));
tableCtr.addColumnDescriptor(new BooleanColumnDescriptor("table.header.passed", Columns.passed.ordinal(), translate("passed.true"), translate("passed.false")));
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.score", Columns.score.ordinal(), "select", getLocale(),
ColumnDescriptor.ALIGNMENT_RIGHT, new ScoreCellRenderer()));
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.progress", Columns.progress.ordinal(), null, getLocale(),
ColumnDescriptor.ALIGNMENT_LEFT, new ProgressRenderer(true, getTranslator())));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.lastScoreDate", Columns.lastModification.ordinal(), "select", getLocale()));
listenTo(tableCtr);
List<EfficiencyStatementEntry> statements = loadModel();
mainVC = createVelocityContainer("student_course_list");
detailsVC = createVelocityContainer("student_details");
String fullName = StringHelper.escapeHtml(userManager.getUserDisplayName(student));
detailsVC.contextPut("studentName", fullName);
mainVC.put("studentDetails", detailsVC);
mainVC.put("studentsTable", tableCtr.getInitialComponent());
toolbar = new ToolbarController(ureq, wControl, getTranslator());
listenTo(toolbar);
mainVC.put("toolbar", toolbar.getInitialComponent());
backLink = toolbar.addToolbarLink("back", this, Position.left);
backLink.setCustomEnabledLinkCSS("b_link_back");
previous = toolbar.addToolbarLink("previous.course", this, Position.center);
previous.setCustomEnabledLinkCSS("b_with_small_icon_left b_with_small_icon_only b_move_left_icon");
previous.setEnabled(statements.size() > 1);
detailsCmp = toolbar.addToolbarText("details", this, Position.center);
next = toolbar.addToolbarLink("next.course", this, Position.center);
next.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only b_move_right_icon");
next.setEnabled(statements.size() > 1);
//students next,previous
previousStudent = toolbar.addToolbarLink("previous.student", this, Position.center);
previousStudent.setCustomEnabledLinkCSS("b_with_small_icon_left b_with_small_icon_only b_move_left_icon");
previousStudent.setEnabled(numOfStudents > 1);
detailsStudentCmp = toolbar.addToolbarText("details.student", "", this, Position.center);
detailsStudentCmp.setText(translate("students.details", new String[]{
fullName, Integer.toString(index + 1), Integer.toString(numOfStudents)
}));
nextStudent = toolbar.addToolbarLink("next.student", this, Position.center);
nextStudent.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only b_move_right_icon");
nextStudent.setEnabled(numOfStudents > 1);
contactLink = LinkFactory.createButton("contact.link", detailsVC, this);
contactLink.setCustomEnabledLinkCSS("b_link_left_icon b_link_mail");
detailsVC.put("contact", contactLink);
homeLink = LinkFactory.createButton("home.link", detailsVC, this);
homeLink.setCustomEnabledLinkCSS("b_link_left_icon b_link_to_home");
detailsVC.put("home", homeLink);
setDetailsToolbarVisible(false);
putInitialPanel(mainVC);
}
public StudentStatEntry getEntry() {
return statEntry;
}
private List<EfficiencyStatementEntry> loadModel() {
List<RepositoryEntry> courses = coachingService.getStudentsCourses(getIdentity(), student, 0, -1);
List<EfficiencyStatementEntry> statements = coachingService.getEfficencyStatements(student, courses);
TableDataModel<EfficiencyStatementEntry> model = new EfficiencyStatementEntryTableDataModel(statements);
tableCtr.setTableDataModel(model);
return statements;
}
private void reloadModel() {
if(hasChanged) {
//reload
loadModel();
hasChanged = false;
}
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == next) {
nextEntry(ureq);
} else if (source == previous) {
previousEntry(ureq);
} else if(source == backLink) {
back(ureq);
} else if (source == homeLink) {
openHome(ureq);
} else if (source == contactLink) {
contact(ureq);
}
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(source == tableCtr) {
if(event instanceof TableEvent) {
TableEvent e = (TableEvent) event;
if("select".equals(e.getActionId())) {
EfficiencyStatementEntry entry = (EfficiencyStatementEntry)tableCtr.getTableDataModel().getObject(e.getRowId());
selectDetails(ureq, entry);
}
}
} else if (source == statementCtrl) {
if(event == Event.CHANGED_EVENT) {
hasChanged = true;
fireEvent(ureq, event);
} else {
reloadModel();
removeDetails(ureq);
}
} else if (source == cmc) {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
cmc = null;
contactCtrl = null;
} else if (source == contactCtrl) {
cmc.deactivate();
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
cmc = null;
contactCtrl = null;
} else if (source == toolbar) {
if("back".equals(event.getCommand())) {
reloadModel();
back(ureq);
} else if ("next.course".equals(event.getCommand())) {
nextEntry(ureq);
} else if ("previous.course".equals(event.getCommand())) {
previousEntry(ureq);
} else if ("contact.link".equals(event.getCommand())) {
contact(ureq);
} else if ("next.student".equals(event.getCommand())) {
fireEvent(ureq, event);
} else if ("previous.student".equals(event.getCommand())) {
fireEvent(ureq, event);
}
}
super.event(ureq, source, event);
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
if(entries == null || entries.isEmpty()) return;
ContextEntry ce = entries.get(0);
OLATResourceable ores = ce.getOLATResourceable();
if("RepositoryEntry".equals(ores.getResourceableTypeName())) {
Long identityKey = ores.getResourceableId();
for(int i=tableCtr.getRowCount(); i-->0; ) {
EfficiencyStatementEntry entry = (EfficiencyStatementEntry)tableCtr.getTableDataModel().getObject(i);
if(identityKey.equals(entry.getCourse().getKey())) {
selectDetails(ureq, entry);
statementCtrl.activate(ureq, entries.subList(1, entries.size()), ce.getTransientState());
break;
}
}
}
}
private void setDetailsToolbarVisible(boolean visible) {
next.setVisible(visible);
previous.setVisible(visible);
detailsCmp.setVisible(visible);
nextStudent.setVisible(!visible);
previousStudent.setVisible(!visible);
detailsStudentCmp.setVisible(!visible);
}
private void contact(UserRequest ureq) {
removeAsListenerAndDispose(cmc);
ContactMessage cmsg = new ContactMessage(getIdentity());
ContactList contactList = new ContactList("to");
contactList.add(student);
cmsg.addEmailTo(contactList);
contactCtrl = new ContactFormController(ureq, getWindowControl(), true, true, false, false, cmsg);
listenTo(contactCtrl);
cmc = new CloseableModalController(getWindowControl(), translate("close"), contactCtrl.getInitialComponent());
cmc.activate();
listenTo(cmc);
}
private void removeDetails(UserRequest ureq) {
mainVC.remove(statementCtrl.getInitialComponent());
removeAsListenerAndDispose(statementCtrl);
statementCtrl = null;
setDetailsToolbarVisible(false);
addToHistory(ureq);
}
private void back(UserRequest ureq) {
if(statementCtrl == null) {
fireEvent(ureq, Event.BACK_EVENT);
} else {
removeDetails(ureq);
}
}
private void nextEntry(UserRequest ureq) {
EfficiencyStatementEntry currentEntry = statementCtrl.getEntry();
int nextIndex = tableCtr.getIndexOfSortedObject(currentEntry) + 1;
if(nextIndex < 0 || nextIndex >= tableCtr.getRowCount()) {
nextIndex = 0;
}
EfficiencyStatementEntry nextEntry = (EfficiencyStatementEntry)tableCtr.getSortedObjectAt(nextIndex);
selectDetails(ureq, nextEntry);
}
private void previousEntry(UserRequest ureq) {
EfficiencyStatementEntry currentEntry = statementCtrl.getEntry();
int previousIndex = tableCtr.getIndexOfSortedObject(currentEntry) - 1;
if(previousIndex < 0 || previousIndex >= tableCtr.getRowCount()) {
previousIndex = tableCtr.getRowCount() - 1;
}
EfficiencyStatementEntry previousEntry = (EfficiencyStatementEntry)tableCtr.getSortedObjectAt(previousIndex);
selectDetails(ureq, previousEntry);
}
private void selectDetails(UserRequest ureq, EfficiencyStatementEntry entry) {
removeAsListenerAndDispose(statementCtrl);
OLATResourceable ores = OresHelper.createOLATResourceableInstance(RepositoryEntry.class, entry.getCourse().getKey());
WindowControl bwControl = addToHistory(ureq, ores, null);
statementCtrl = new EfficiencyStatementDetailsController(ureq, bwControl, entry, null);
listenTo(statementCtrl);
detailsCmp.setText(entry.getCourse().getDisplayname());
mainVC.put("efficiencyDetails", statementCtrl.getInitialComponent());
setDetailsToolbarVisible(true);
}
private void openHome(UserRequest ureq) {
List<ContextEntry> ces = new ArrayList<ContextEntry>(4);
ces.add(BusinessControlFactory.getInstance().createContextEntry(student));
BusinessControl bc = BusinessControlFactory.getInstance().createFromContextEntries(ces);
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl());
NewControllerFactory.getInstance().launch(ureq, bwControl);
}
}
/**
* <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.coach.ui;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.olat.basesecurity.BaseSecurity;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.table.ColumnDescriptor;
import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.core.gui.components.table.TableEvent;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
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.core.gui.control.generic.dtabs.Activateable2;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry;
import org.olat.core.util.resource.OresHelper;
import org.olat.modules.coach.CoachingService;
import org.olat.modules.coach.model.StudentStatEntry;
import org.olat.modules.coach.ui.StudentsTableDataModel.Columns;
/**
*
* Description:<br>
* Overview of all students under the scrutiny of a coach.
*
* <P>
* Initial Date: 8 févr. 2012 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class StudentListController extends BasicController implements Activateable2 {
private final Panel content;
private final TableController tableCtr;
private final VelocityContainer mainVC;
private StudentCoursesController studentCtrl;
private boolean hasChanged;
private final Map<Long,String> identityFullNameMap= new HashMap<Long,String>();
private final BaseSecurity securityManager;
private final CoachingService coachingService;
public StudentListController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl);
coachingService = CoreSpringFactory.getImpl(CoachingService.class);
securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableConfig.setTableEmptyMessage(translate("error.no.found"));
tableConfig.setDownloadOffered(true);
tableConfig.setPreferencesOffered(true, "studentListController");
tableCtr = new TableController(tableConfig, ureq, getWindowControl(), null, null, null, null, true, getTranslator());
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("student.name", Columns.name.ordinal(), "select", getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.countCourses", Columns.countCourse.ordinal(), null, getLocale()));
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.login", Columns.initialLaunch.ordinal(), null, getLocale(),
ColumnDescriptor.ALIGNMENT_LEFT, new LightIconRenderer()));
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.passed", Columns.countPassed.ordinal(), null, getLocale(),
ColumnDescriptor.ALIGNMENT_LEFT, new ProgressRenderer(false, getTranslator())));
loadModel();
listenTo(tableCtr);
mainVC = createVelocityContainer("student_list");
content = new Panel("studentList");
content.setContent(tableCtr.getInitialComponent());
mainVC.put("content", content);
putInitialPanel(mainVC);
}
@Override
protected void doDispose() {
//
}
private void loadModel() {
List<StudentStatEntry> students = coachingService.getStudentsStatistics(getIdentity());
Set<Long> studentNames = new HashSet<Long>();
for(StudentStatEntry student:students) {
if(!identityFullNameMap.containsKey(student.getStudentKey())) {
studentNames.add(student.getStudentKey());
}
}
if(!studentNames.isEmpty()) {
Map<Long,String> newIdentityFullNameMap = coachingService.getIdentities(studentNames);
identityFullNameMap.putAll(newIdentityFullNameMap);
}
TableDataModel<StudentStatEntry> model = new StudentsTableDataModel(students, identityFullNameMap);
tableCtr.setTableDataModel(model);
}
private void reloadModel() {
if(hasChanged) {
loadModel();
hasChanged = false;
}
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
//
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(source == tableCtr) {
if(event instanceof TableEvent) {
TableEvent e = (TableEvent) event;
if("select".equals(e.getActionId())) {
StudentStatEntry studentStat = (StudentStatEntry)tableCtr.getTableDataModel().getObject(e.getRowId());
selectStudent(ureq, studentStat);
}
}
} else if(event == Event.BACK_EVENT) {
reloadModel();
content.setContent(tableCtr.getInitialComponent());
removeAsListenerAndDispose(studentCtrl);
studentCtrl = null;
addToHistory(ureq);
} else if (source == studentCtrl) {
if(event == Event.CHANGED_EVENT) {
hasChanged = true;
} else if("next.student".equals(event.getCommand())) {
nextStudent(ureq);
} else if("previous.student".equals(event.getCommand())) {
previousStudent(ureq);
}
}
super.event(ureq, source, event);
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
if(entries == null || entries.isEmpty()) return;
ContextEntry ce = entries.get(0);
OLATResourceable ores = ce.getOLATResourceable();
if("Identity".equals(ores.getResourceableTypeName())) {
Long identityKey = ores.getResourceableId();
for(int i=tableCtr.getRowCount(); i-->0; ) {
StudentStatEntry studentStat = (StudentStatEntry)tableCtr.getTableDataModel().getObject(i);
if(identityKey.equals(studentStat.getStudentKey())) {
selectStudent(ureq, studentStat);
studentCtrl.activate(ureq, entries.subList(1, entries.size()), ce.getTransientState());
break;
}
}
}
}
protected void previousStudent(UserRequest ureq) {
StudentStatEntry currentEntry = studentCtrl.getEntry();
int previousIndex = tableCtr.getIndexOfSortedObject(currentEntry) - 1;
if(previousIndex < 0 || previousIndex >= tableCtr.getRowCount()) {
previousIndex = tableCtr.getRowCount() - 1;
}
StudentStatEntry previousEntry = (StudentStatEntry)tableCtr.getSortedObjectAt(previousIndex);
selectStudent(ureq, previousEntry);
}
protected void nextStudent(UserRequest ureq) {
StudentStatEntry currentEntry = studentCtrl.getEntry();
int nextIndex = tableCtr.getIndexOfSortedObject(currentEntry) + 1;
if(nextIndex < 0 || nextIndex >= tableCtr.getRowCount()) {
nextIndex = 0;
}
StudentStatEntry nextEntry = (StudentStatEntry)tableCtr.getSortedObjectAt(nextIndex);
selectStudent(ureq, nextEntry);
}
protected void selectStudent(UserRequest ureq, StudentStatEntry studentStat) {
removeAsListenerAndDispose(studentCtrl);
Identity student = securityManager.loadIdentityByKey(studentStat.getStudentKey());
OLATResourceable ores = OresHelper.createOLATResourceableInstance(Identity.class, student.getKey());
WindowControl bwControl = addToHistory(ureq, ores, null);
int index = tableCtr.getIndexOfSortedObject(studentStat);
studentCtrl = new StudentCoursesController(ureq, bwControl, studentStat, student, index, tableCtr.getRowCount());
listenTo(studentCtrl);
content.setContent(studentCtrl.getInitialComponent());
}
}
\ No newline at end of file
/**
* <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.coach.ui;
import java.util.ArrayList;
import java.util.List;
import org.olat.NewControllerFactory;
import org.olat.core.CoreSpringFactory;
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.table.BooleanColumnDescriptor;
import org.olat.core.gui.components.table.ColumnDescriptor;
import org.olat.core.gui.components.table.CustomCellRenderer;
import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.core.gui.components.table.TableEvent;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.text.TextComponent;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
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.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.dtabs.Activateable2;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.BusinessControl;
import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StateEntry;
import org.olat.core.util.StringHelper;
import org.olat.core.util.mail.ContactList;
import org.olat.core.util.mail.ContactMessage;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.assessment.UserEfficiencyStatement;
import org.olat.modules.co.ContactFormController;
import org.olat.modules.coach.CoachingService;
import org.olat.modules.coach.model.EfficiencyStatementEntry;
import org.olat.repository.RepositoryEntry;
import org.olat.user.UserManager;
import org.olat.modules.coach.ui.EfficiencyStatementEntryTableDataModel.Columns;
import org.olat.modules.coach.ui.ToolbarController.Position;
/**
*
* Description:<br>
* Overview of all students under the scrutiny of a coach.
*
* <P>
* Initial Date: 8 févr. 2012 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class StudentOverviewController extends BasicController implements Activateable2 {
private final Link next, previous, backLink;
private final Link homeLink, contactLink;
private final TextComponent detailsCmp;
private final TableController tableCtr;
private final VelocityContainer mainVC;
private final VelocityContainer detailsVC;
private CloseableModalController cmc;
private ContactFormController contactCtrl;
private final ToolbarController toolbar;
private EfficiencyStatementDetailsController statementCtrl;
private final Identity student;
private final UserManager userManager;
private final CoachingService coachingService;
public StudentOverviewController(UserRequest ureq, WindowControl wControl, Identity student) {
super(ureq, wControl);
this.student = student;
coachingService = CoreSpringFactory.getImpl(CoachingService.class);
userManager = CoreSpringFactory.getImpl(UserManager.class);
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableConfig.setTableEmptyMessage(translate("error.no.found"));
tableConfig.setDownloadOffered(true);
tableConfig.setPreferencesOffered(true, "studentCourseListController");
tableCtr = new TableController(tableConfig, ureq, getWindowControl(), null, null, null, null, true, getTranslator());
tableCtr.addColumnDescriptor(false, new DefaultColumnDescriptor("student.name", Columns.studentName.ordinal(), "select", getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.course.name", Columns.repoName.ordinal(), "select", getLocale()));
tableCtr.addColumnDescriptor(new BooleanColumnDescriptor("table.header.passed", Columns.passed.ordinal(), translate("passed.true"), translate("passed.false")));
CustomCellRenderer scoreRenderer = new ScoreCellRenderer();
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.score", Columns.score.ordinal(), "select", getLocale(),
ColumnDescriptor.ALIGNMENT_RIGHT, scoreRenderer));
tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.progress", Columns.progress.ordinal(), null, getLocale(),
ColumnDescriptor.ALIGNMENT_LEFT, new ProgressRenderer(true, getTranslator())));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.lastScoreDate", Columns.lastModification.ordinal(), "select", getLocale()));
listenTo(tableCtr);
List<UserEfficiencyStatement> statements = coachingService.getEfficencyStatements(student);
TableDataModel<UserEfficiencyStatement> model = new UserEfficiencyStatementTableDataModel(statements);
tableCtr.setTableDataModel(model);
mainVC = createVelocityContainer("student_course_list");
detailsVC = createVelocityContainer("student_details");
String fullName = StringHelper.escapeHtml(userManager.getUserDisplayName(student));
detailsVC.contextPut("studentName", fullName);
mainVC.put("studentDetails", detailsVC);
mainVC.put("studentsTable", tableCtr.getInitialComponent());
toolbar = new ToolbarController(ureq, wControl, getTranslator());
listenTo(toolbar);
mainVC.put("toolbar", toolbar.getInitialComponent());
previous = toolbar.addToolbarLink("previous", this, Position.center);
previous.setCustomEnabledLinkCSS("b_with_small_icon_left b_with_small_icon_only b_move_left_icon");
previous.setEnabled(statements.size() > 1);
detailsCmp = toolbar.addToolbarText("details", this, Position.center);
next = toolbar.addToolbarLink("next", this, Position.center);
next.setCustomEnabledLinkCSS("b_with_small_icon_right b_with_small_icon_only b_move_right_icon");
next.setEnabled(statements.size() > 1);
backLink = toolbar.addToolbarLink("back", this, Position.left);
backLink.setCustomEnabledLinkCSS("b_link_back");
contactLink = LinkFactory.createButton("contact.link", detailsVC, this);
contactLink.setCustomEnabledLinkCSS("b_link_left_icon b_link_mail");
detailsVC.put("contact", contactLink);
homeLink = LinkFactory.createButton("home.link", detailsVC, this);
homeLink.setCustomEnabledLinkCSS("b_link_left_icon b_link_to_home");
detailsVC.put("home", homeLink);
setDetailsToolbarVisible(false);
putInitialPanel(mainVC);
}
@Override
protected void doDispose() {
//
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == next) {
nextEntry(ureq);
} else if (source == previous) {
previousEntry(ureq);
} else if (source == homeLink) {
openHome(ureq);
} else if (source == contactLink) {
contact(ureq);
}
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(source == tableCtr) {
if(event instanceof TableEvent) {
TableEvent e = (TableEvent) event;
if("select".equals(e.getActionId())) {
UserEfficiencyStatement entry = (UserEfficiencyStatement)tableCtr.getTableDataModel().getObject(e.getRowId());
selectDetails(ureq, entry);
}
}
} else if (source == statementCtrl) {
removeDetails(ureq);
} else if (source == cmc) {
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
cmc = null;
contactCtrl = null;
} else if (source == contactCtrl) {
cmc.deactivate();
removeAsListenerAndDispose(cmc);
removeAsListenerAndDispose(contactCtrl);
cmc = null;
contactCtrl = null;
} else if (source == toolbar) {
if ("next".equals(event.getCommand())) {
nextEntry(ureq);
} else if ("previous".equals(event.getCommand())) {
previousEntry(ureq);
} else if ("contact.link".equals(event.getCommand())) {
contact(ureq);
} else if ("next.student".equals(event.getCommand())) {
fireEvent(ureq, event);
} else if ("previous.student".equals(event.getCommand())) {
fireEvent(ureq, event);
} else if ("back".equals(event.getCommand())) {
back(ureq);
}
}
super.event(ureq, source, event);
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
if(entries == null || entries.isEmpty()) return;
}
private void setDetailsToolbarVisible(boolean visible) {
if(next.isVisible() == visible) return;
next.setVisible(visible);
previous.setVisible(visible);
detailsCmp.setVisible(visible);
backLink.setVisible(visible);
}
private void back(UserRequest ureq) {
removeDetails(ureq);
}
private void contact(UserRequest ureq) {
removeAsListenerAndDispose(cmc);
ContactMessage cmsg = new ContactMessage(getIdentity());
ContactList contactList = new ContactList("to");
contactList.add(student);
cmsg.addEmailTo(contactList);
contactCtrl = new ContactFormController(ureq, getWindowControl(), true, true, false, false, cmsg);
listenTo(contactCtrl);
cmc = new CloseableModalController(getWindowControl(), translate("close"), contactCtrl.getInitialComponent());
cmc.activate();
listenTo(cmc);
}
private void removeDetails(UserRequest ureq) {
mainVC.remove(statementCtrl.getInitialComponent());
removeAsListenerAndDispose(statementCtrl);
statementCtrl = null;
setDetailsToolbarVisible(false);
addToHistory(ureq);
}
private void nextEntry(UserRequest ureq) {
UserEfficiencyStatement currentEntry = statementCtrl.getEntry().getUserEfficencyStatement();
int nextIndex = tableCtr.getIndexOfSortedObject(currentEntry) + 1;
if(nextIndex < 0 || nextIndex >= tableCtr.getRowCount()) {
nextIndex = 0;
}
UserEfficiencyStatement nextEntry = (UserEfficiencyStatement)tableCtr.getSortedObjectAt(nextIndex);
selectDetails(ureq, nextEntry);
}
private void previousEntry(UserRequest ureq) {
UserEfficiencyStatement currentEntry = statementCtrl.getEntry().getUserEfficencyStatement();
int previousIndex = tableCtr.getIndexOfSortedObject(currentEntry) - 1;
if(previousIndex < 0 || previousIndex >= tableCtr.getRowCount()) {
previousIndex = tableCtr.getRowCount() - 1;
}
UserEfficiencyStatement previousEntry = (UserEfficiencyStatement)tableCtr.getSortedObjectAt(previousIndex);
selectDetails(ureq, previousEntry);
}
private void selectDetails(UserRequest ureq, UserEfficiencyStatement statement) {
removeAsListenerAndDispose(statementCtrl);
EfficiencyStatementEntry entry = coachingService.getEfficencyStatement(statement);
OLATResourceable ores = OresHelper.createOLATResourceableInstance(RepositoryEntry.class, statement.getCourseRepoKey());
WindowControl bwControl = addToHistory(ureq, ores, null);
statementCtrl = new EfficiencyStatementDetailsController(ureq, bwControl, entry, null);
listenTo(statementCtrl);
detailsCmp.setText(statement.getShortTitle());
mainVC.put("efficiencyDetails", statementCtrl.getInitialComponent());
setDetailsToolbarVisible(true);
}
private void openHome(UserRequest ureq) {
List<ContextEntry> ces = new ArrayList<ContextEntry>(4);
ces.add(BusinessControlFactory.getInstance().createContextEntry(student));
BusinessControl bc = BusinessControlFactory.getInstance().createFromContextEntries(ces);
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl());
NewControllerFactory.getInstance().launch(ureq, bwControl);
}
}
/**
* <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.coach.ui;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.modules.coach.model.StudentStatEntry;
import org.olat.modules.coach.ui.ProgressValue;
import org.olat.modules.coach.ui.LightedValue.Light;
/**
*
* Description:<br>
*
* <P>
* Initial Date: 8 févr. 2012 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class StudentsTableDataModel implements TableDataModel<StudentStatEntry> {
private List<StudentStatEntry> students;
private Map<Long,String> identityFullNameMap;
public StudentsTableDataModel(List<StudentStatEntry> identities, Map<Long,String> identityFullNameMap) {
this.students = identities;
this.identityFullNameMap = identityFullNameMap;
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public int getRowCount() {
return getEntries() == null ? 0 : getEntries().size();
}
@Override
public Object getValueAt(int row, int col) {
StudentStatEntry student = getEntries().get(row);
int countRepo = student.getCountRepo();
switch(Columns.getValueAt(col)) {
case name: {
Long name = student.getStudentKey();
return identityFullNameMap.get(name);
}
case countCourse: {
return new Integer(countRepo);
}
case initialLaunch: {
if(countRepo == 0) {
return null;
}
int launched = student.getInitialLaunch();
Light light = Light.yellow;
if(launched == countRepo) {
light = Light.green;
} else if (launched == 0) {
light = Light.red;
}
return new LightedValue(Integer.toString(launched), light);
}
case countPassed: {
if(countRepo == 0) {
return null;
}
ProgressValue val = new ProgressValue();
val.setTotal(countRepo);
val.setGreen(student.getCountPassed());
return val;
}
case countPassedLight: {
if(countRepo == 0) {
return null;
}
int passed = student.getCountPassed();
Light light = Light.yellow;
if(passed == countRepo) {
light = Light.green;
} else if (passed == 0) {
light = Light.red;
}
return new LightedValue(Integer.toString(passed), light);
}
}
return null;
}
public List<StudentStatEntry> getEntries() {
return students;
}
@Override
public StudentStatEntry getObject(int row) {
return getEntries().get(row);
}
@Override
public void setObjects(List<StudentStatEntry> objects) {
students = objects;
}
@Override
public StudentsTableDataModel createCopyWithEmptyList() {
return new StudentsTableDataModel(new ArrayList<StudentStatEntry>(), identityFullNameMap);
}
public static enum Columns {
name,
countCourse,
initialLaunch,
countPassed,
countPassedLight;
public static Columns getValueAt(int ordinal) {
if(ordinal >= 0 && ordinal < values().length) {
return values()[ordinal];
}
return name;
}
}
}
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) frentix GmbH<br>
* http://www.frentix.com<br>
* <p>
*/
package org.olat.modules.coach.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.text.TextComponent;
import org.olat.core.gui.components.text.TextFactory;
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.core.gui.translator.Translator;
/**
*
* Description:<br>
* Controller for the toolbar
* <P>
* Initial Date: 26 jul. 2010 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class ToolbarController extends BasicController {
private final Map<Component, Object> ownershipMap = new HashMap<Component, Object>();
private final List<Component> leftComponents = new ArrayList<Component>();
private final List<Component> centeredComponents = new ArrayList<Component>();
private final List<Component> rightComponents = new ArrayList<Component>();
private VelocityContainer toolbarVC;
public ToolbarController(UserRequest ureq, WindowControl wControl, Translator translator) {
super(ureq, wControl, translator);
toolbarVC = createVelocityContainer("toolbar");
toolbarVC.contextPut("toolbarItems", leftComponents);
toolbarVC.contextPut("toolbarCenteredItems", centeredComponents);
toolbarVC.contextPut("toolbarItemsAtRight", rightComponents);
putInitialPanel(toolbarVC);
}
@Override
protected void doDispose() {
//
}
public List<Component> getToolbarItemsAtLeft() {
return leftComponents;
}
public List<Component> getToolbarItemsAtRight() {
return rightComponents;
}
public Component addToolbarComponent(Component cmp, Object owner, Position pos) {
addToolbarComponentToMapAndList(cmp, owner, pos);
toolbarVC.put(cmp.getComponentName(), cmp);
return cmp;
}
/**
* adds the given component to the owner-map and to the correct
* component-list (according to position) does _NOT_ add the component to
* velocity-container
*
* @param cmp
* @param owner
* @param pos
* @return
*/
private Component addToolbarComponentToMapAndList(Component cmp, Object owner, Position pos) {
ownershipMap.put(cmp, owner);
switch (pos) {
case left:
leftComponents.add(cmp);
break;
case center:
centeredComponents.add(cmp);
break;
case right:
rightComponents.add(cmp);
break;
}
return cmp;
}
public TextComponent addToolbarText(String name, Object owner, Position pos) {
return addToolbarText(name, name, owner, pos);
}
public TextComponent addToolbarText(String name, String text, Object owner, Position pos) {
TextComponent textCmp = TextFactory.createTextComponentFromString(name, text, null, true, toolbarVC);
addToolbarComponentToMapAndList(textCmp, owner, pos);
return textCmp;
}
public Link addToolbarLink(String name, Object owner, Position pos) {
Link link = LinkFactory.createLink(name, toolbarVC, this);
addToolbarComponentToMapAndList(link, owner, pos);
return link;
}
public Link addToolbarLink(String name, String displayText, Object owner, Position pos) {
Link link = LinkFactory.createLink(name, toolbarVC, this);
link.setCustomDisplayText(displayText);
link.setTooltip(name);
addToolbarComponentToMapAndList(link, owner, pos);
return link;
}
public Link addToolbarButton(String name, Object owner, Position pos) {
Link link = LinkFactory.createButton(name, toolbarVC, this);
addToolbarComponentToMapAndList(link, owner, pos);
return link;
}
public Link addToolbarButton(String name, String displayText, Object owner, Position pos) {
Link link = LinkFactory.createButton(name, toolbarVC, this);
link.setCustomDisplayText(displayText);
link.setTooltip(name);
addToolbarComponentToMapAndList(link, owner, pos);
return link;
}
public void removeToolbarItem(String name) {
removeToolbarItem(name, leftComponents);
removeToolbarItem(name, centeredComponents);
removeToolbarItem(name, rightComponents);
}
private void removeToolbarItem(String name, List<Component> cmps) {
for (Component component : cmps) {
if (name.equals(component.getComponentName())) {
cmps.remove(component);
ownershipMap.remove(component);
toolbarVC.remove(component);
return;
}
}
}
public void removeAllToolbarItemOf(Object owner) {
removeAllToolbarItemOf(owner, leftComponents);
removeAllToolbarItemOf(owner, centeredComponents);
removeAllToolbarItemOf(owner, rightComponents);
}
private void removeAllToolbarItemOf(Object owner, List<Component> cmps) {
for (Iterator<Component> linkIt = cmps.iterator(); linkIt.hasNext();) {
Component component = linkIt.next();
if (owner.equals(ownershipMap.get(component))) {
linkIt.remove();
toolbarVC.remove(component);
ownershipMap.remove(component);
}
}
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (leftComponents.contains(source) || rightComponents.contains(source) || centeredComponents.contains(source)) {
fireEvent(ureq, event);
}
}
public enum Position {
left, center, right,
}
}
/**
* <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.coach.ui;
import java.util.ArrayList;
import java.util.List;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.course.assessment.AssessmentHelper;
import org.olat.course.assessment.UserEfficiencyStatement;
import org.olat.modules.coach.model.EfficiencyStatementEntry;
import org.olat.modules.coach.ui.ProgressValue;
/**
*
* Description:<br>
*
* <P>
* Initial Date: 8 févr. 2012 <br>
*
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class UserEfficiencyStatementTableDataModel implements TableDataModel<UserEfficiencyStatement> {
private List<UserEfficiencyStatement> group;
public UserEfficiencyStatementTableDataModel(List<UserEfficiencyStatement> group) {
this.group = group;
}
@Override
public int getColumnCount() {
return 6;
}
@Override
public int getRowCount() {
return group == null ? 0 : group.size();
}
@Override
public Object getValueAt(int row, int col) {
UserEfficiencyStatement entry = group.get(row);
switch(Columns.getValueAt(col)) {
case repoName: {
return entry.getShortTitle();
}
case score: {
UserEfficiencyStatement s = entry;
return s == null ? null : AssessmentHelper.getRoundedScore(s.getScore());
}
case passed: {
UserEfficiencyStatement s = entry;
return s == null ? null : s.getPassed();
}
case progress: {
if(entry == null || entry.getTotalNodes() == null) {
ProgressValue val = new ProgressValue();
val.setTotal(100);
val.setGreen(0);
return val;
}
ProgressValue val = new ProgressValue();
val.setTotal(entry.getTotalNodes().intValue());
val.setGreen(entry.getAttemptedNodes() == null ? 0 : entry.getAttemptedNodes().intValue());
return val;
}
case lastModification: {
return entry == null ? null : entry.getLastModified();
}
default : {
return entry;
}
}
}
@Override
public UserEfficiencyStatement getObject(int row) {
return group.get(row);
}
public int indexOf(EfficiencyStatementEntry obj) {
return group.indexOf(obj);
}
@Override
public void setObjects(List<UserEfficiencyStatement> objects) {
group = objects;
}
@Override
public UserEfficiencyStatementTableDataModel createCopyWithEmptyList() {
return new UserEfficiencyStatementTableDataModel(new ArrayList<UserEfficiencyStatement>());
}
public static enum Columns {
studentName,
repoName,
score,
passed,
progress,
lastModification,
;
public static Columns getValueAt(int ordinal) {
if(ordinal >= 0 && ordinal < values().length) {
return values()[ordinal];
}
return studentName;
}
}
}
<p>
$r.translate("chelp.coaching.intro")
</p>
\ No newline at end of file
$r.render("toolbar")
#if($r.available("efficiencyDetails"))
$r.render("efficiencyDetails")
#else
$r.render("courseDetails")
$r.render("courseTable")
#end
<div class="o_eff_statement_details">
<h3 class="b_with_small_icon_left o_CourseModule_icon">$courseName</h3>
#if($r.available("open"))
$r.render("open")
#end
</div>
\ No newline at end of file
$r.render("coursTable")
\ No newline at end of file
<div class="b_clearfix">
$r.render("segments") <br/>
#if($r.available("segmentCmp"))
$r.render("segmentCmp")
#end
</div>
\ No newline at end of file
<div class="o_eff_statement_details">
<h3 class="b_with_small_icon_left b_group_icon">$groupName</h3>
#if($r.available("open.group"))
$r.render("open.group")
#end
</div>
\ No newline at end of file
$r.render("groupsTable")
\ No newline at end of file
$r.render("toolbar")
#if($r.available("efficiencyDetails"))
$r.render("efficiencyDetails")
#else
$r.render("groupDetails")
$r.render("groupsTable")
#end
\ No newline at end of file
$r.render("toolbar")
#if($r.available("efficiencyDetails"))
$r.render("efficiencyDetails")
#else
$r.render("studentDetails")
$r.render("studentsTable")
#end
\ No newline at end of file
<div class="o_eff_statement_details">
<h3 class="b_with_small_icon_left b_user_icon">$studentName</h3>
#if($r.available("home"))
$r.render("home")
#end
#if($r.available("contact"))
$r.render("contact")
#end
</div>
$r.render("content")
\ No newline at end of file
<div class="b_toolbar b_clearfix">
<div class="b_toolbar_left">
#if($toolbarItems && $toolbarItems.size() > 0)
<ul class="b_toolbar_left">
#foreach($toolbarItem in $toolbarItems)
<li>$r.render(${toolbarItem.getComponentName()})</li>
#end
</ul>
#end
</div>
#if($toolbarCenteredItems && $toolbarCenteredItems.size() > 0)
<div class="b_toolbar_center">
#foreach($toolbarItem in $toolbarCenteredItems)
<span>$r.render(${toolbarItem.getComponentName()})</span>
#end
</div>
#end
<div class="b_toolbar_right">
#if($toolbarItemsAtRight && $toolbarItemsAtRight.size() > 0)
<ul class="b_toolbar_right">
#foreach($toolbarItem in $toolbarItemsAtRight)
<li>$r.render(${toolbarItem.getComponentName()})</li>
#end
</ul>
#end
</div>
</div>
\ No newline at end of file
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