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

OO-1593: assessment entry filter and more activateable methods

parent 49405fdd
No related branches found
No related tags found
No related merge requests found
Showing
with 188 additions and 24 deletions
......@@ -228,6 +228,12 @@ public interface FlexiTableElement extends FormItem {
*/
public String getSelectedFilterKey();
/**
* Preset the selected filter, but don't trigger sort/filter operation.
* @param key
*/
public void setSelectedFilterKey(String key);
/**
* @return The selected value by the filter, or null if no item is selected
*/
......
......@@ -369,6 +369,17 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
return key;
}
@Override
public void setSelectedFilterKey(String key) {
if(filters != null) {
for(FlexiTableFilter filter:filters) {
boolean selected = (key == null && filter.getFilter() == null)
|| (key != null && key.equals(filter.getFilter()));
filter.setSelected(selected);
}
}
}
@Override
public String getSelectedFilterValue() {
String value = null;
......
......@@ -113,8 +113,11 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
infos.setParameter("identityKey", coach.getKey());
}
Object[] result = infos.getSingleResult();
Long initalLaunch = (Long)result[0];
List<Object[]> results = infos.getResultList();
Long initalLaunch = null;
if(results != null && results.size() > 0) {
initalLaunch = (Long)results.get(0)[0];
}
entry.setInitialLaunch(initalLaunch == null ? 0 : initalLaunch.intValue());
} catch (Exception e) {
e.printStackTrace();
......
/**
* <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.course.assessment.ui.tool;
import org.olat.core.id.context.StateEntry;
/**
*
* Initial date: 07.12.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AssessedIdentityListState implements StateEntry {
private static final long serialVersionUID = -6546620154750599626L;
private String filter;
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
@Override
public AssessedIdentityListState clone() {
AssessedIdentityListState clone = new AssessedIdentityListState();
return clone;
}
}
......@@ -58,12 +58,14 @@ public class AssessmentCourseOverviewController extends BasicController implemen
protected static final Event SELECT_USERS_EVENT = new Event("assessment-tool-select-users");
protected static final Event SELECT_GROUPS_EVENT = new Event("assessment-tool-select-groups");
protected static final Event SELECT_PASSED_EVENT = new Event("assessment-tool-select-passed");
protected static final Event SELECT_FAILED_EVENT = new Event("assessment-tool-select-failed");
private final VelocityContainer mainVC;
private final AssessmentToReviewSmallController toReviewCtrl;
private final AssessmentCourseStatisticsSmallController statisticsCtrl;
private Link assessedIdentitiesLink, assessedGroupsLink;
private Link assessedIdentitiesLink, assessedGroupsLink, passedLink, failedLink;
@Autowired
private CertificatesManager certificatesManager;
......@@ -118,6 +120,16 @@ public class AssessmentCourseOverviewController extends BasicController implemen
assessedIdentitiesLink.setCustomDisplayText(translate("assessment.tool.numOfAssessedIdentities", new String[]{ Integer.toString(numOfAssessedIdentities) }));
assessedIdentitiesLink.setIconLeftCSS("o_icon o_icon_user");
int numOfPassed = statisticsCtrl.getNumOfPassed();
passedLink = LinkFactory.createLink("passed.identities", "passed.identities", getTranslator(), mainVC, this, Link.NONTRANSLATED);
passedLink.setCustomDisplayText(translate("assessment.tool.numOfPassed", new String[]{ Integer.toString(numOfPassed) }));
passedLink.setIconLeftCSS("o_icon o_icon_user");
int numOfFailed = statisticsCtrl.getNumOfFailed();
failedLink = LinkFactory.createLink("failed.identities", "failed.identities", getTranslator(), mainVC, this, Link.NONTRANSLATED);
failedLink.setCustomDisplayText(translate("assessment.tool.numOfFailed", new String[]{ Integer.toString(numOfFailed) }));
failedLink.setIconLeftCSS("o_icon o_icon_user");
int numOfGroups = 0;
if(assessmentCallback.canAssessBusinessGoupMembers()) {
SearchBusinessGroupParams params = new SearchBusinessGroupParams();
......@@ -155,6 +167,10 @@ public class AssessmentCourseOverviewController extends BasicController implemen
fireEvent(ureq, SELECT_USERS_EVENT);
} else if(assessedGroupsLink == source) {
fireEvent(ureq, SELECT_GROUPS_EVENT);
} else if(passedLink == source) {
fireEvent(ureq, SELECT_PASSED_EVENT);
} else if(failedLink == source) {
fireEvent(ureq, SELECT_FAILED_EVENT);
}
}
}
......@@ -46,6 +46,8 @@ public class AssessmentCourseStatisticsSmallController extends BasicController {
private final RepositoryEntry courseEntry;
private final AssessmentToolSecurityCallback assessmentCallback;
private int numOfPassed;
private int numOfFailed;
private int numOfAssessedIdentities;
@Autowired
......@@ -62,6 +64,14 @@ public class AssessmentCourseStatisticsSmallController extends BasicController {
updateStatistics();
}
public int getNumOfPassed() {
return numOfPassed;
}
public int getNumOfFailed() {
return numOfFailed;
}
public int getNumOfAssessedIdentities() {
return numOfAssessedIdentities;
}
......@@ -73,10 +83,12 @@ public class AssessmentCourseStatisticsSmallController extends BasicController {
numOfAssessedIdentities = stats.getNumOfAssessedIdentities();
mainVC.contextPut("numOfAssessedIdentities", numOfAssessedIdentities);
mainVC.contextPut("scoreAverage", AssessmentHelper.getRoundedScore(stats.getAverageScore()));
mainVC.contextPut("numOfPassed", stats.getCountPassed());
numOfPassed = stats.getCountPassed();
mainVC.contextPut("numOfPassed", numOfPassed);
int percentPassed = Math.round(100.0f * ((float)stats.getCountPassed() / (float)stats.getNumOfAssessedIdentities()));
mainVC.contextPut("percentPassed", percentPassed);
mainVC.contextPut("numOfFailed", stats.getCountFailed());
numOfFailed = stats.getCountFailed();
mainVC.contextPut("numOfFailed", numOfFailed);
int percentFailed = Math.round(100.0f * ((float)stats.getCountFailed() / (float)stats.getNumOfAssessedIdentities()));
mainVC.contextPut("percentFailed", percentFailed);
......
......@@ -102,6 +102,10 @@ public class AssessmentIdentitiesCourseTreeController extends BasicController im
doSelectCourseNode(ureq, (CourseNode)rootNode.getUserObject());
}
}
if(currentCtrl instanceof Activateable2) {
((Activateable2)currentCtrl).activate(ureq, null, state);
}
}
@Override
......@@ -110,13 +114,16 @@ public class AssessmentIdentitiesCourseTreeController extends BasicController im
if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) {
Object uo = menuTree.getSelectedNode().getUserObject();
if(uo instanceof CourseNode) {
doSelectCourseNode(ureq, (CourseNode)uo);
Controller ctrl = doSelectCourseNode(ureq, (CourseNode)uo);
if(ctrl instanceof Activateable2) {
((Activateable2)ctrl).activate(ureq, null, null);
}
}
}
}
}
private void doSelectCourseNode(UserRequest ureq, CourseNode courseNode) {
private Controller doSelectCourseNode(UserRequest ureq, CourseNode courseNode) {
removeAsListenerAndDispose(currentCtrl);
OLATResourceable ores = OresHelper.createOLATResourceableInstance("Node", new Long(courseNode.getIdent()));
......@@ -133,5 +140,6 @@ public class AssessmentIdentitiesCourseTreeController extends BasicController im
listenTo(currentCtrl);
mainPanel.setContent(currentCtrl.getInitialComponent());
addToHistory(ureq, currentCtrl);
return currentCtrl;
}
}
......@@ -124,6 +124,10 @@ public class AssessmentToolController extends MainLayoutBasicController implemen
if(overviewCtrl == source) {
if(event == AssessmentCourseOverviewController.SELECT_USERS_EVENT) {
doSelectUsersView(ureq);
} else if(event == AssessmentCourseOverviewController.SELECT_PASSED_EVENT) {
doSelectPassedView(ureq);
} else if(event == AssessmentCourseOverviewController.SELECT_FAILED_EVENT) {
doSelectFailedView(ureq);
}
}
super.event(ureq, source, event);
......@@ -159,4 +163,34 @@ public class AssessmentToolController extends MainLayoutBasicController implemen
currentCtl = treeCtrl;
treeCtrl.activate(ureq, null, null);
}
private void doSelectPassedView(UserRequest ureq) {
OLATResourceable ores = OresHelper.createOLATResourceableInstance("Passed", 0l);
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
addToHistory(ureq, bwControl);
AssessmentIdentitiesCourseTreeController treeCtrl = new AssessmentIdentitiesCourseTreeController(ureq, bwControl, stackPanel,
courseEntry, toolContainer, assessmentCallback);
listenTo(treeCtrl);
stackPanel.pushController(translate("users"), treeCtrl);
currentCtl = treeCtrl;
AssessedIdentityListState state = new AssessedIdentityListState();
state.setFilter("passed");
treeCtrl.activate(ureq, null, state);
}
private void doSelectFailedView(UserRequest ureq) {
OLATResourceable ores = OresHelper.createOLATResourceableInstance("NotPassed", 0l);
WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
addToHistory(ureq, bwControl);
AssessmentIdentitiesCourseTreeController treeCtrl = new AssessmentIdentitiesCourseTreeController(ureq, bwControl, stackPanel,
courseEntry, toolContainer, assessmentCallback);
listenTo(treeCtrl);
stackPanel.pushController(translate("users"), treeCtrl);
currentCtl = treeCtrl;
AssessedIdentityListState state = new AssessedIdentityListState();
state.setFilter("failed");
treeCtrl.activate(ureq, null, state);
}
}
......@@ -51,7 +51,10 @@ import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
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.generic.dtabs.Activateable2;
import org.olat.core.id.Identity;
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.Util;
import org.olat.course.CourseFactory;
......@@ -84,7 +87,7 @@ import org.springframework.beans.factory.annotation.Autowired;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class IdentityListCourseNodeController extends FormBasicController {
public class IdentityListCourseNodeController extends FormBasicController implements Activateable2 {
private final BusinessGroup group;
private final CourseNode courseNode;
......@@ -139,7 +142,6 @@ public class IdentityListCourseNodeController extends FormBasicController {
userPropertyHandlers = userManager.getUserPropertyHandlersFor(AssessmentToolConstants.usageIdentifyer, isAdministrativeUser);
initForm(ureq);
updateModel(ureq, null, null, null);
}
@Override
......@@ -256,9 +258,7 @@ public class IdentityListCourseNodeController extends FormBasicController {
List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(assessedIdentities.size());
for(Identity assessedIdentity:assessedIdentities) {
AssessmentEntry entry = entryMap.get(assessedIdentity.getKey());
if(accept(entry, params)) {
rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale()));
}
rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale()));
}
if(toolContainer.getCertificateMap() == null) {
......@@ -271,6 +271,9 @@ public class IdentityListCourseNodeController extends FormBasicController {
}
usersTableModel.setCertificateMap(toolContainer.getCertificateMap());
usersTableModel.setObjects(rows);
if(filters != null && filters.size() > 0) {
usersTableModel.filter(filters.get(0).getFilter());
}
tableEl.reloadData();
List<String> toolCmpNames = new ArrayList<>();
......@@ -307,7 +310,7 @@ public class IdentityListCourseNodeController extends FormBasicController {
private void updateModel(UserRequest ureq, Identity assessedIdentity) {
updateModel(ureq, null, null, null);
}
/*
private boolean accept(AssessmentEntry entry, SearchAssessedIdentityParams params) {
boolean ok = true;
......@@ -327,7 +330,7 @@ public class IdentityListCourseNodeController extends FormBasicController {
}
}
return ok;
}
}*/
private void fillAlternativeToAssessableIdentityList(AssessmentToolOptions options) {
List<Group> baseGroups = new ArrayList<>();
......@@ -348,7 +351,21 @@ public class IdentityListCourseNodeController extends FormBasicController {
protected void doDispose() {
//
}
@Override
public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
String filter = null;
if(state instanceof AssessedIdentityListState) {
AssessedIdentityListState listState = (AssessedIdentityListState)state;
if(StringHelper.containsNonWhitespace(listState.getFilter())) {
filter = listState.getFilter();
}
}
tableEl.setSelectedFilterKey(filter);
updateModel(ureq, null, tableEl.getSelectedFilters(), null);
}
@Override
protected void formOK(UserRequest ureq) {
//
......
......@@ -63,19 +63,19 @@ public class IdentityListCourseNodeTableModel extends DefaultFlexiTableDataModel
if(StringHelper.containsNonWhitespace(key)) {
List<AssessedIdentityCourseElementRow> filteredRows = new ArrayList<>();
if("passed".equals(key)) {
for(AssessedIdentityCourseElementRow row:getObjects()) {
for(AssessedIdentityCourseElementRow row:backups) {
if(row.getPassed() != null && row.getPassed().booleanValue()) {
filteredRows.add(row);
}
}
} else if("failed".equals(key)) {
for(AssessedIdentityCourseElementRow row:getObjects()) {
for(AssessedIdentityCourseElementRow row:backups) {
if(row.getPassed() != null && !row.getPassed().booleanValue()) {
filteredRows.add(row);
}
}
} else if(AssessmentEntryStatus.isValueOf(key)) {
for(AssessedIdentityCourseElementRow row:getObjects()) {
for(AssessedIdentityCourseElementRow row:backups) {
if(row.getAssessmentStatus() != null && key.equals(row.getAssessmentStatus().name())) {
filteredRows.add(row);
}
......
......@@ -5,16 +5,22 @@ $r.contextHelpWithWrapper("Using Course Tools#_bewertungswerkzeug")
#end
<p class="o_info">$r.translate("index.intro")</p>
<div class="row o_block">
<div class="col-sm-6">
<div class="col-sm-6"><ul class="list-unstyled">
#if($r.available("assessed.identities"))
$r.render("assessed.identities")
<li>$r.render("assessed.identities")</li>
#end
</div>
<div class="col-sm-6">
#if($r.available("assessed.groups"))
$r.render("assessed.groups")
<li>$r.render("assessed.groups")</li>
#end
</div>
</ul></div>
<div class="col-sm-6"><ul class="list-unstyled">
#if($r.available("passed.identities"))
<li>$r.render("passed.identities")</li>
#end
#if($r.available("failed.identities"))
<li>$r.render("failed.identities")</li>
#end
</ul></div>
</div>
<div class="row">
<div class="col-sm-6">
......
......@@ -19,6 +19,8 @@ assessment.status.done=Bewertet
assessment.tool.overview=Ubersicht
assessment.tool.numOfAssessedIdentities={0} bewertete Benutzer
assessment.tool.numOfAssessedGroups={0} Gruppe(n)
assessment.tool.numOfPassed={0} bestandend
assessment.tool.numOfFailed={0} nicht bestandend
table.entries=Entries
waiting.review=Pending reviews
no.certificate=Kein Zertifikat vorhanden
......
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