diff --git a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java index f2371179832c92ca6a23fd1b3b016611bbc23c3b..bec350d7dd185ad18654851392251e3318b88d2b 100644 --- a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java +++ b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java @@ -41,6 +41,7 @@ public class ProgressBar extends AbstractComponent { private static final int DEFAULT_WIDTH = 200; private int width = DEFAULT_WIDTH; + private boolean widthInPercent = false; private float actual; private float max; private boolean isNoMax = false; @@ -73,8 +74,9 @@ public class ProgressBar extends AbstractComponent { /** * @see org.olat.core.gui.components.Component#dispatchRequest(org.olat.core.gui.UserRequest) */ + @Override protected void doDispatchRequest(UserRequest ureq) { - // + // } /** @@ -112,66 +114,62 @@ public class ProgressBar extends AbstractComponent { * @param string */ public void setUnitLabel(String string) { - // FIXME:fj:a remove all those unnecessary setters, put them in the - // constructor setDirty(true); unitLabel = string; } + /** + * @return + */ + public int getWidth() { + return width; + } + /** * @param i */ - public void setWidth(int i) { - width = i; + public void setWidth(int width) { + this.width = width; + } + + public boolean isWidthInPercent() { + width = 100; + return widthInPercent; + } + + public void setWidthInPercent(boolean widthInPercent) { + this.widthInPercent = widthInPercent; } /** * @return */ - float getActual() { + public float getActual() { return actual; } - String getInfo() { + public String getInfo() { return info; } /** * @return */ - float getMax() { + public float getMax() { return max; } - boolean getIsNoMax() { + public boolean getIsNoMax() { return isNoMax; } /** * @return */ - String getUnitLabel() { + public String getUnitLabel() { return unitLabel; } - /** - * @return - */ - int getWidth() { - return width; - } - - /** - * @see org.olat.core.gui.components.Component#getExtendedDebugInfo() - */ - public String getExtendedDebugInfo() { - return "just a bar"; - } - - public ComponentRenderer getHTMLRendererSingleton() { - return RENDERER; - } - /** * @return percentagesEnabled true: show percentages; false: show only unit labels, no percentags */ @@ -186,4 +184,8 @@ public class ProgressBar extends AbstractComponent { this.percentagesEnabled = percentagesEnabled; } + @Override + public ComponentRenderer getHTMLRendererSingleton() { + return RENDERER; + } } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarItem.java b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarItem.java index aba4462c5f4731515519b7ce377ee53773243494..bed8754af513e26fb3b082b72517726fd7fa7657 100644 --- a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarItem.java +++ b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarItem.java @@ -56,6 +56,10 @@ public class ProgressBarItem extends FormItemImpl { component.setActual(actual); } + public void setWidthInPercent(boolean widthInPercent) { + component.setWidthInPercent(widthInPercent); + } + @Override protected void rootFormAvailable() { // diff --git a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarRenderer.java b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarRenderer.java index e00c313524d2984f1b4a79c557ab20aad6b6f7c8..c2814ae3b01ef8dd6ddd1ba9c85ad608637c02b3 100644 --- a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarRenderer.java +++ b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBarRenderer.java @@ -55,12 +55,19 @@ public class ProgressBarRenderer extends DefaultComponentRenderer { ProgressBar ubar = (ProgressBar) source; boolean renderLabels = (args == null) ? true : false; float percent = 100; - if (!ubar.getIsNoMax()) percent = 100 * ubar.getActual() / ubar.getMax(); - if (percent < 0) percent = 0; - if (percent > 100) percent = 100; + if (!ubar.getIsNoMax()) { + percent = 100 * ubar.getActual() / ubar.getMax(); + } + if (percent < 0) { + percent = 0; + } + if (percent > 100) { + percent = 100; + } target.append("<div class='progress' style=\"width:") .append(ubar.getWidth()) - .append("px;\"><div class='progress-bar' style=\"width:") + .append("%", "px", ubar.isWidthInPercent()) + .append(";\"><div class='progress-bar' style=\"width:") .append(Math.round(percent * ubar.getWidth() / 100)) .append("px\" title=\"") .append(Math.round(percent)) diff --git a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java index 5684ca08ec9408fe2fda6fc1c53308641fec7125..29b0f69afa3664791e38041ae2df91d7474b4ce1 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java @@ -41,12 +41,21 @@ public interface AssessmentToolManager { public AssessmentStatistics getStatistics(Identity coach, SearchAssessedIdentityParams params); /** + * Return the number of + * @param coach + * @param params + * @return + */ + public int getNumberOfAssessedIdentities(Identity coach, SearchAssessedIdentityParams params); + + /** + * Return the number of participants to the course * * @param coach * @param params * @return */ - public int getNumberOfAssessedIndetities(Identity coach, SearchAssessedIdentityParams params); + public int getNumberOfParticipants(Identity coach, SearchAssessedIdentityParams params); /** * The number of user who launched the course / resource diff --git a/src/main/java/org/olat/course/assessment/IndentedNodeRenderer.java b/src/main/java/org/olat/course/assessment/IndentedNodeRenderer.java index 2103d304533f8808d70b4f85e2efa29c21cb40b8..e69a76a8c3badc76ab1f67ba74e3c55c4b1b1054 100644 --- a/src/main/java/org/olat/course/assessment/IndentedNodeRenderer.java +++ b/src/main/java/org/olat/course/assessment/IndentedNodeRenderer.java @@ -90,9 +90,9 @@ public class IndentedNodeRenderer implements CustomCellRenderer, FlexiCellRender sb.append("<i class=\"o_icon ").append(cssClass).append("\"> </i> <span"); if (altText != null) { - sb.append(" title= \"").append(StringHelper.escapeHtml(altText)); + sb.append(" title= \"").append(StringHelper.escapeHtml(altText)).append("\""); } - sb.append("\">").append(StringHelper.escapeHtml(title)).append("</span>"); + sb.append(">").append(StringHelper.escapeHtml(title)).append("</span>"); } private void appendIndent(StringOutput sb, int indent) { diff --git a/src/main/java/org/olat/course/assessment/_content/assessment_index.html b/src/main/java/org/olat/course/assessment/_content/assessment_index.html index 6f69f81445a5754412b40138c061ddb9d8f886f0..a0a4cd4b9d3eceb9ff037f147c91b5c87b9e22e4 100644 --- a/src/main/java/org/olat/course/assessment/_content/assessment_index.html +++ b/src/main/java/org/olat/course/assessment/_content/assessment_index.html @@ -22,4 +22,4 @@ $r.contextHelpWithWrapper("Using Course Tools#_bewertungswerkzeug") #else <p>$r.translate("index.noAssessableNodes")</p> -#end +#end \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/bulk/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/bulk/_i18n/LocalStrings_de.properties index a8591c0a8ce399552d7ff95420066e442b8e91ca..5a3bff0151d7bce3bbdd951699f7ddc1be277cf0 100644 --- a/src/main/java/org/olat/course/assessment/bulk/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/assessment/bulk/_i18n/LocalStrings_de.properties @@ -68,7 +68,7 @@ bulk.wizard.title=Massenbewertung choose.node.desc=W\u00E4hlen Sie einen bewertbaren Baustein aus diesem Kurs f\u00FCr den eine Massenbewertung durchgef\u00FChrt werden soll. choose.node.title=Kursbaustein ausw\u00E4hlen chooseColumns.description=W\u00E4hlen Sie die Spalten Ihrer Bewertungsdaten aus die in diesem Import verwendet werden sollen. -chooseColumns.skip.description=F\u00FCr den gew\u00E4hlten Kursbaustein kann dieser Schritt \u00FCbersprungen werden, es sind keine Punket, Stati oder Kommentare vorhanden die Spalten zugewiesen werden m\u00FCssten. W\u00E4hlen Sie "weiter". +chooseColumns.skip.description=F\u00FCr den gew\u00E4hlten Kursbaustein kann dieser Schritt \u00FCbersprungen werden, es sind keine Punkte, Status oder Kommentare vorhanden die Spalten zugewiesen werden m\u00FCssten. W\u00E4hlen Sie "Weiter". chooseColumns.title=Spaltenzuweisung column=Spalte {0} column.dontuse=Ignorieren diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java index dd441c9473522c09ef5c1c4cbc1e355c01b41478..da74d28afd8ab6df8445232cf1c95c4a8275019c 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java @@ -33,7 +33,6 @@ import org.olat.core.util.StringHelper; import org.olat.course.assessment.AssessmentToolManager; import org.olat.course.assessment.model.AssessmentStatistics; import org.olat.course.assessment.model.SearchAssessedIdentityParams; -import org.olat.course.assessment.model.UserCourseInfosImpl; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.repository.RepositoryEntry; @@ -55,7 +54,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { private DB dbInstance; @Override - public int getNumberOfAssessedIndetities(Identity coach, SearchAssessedIdentityParams params) { + public int getNumberOfAssessedIdentities(Identity coach, SearchAssessedIdentityParams params) { //count all possible participants for the coach permissions TypedQuery<Long> countUsers = createAssessedIdentities(coach, params, Long.class); int numOfAssessedIdentites = 0; @@ -65,14 +64,69 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { } return numOfAssessedIdentites; } - + + + @Override + public int getNumberOfParticipants(Identity coach, SearchAssessedIdentityParams params) { + RepositoryEntry courseEntry = params.getEntry(); + + int numOfParticipants = 0; + if(params.isAdmin()) { + StringBuilder sb = new StringBuilder(); + sb.append("select count(participant.identity.key) from repoentrytogroup as rel") + .append(" inner join rel.group as bGroup") + .append(" inner join bGroup.members as participant on (participant.role='").append(GroupRoles.participant.name()).append("')") + .append(" where rel.entry.key=:repoEntryKey)"); + + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Number.class) + .setParameter("repoEntryKey", courseEntry.getKey()) + .getResultList(); + numOfParticipants = count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); + + //count the users which login but are not members of the course + if(params.isNonMembers()) { + StringBuilder sc = new StringBuilder(); + sc.append("select count(infos.key) from usercourseinfos as infos ") + .append(" inner join infos.resource as infosResource on (infosResource.key=:resourceKey)") + .append(" where not exists (select membership.identity from repoentrytogroup as rel, bgroupmember as membership") + .append(" where rel.entry.key=:repoEntryKey and rel.group.key=membership.group.key and membership.identity.key=infos.identity.key") + .append(" )"); + + List<Number> countAlt = dbInstance.getCurrentEntityManager() + .createQuery(sc.toString(), Number.class) + .setParameter("repoEntryKey", courseEntry.getKey()) + .setParameter("resourceKey", courseEntry.getOlatResource().getKey()) + .getResultList(); + numOfParticipants += countAlt == null || countAlt.isEmpty() || countAlt.get(0) == null ? 0 : countAlt.get(0).intValue(); + } + + } else if(params.isBusinessGroupCoach() || params.isRepositoryEntryCoach()) { + StringBuilder sb = new StringBuilder(); + sb.append("select count(participant.identity.key) from repoentrytogroup as rel") + .append(" inner join rel.group as bGroup") + .append(" inner join bGroup.members as coach on (coach.identity.key=:identityKey and coach.role='").append(GroupRoles.coach.name()).append("')") + .append(" inner join bGroup.members as participant on (participant.role='").append(GroupRoles.participant.name()).append("')") + .append(" where rel.entry.key=:repoEntryKey)"); + + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Number.class) + .setParameter("identityKey", coach.getKey()) + .setParameter("repoEntryKey", courseEntry.getKey()) + .getResultList(); + numOfParticipants = count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); + } + return numOfParticipants; + } + @Override public int getNumberOfInitialLaunches(Identity coach, SearchAssessedIdentityParams params) { RepositoryEntry courseEntry = params.getEntry(); StringBuilder sf = new StringBuilder(); - sf.append("select count(infos.key), infos.resource.key from ").append(UserCourseInfosImpl.class.getName()).append(" as infos ") - .append(" where infos.resource.key=:resourceKey and (infos.identity in"); + sf.append("select count(infos.key), infosResource.key from usercourseinfos as infos ") + .append(" inner join infos.resource as infosResource on (infosResource.key=:resourceKey)") + .append(" where (infos.identity in"); if(params.isAdmin()) { sf.append(" (select participant.identity from repoentrytogroup as rel, bgroupmember as participant") .append(" where rel.entry.key=:repoEntryKey and rel.group=participant.group") @@ -80,17 +134,17 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { .append(" )"); if(params.isNonMembers()) { sf.append(" or not exists (select membership.identity from repoentrytogroup as rel, bgroupmember as membership") - .append(" where rel.entry.key=:repoEntryKey and rel.group=membership.group and membership.identity=infos.identity") + .append(" where rel.entry.key=:repoEntryKey and rel.group.key=membership.group.key and membership.identity.key=infos.identity.key") .append(" )"); } } else if(params.isBusinessGroupCoach() || params.isRepositoryEntryCoach()) { sf.append(" (select participant.identity from repoentrytogroup as rel, bgroupmember as participant, bgroupmember as coach") .append(" where rel.entry.key=:repoEntryKey") - .append(" and rel.group=coach.group and coach.role='").append(GroupRoles.coach.name()).append("' and coach.identity.key=:identityKey") - .append(" and rel.group=participant.group and participant.role='").append(GroupRoles.participant.name()).append("'") + .append(" and rel.group.key=coach.group.key and coach.role='").append(GroupRoles.coach.name()).append("' and coach.identity.key=:identityKey") + .append(" and rel.group.key=participant.group.key and participant.role='").append(GroupRoles.participant.name()).append("'") .append(" )"); } - sf.append(" ) group by infos.resource.key"); + sf.append(" ) group by infosResource.key"); TypedQuery<Object[]> infos = dbInstance.getCurrentEntityManager() .createQuery(sf.toString(), Object[].class) diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java index 983ebabeb7d8a014f77735d0db81ad1078dbeb18..81de92bfc96d0d57e9fe6c0f8d7927b9c99e5617 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseOverviewController.java @@ -19,8 +19,6 @@ */ package org.olat.course.assessment.ui.tool; -import java.util.List; - import org.olat.core.commons.services.notifications.PublisherData; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; @@ -33,9 +31,6 @@ 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.context.ContextEntry; -import org.olat.core.id.context.StateEntry; import org.olat.core.util.Util; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -55,7 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class AssessmentCourseOverviewController extends BasicController implements Activateable2 { +public class AssessmentCourseOverviewController extends BasicController { 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"); @@ -119,6 +114,7 @@ public class AssessmentCourseOverviewController extends BasicController implemen int numOfAssessedIdentities = statisticsCtrl.getNumOfAssessedIdentities(); assessedIdentitiesLink = LinkFactory.createLink("assessed.identities", "assessed.identities", getTranslator(), mainVC, this, Link.NONTRANSLATED); assessedIdentitiesLink.setCustomDisplayText(translate("assessment.tool.numOfAssessedIdentities", new String[]{ Integer.toString(numOfAssessedIdentities) })); + assessedIdentitiesLink.setElementCssClass("o_sel_assessment_tool_assessed_users"); assessedIdentitiesLink.setIconLeftCSS("o_icon o_icon_user"); int numOfPassed = statisticsCtrl.getNumOfPassed(); @@ -157,11 +153,6 @@ public class AssessmentCourseOverviewController extends BasicController implemen // } - @Override - public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - // - } - @Override protected void event(UserRequest ureq, Controller source, Event event) { if(toReviewCtrl == source) { @@ -184,4 +175,4 @@ public class AssessmentCourseOverviewController extends BasicController implemen fireEvent(ureq, SELECT_FAILED_EVENT); } } -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseStatisticsSmallController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseStatisticsSmallController.java index 6f853764e3cc373ccea26216b5f96a404e206510..ea7e34e0f4781fa8c7fc51080659c140dd9cf333 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseStatisticsSmallController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentCourseStatisticsSmallController.java @@ -50,6 +50,7 @@ public class AssessmentCourseStatisticsSmallController extends BasicController { private int numOfPassed; private int numOfFailed; + private int numOfParticipants; private int numOfAssessedIdentities; @Autowired @@ -78,25 +79,32 @@ public class AssessmentCourseStatisticsSmallController extends BasicController { return numOfAssessedIdentities; } + public int getNumOfParticipants() { + return numOfParticipants; + } + public void updateStatistics() { ICourse course = CourseFactory.loadCourse(courseEntry); String rootNodeIdent = course.getRunStructure().getRootNode().getIdent(); SearchAssessedIdentityParams params = new SearchAssessedIdentityParams(courseEntry, rootNodeIdent, null, assessmentCallback); - numOfAssessedIdentities = assessmentToolManager.getNumberOfAssessedIndetities(getIdentity(), params); + numOfAssessedIdentities = assessmentToolManager.getNumberOfAssessedIdentities(getIdentity(), params); mainVC.contextPut("numOfAssessedIdentities", numOfAssessedIdentities); + numOfParticipants = assessmentToolManager.getNumberOfParticipants(getIdentity(), params); + mainVC.contextPut("numOfParticipants", numOfParticipants); + AssessmentStatistics stats = assessmentToolManager.getStatistics(getIdentity(), params); mainVC.contextPut("scoreAverage", AssessmentHelper.getRoundedScore(stats.getAverageScore())); numOfPassed = stats.getCountPassed(); mainVC.contextPut("numOfPassed", numOfPassed); - int percentPassed = numOfAssessedIdentities == 0 ? 0 : - Math.round(100.0f * (stats.getCountPassed() / numOfAssessedIdentities)); + int percentPassed = numOfParticipants == 0 ? 0 : + Math.round(100.0f * (stats.getCountPassed() / numOfParticipants)); mainVC.contextPut("percentPassed", percentPassed); numOfFailed = stats.getCountFailed(); mainVC.contextPut("numOfFailed", numOfFailed); - int percentFailed = numOfAssessedIdentities == 0 ? 0 : - Math.round(100.0f * (stats.getCountFailed() / numOfAssessedIdentities)); + int percentFailed = numOfParticipants == 0 ? 0 : + Math.round(100.0f * (stats.getCountFailed() / numOfParticipants)); mainVC.contextPut("percentFailed", percentFailed); int numOfLaunches = assessmentToolManager.getNumberOfInitialLaunches(getIdentity(), params); diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentForm.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentForm.java index 835881965ad9bb8645d7310c70c60d9ca5d73c6b..712a0dcf7b342ba5ff0708b5576052b874be189f 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentForm.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentForm.java @@ -141,7 +141,9 @@ public class AssessmentForm extends FormBasicController { public boolean isScoreDirty() { if (!hasScore) return false; - if (scoreValue == null) return !score.getValue().equals(""); + if (scoreValue == null) { + return StringHelper.containsNonWhitespace(score.getValue()); + } return parseFloat(score) != scoreValue.floatValue(); } @@ -232,38 +234,34 @@ public class AssessmentForm extends FormBasicController { } protected void doUpdateAssessmentData() { - ScoreEvaluation scoreEval = null; - Float newScore = null; - Boolean newPassed = null; + Float updatedScore = null; + Boolean updatedPassed = null; if (isHasAttempts() && isAttemptsDirty()) { assessableCourseNode.updateUserAttempts(new Integer(getAttempts()), assessedUserCourseEnv, getIdentity()); } - if (isHasScore() && isScoreDirty()) { - newScore = getScore(); - // Update properties in db later... see - // courseNode.updateUserSocreAndPassed... + if (isHasScore()) { + if(isScoreDirty()) { + updatedScore = getScore(); + } else { + updatedScore = scoreValue; + } } if (isHasPassed()) { if (getCut() != null && getScore() != null) { - newPassed = getScore() >= getCut().floatValue() - ? Boolean.TRUE : Boolean.FALSE; + updatedPassed = updatedScore.floatValue() >= getCut().floatValue() ? Boolean.TRUE : Boolean.FALSE; } else { - //"passed" info was changed or not + //"passed" info was changed or not String selectedKeyString = getPassed().getSelectedKey(); if("true".equalsIgnoreCase(selectedKeyString) || "false".equalsIgnoreCase(selectedKeyString)) { - newPassed = Boolean.valueOf(selectedKeyString); - } - else { - // "undefined" was choosen - newPassed = null; - } + updatedPassed = Boolean.valueOf(selectedKeyString); + } } } // Update score,passed properties in db - scoreEval = new ScoreEvaluation(newScore, newPassed); + ScoreEvaluation scoreEval = new ScoreEvaluation(updatedScore, updatedPassed); assessableCourseNode.updateUserScoreEvaluation(scoreEval, assessedUserCourseEnv, getIdentity(), false); if (isHasComment() && isUserCommentDirty()) { diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java index 423ea79b6e4f9d7975b68cd9a7714c2997758557..507eaf8151faf2f1519d01d0a7bb0642f0d14f42 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java @@ -151,8 +151,10 @@ public class AssessmentIdentityCourseController extends BasicController implemen if(event == Event.DONE_EVENT) { treeOverviewCtrl.doIdentityAssessmentOverview(ureq); stackPanel.popController(currentNodeCtrl); + fireEvent(ureq, Event.CHANGED_EVENT); } else if(event == Event.CHANGED_EVENT) { treeOverviewCtrl.doIdentityAssessmentOverview(ureq); + fireEvent(ureq, Event.CHANGED_EVENT); } else if(event == Event.CANCELLED_EVENT) { stackPanel.popController(currentNodeCtrl); } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityListCourseTreeController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityListCourseTreeController.java index 1197ead484c93f4fd63abdc884ddb2cbe65ee0a0..649719bc7fead67da2dc5ca6dd039d8450b26396 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityListCourseTreeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityListCourseTreeController.java @@ -97,7 +97,8 @@ public class AssessmentIdentityListCourseTreeController extends BasicController @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - if(entries == null || entries.isEmpty()) { + boolean emptyEntries = entries == null || entries.isEmpty(); + if(emptyEntries) { TreeNode rootNode = menuTree.getTreeModel().getRootNode(); if(rootNode.getUserObject() instanceof CourseNode) { doSelectCourseNode(ureq, (CourseNode)rootNode.getUserObject()); @@ -108,17 +109,16 @@ public class AssessmentIdentityListCourseTreeController extends BasicController Long nodeIdent = entries.get(0).getOLATResourceable().getResourceableId(); CourseNode courseNode = CourseFactory.loadCourse(courseEntry).getRunStructure().getNode(nodeIdent.toString()); if(courseNode != null) { - Controller ctrl = doSelectCourseNode(ureq, courseNode); - if(ctrl instanceof Activateable2) { - List<ContextEntry> subEntries = entries.subList(1, entries.size()); - ((Activateable2)ctrl).activate(ureq, subEntries, null); - } + doSelectCourseNode(ureq, courseNode); } } } if(currentCtrl instanceof Activateable2) { - ((Activateable2)currentCtrl).activate(ureq, entries, state); + List<ContextEntry> subEntries = emptyEntries + ? entries : entries.subList(1, entries.size()); + StateEntry subState = emptyEntries ? state : entries.get(0).getTransientState(); + ((Activateable2)currentCtrl).activate(ureq, subEntries, subState); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java index 9bfcc7803b0ddd8734a9ce4393aed692fb4c2918..5f53fd56ea5df3b7ce723f84095d4d9fd88ef5f7 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentToolController.java @@ -103,8 +103,12 @@ public class AssessmentToolController extends MainLayoutBasicController implemen @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - if(entries == null || entries.size() == 0) { - // + if(entries == null || entries.size() == 0) return; + + String resName = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("Users".equalsIgnoreCase(resName)) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + doSelectUsersView(ureq).activate(ureq, subEntries, entries.get(0).getTransientState()); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java index 03ccba1573b2d594154fdd4f9435e416bfb36433..9ab0290fecfa57841d3568e0da8735f976346d69 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java @@ -38,10 +38,12 @@ import org.olat.core.id.Identity; import org.olat.core.id.IdentityEnvironment; import org.olat.core.id.Roles; import org.olat.core.util.Formatter; +import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; import org.olat.course.CourseFactory; import org.olat.course.ICourse; +import org.olat.course.assessment.AssessmentMainController; import org.olat.course.certificate.Certificate; import org.olat.course.certificate.CertificateEvent; import org.olat.course.certificate.CertificateTemplate; @@ -56,6 +58,7 @@ import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.repository.RepositoryEntry; +import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; /** @@ -79,6 +82,8 @@ public class IdentityCertificatesController extends BasicController implements G private final boolean canDelete; private final Formatter formatter; + @Autowired + private UserManager userManager; @Autowired private BaseSecurity securityManager; @Autowired @@ -87,6 +92,7 @@ public class IdentityCertificatesController extends BasicController implements G public IdentityCertificatesController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry, Identity assessedIdentity) { super(ureq, wControl); + setTranslator(Util.createPackageTranslator(AssessmentMainController.class, getLocale(), getTranslator())); this.courseEntry = courseEntry; this.assessedIdentity = assessedIdentity; @@ -196,7 +202,8 @@ public class IdentityCertificatesController extends BasicController implements G doGenerateCertificate(ureq); } else { String title = translate("confirm.certificate.title"); - String text = translate("confirm.certificate.text"); + String fullName = userManager.getUserDisplayName(assessedIdentity); + String text = translate("confirm.certificate.description", new String[] { fullName }); confirmCertificateCtrl = activateYesNoDialog(ureq, title, text, confirmCertificateCtrl); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java index edf21f8c67d4fb8576013c8c5c0370938ea3115c..90d8e34cb477988d7f005e3fe5d96a6e0a26a28a 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java @@ -53,10 +53,12 @@ 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.OLATResourceable; 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.core.util.resource.OresHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentMainController; @@ -77,9 +79,9 @@ import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.ui.AssessedIdentityController; import org.olat.modules.assessment.ui.AssessedIdentityElementRow; import org.olat.modules.assessment.ui.AssessedIdentityListState; +import org.olat.modules.assessment.ui.AssessmentToolContainer; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; import org.olat.modules.assessment.ui.ScoreCellRenderer; -import org.olat.modules.assessment.ui.AssessmentToolContainer; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; import org.olat.user.UserManager; @@ -316,6 +318,7 @@ public class IdentityListCourseNodeController extends FormBasicController implem private void updateModel(UserRequest ureq, Identity assessedIdentity) { updateModel(ureq, null, null, null); } + /* private boolean accept(AssessmentEntry entry, SearchAssessedIdentityParams params) { boolean ok = true; @@ -479,9 +482,11 @@ public class IdentityListCourseNodeController extends FormBasicController implem Identity assessedIdentity = securityManager.loadIdentityByKey(row.getIdentityKey()); String fullName = userManager.getUserDisplayName(assessedIdentity); - + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Identity", assessedIdentity.getKey()); + WindowControl bwControl = addToHistory(ureq, ores, null); if(courseNode.getParent() == null) { - currentIdentityCtrl = new AssessmentIdentityCourseController(ureq, getWindowControl(), stackPanel, + currentIdentityCtrl = new AssessmentIdentityCourseController(ureq, bwControl, stackPanel, courseEntry, assessedIdentity); } else { currentIdentityCtrl = new AssessmentIdentityCourseNodeController(ureq, getWindowControl(), stackPanel, diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html index f26184cfff7eb4f113843433f5dbe6964be21810..5b16e6a523a5262a38c7ae5bd2f16b7ebd8d7a1f 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html +++ b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_overview.html @@ -1,3 +1,4 @@ +<div id="o_assessment_tool_main"> $r.contextHelpWithWrapper("Using Course Tools#_bewertungswerkzeug") <h2><i class="o_icon o_icon_assessment_tool"> </i> $r.translate("assessment.tool.overview")</h2> #if(!$hasAssessableNodes) @@ -56,3 +57,4 @@ $r.contextHelpWithWrapper("Using Course Tools#_bewertungswerkzeug") <div class="col-sm-6"></div> #end </div> +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_stats_small.html b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_stats_small.html index b489df0b55447270478a754c2c347187e4878386..2f044dd1b813158f929e3046ba148f78518b573b 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_content/course_stats_small.html +++ b/src/main/java/org/olat/course/assessment/ui/tool/_content/course_stats_small.html @@ -4,15 +4,15 @@ </div> <table class="table"> <tr> - <th>$r.translate("table.header.numOfAssessedIdentities")</th> - <td>$numOfAssessedIdentities</td> + <th>$r.translate("table.header.numOfParticipants")</th> + <td>$numOfParticipants</td> </tr> <tr> <th>$r.translate("table.header.numOfInitialLaunch")</th> <td> #if($numOfInitialLaunch && $numOfInitialLaunch == 0) <i class="o_icon o_green_led"> </i> - #elseif($numOfInitialLaunch && $numOfInitialLaunch == $numOfAssessedIdentities) + #elseif($numOfInitialLaunch && $numOfInitialLaunch == $numOfParticipants) <i class="o_icon o_red_led"> </i> #else <i class="o_icon o_yellow_led"> </i> @@ -27,13 +27,13 @@ <th>$r.translate("table.header.numOfPassed")</th> <td><div class="progress" title=""> #if($numOfPassed && $numOfPassed > 0) - <div class="progress-bar" role="progressbar" aria-valuenow="$numOfPassed" aria-valuemin="0" aria-valuemax="$numOfAssessedIdentities" style="width: ${percentPassed}%;"> + <div class="progress-bar" role="progressbar" aria-valuenow="$numOfPassed" aria-valuemin="0" aria-valuemax="$numOfParticipants" style="width: ${percentPassed}%;"> <span class="sr-only">${percentPassed}%</span> </div> #end #if($numOfFailed && $numOfFailed > 0) - <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="$numOfFailed" aria-valuemin="0" aria-valuemax="$numOfAssessedIdentities" style="width: ${percentFailed}%;"> + <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="$numOfFailed" aria-valuemin="0" aria-valuemax="$numOfParticipants" style="width: ${percentFailed}%;"> <span class="sr-only">${percentFailed}%</span> </div> #end diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties index 6dd8a379cd6db06a013e4074c6b951deadaff4d4..28796be8a51c316a61a3648d573992ce5763a931 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties @@ -1,38 +1,42 @@ -#Mon Mar 02 09:54:04 CET 2009 -certificate=Zertifikate -generate.certificate=Zertifikat erzeugen -command.next=Weiter zu nächste Benutzer -command.previous=Zurück zum letzten Benutzer -users=Benutzer -table.header.name=Benutzername -statistics.small.overview=Statistiken Übersicht -table.header.numOfAssessedIdentities=$org.olat.modules.assessment.ui\:table.header.numOfAssessedIdentities -table.header.numOfPassed=$org.olat.modules.assessment.ui\:table.header.numOfPassed -table.header.scoreAverage=$org.olat.modules.assessment.ui\:table.header.scoreAverage -table.header.numOfInitialLaunch=$org.olat.modules.assessment.ui\:table.header.numOfInitialLaunch -table.header.assessmentStatus=$org.olat.modules.assessment.ui\:table.header.assessmentStatus -table.header.elements.toReview=Elementen -assessment.status.notStart=$org.olat.modules.assessment.ui\:assessment.status.notStart +#Fri Aug 05 08:43:51 CEST 2016 +assessment.status.done=$org.olat.modules.assessment.ui\:assessment.status.done assessment.status.inProgress=$org.olat.modules.assessment.ui\:assessment.status.inProgress assessment.status.inReview=$org.olat.modules.assessment.ui\:assessment.status.inReview -assessment.status.done=$org.olat.modules.assessment.ui\:assessment.status.done -assessment.tool.overview=Ubersicht -assessment.tool.numOfAssessedIdentities=$org.olat.modules.assessment.ui\:assessment.tool.numOfAssessedIdentities +assessment.status.notStart=$org.olat.modules.assessment.ui\:assessment.status.notStart assessment.tool.numOfAssessedGroups=$org.olat.modules.assessment.ui\:assessment.tool.numOfAssessedGroups -assessment.tool.numOfPassed=$org.olat.modules.assessment.ui\:assessment.tool.numOfPassed +assessment.tool.numOfAssessedIdentities=$org.olat.modules.assessment.ui\:assessment.tool.numOfAssessedIdentities assessment.tool.numOfFailed=$org.olat.modules.assessment.ui\:assessment.tool.numOfFailed -table.entries=Einträge -waiting.review=$org.olat.modules.assessment.ui\:waiting.review -no.certificate=Kein Zertifikat vorhanden -elements.to.review=<i class="o_icon o_icon_warning"> </i> {0} unerledigt -sub.details=Details -previous=Zurück +assessment.tool.numOfPassed=$org.olat.modules.assessment.ui\:assessment.tool.numOfPassed +assessment.tool.overview=\u00DCbersicht +certificate=Zertifikate +confirm.certificate.deleted=$org.olat.course.certificate.ui\:confirm.certificate.deleted +certificates.wizard.title=$org.olat.course.certificate.ui\:certificates.wizard.title +confirm.delete.certificate.title=$org.olat.course.certificate.ui\:confirm.delete.certificate.title +confirm.delete.certificate.text=$org.olat.course.certificate.ui\:confirm.delete.certificate.text +command.next=Weiter zu n\u00E4chste Benutzer +command.previous=Zur\u00FCck zum letzten Benutzer +elements.to.review=<i class\="o_icon o_icon_warning"> </i> {0} unerledigt filter=$org.olat.modules.assessment.ui\:filter -filter.passed=$org.olat.modules.assessment.ui\:filter.passed +filter.done=$org.olat.modules.assessment.ui\:filter.done filter.failed=$org.olat.modules.assessment.ui\:filter.failed +filter.groups=$org.olat.modules.assessment.ui\:filter.groups filter.inProgress=$org.olat.modules.assessment.ui\:filter.inProgress filter.inReview=$org.olat.modules.assessment.ui\:filter.inReview -filter.done=$org.olat.modules.assessment.ui\:filter.done -filter.groups=$org.olat.modules.assessment.ui\:filter.groups -certificates.wizard.title=$org.olat.course.certificate.ui\:certificates.wizard.title +filter.passed=$org.olat.modules.assessment.ui\:filter.passed generate.certificate=$org.olat.course.certificate.ui\:generate.certificate +no.certificate=Kein Zertifikat vorhanden +msg.certificate.pending=$org.olat.course.certificate.ui\:msg.certificate.pending +previous=Zur\u00FCck +statistics.small.overview=Statistiken \u00DCbersicht +sub.details=Details +table.entries=Eintr\u00E4ge +table.header.assessmentStatus=$org.olat.modules.assessment.ui\:table.header.assessmentStatus +table.header.elements.toReview=Element +table.header.name=Benutzername +table.header.numOfParticipants=$org.olat.modules.assessment.ui\:table.header.numOfParticipants +table.header.numOfAssessedIdentities=$org.olat.modules.assessment.ui\:table.header.numOfAssessedIdentities +table.header.numOfInitialLaunch=$org.olat.modules.assessment.ui\:table.header.numOfInitialLaunch +table.header.numOfPassed=$org.olat.modules.assessment.ui\:table.header.numOfPassed +table.header.scoreAverage=$org.olat.modules.assessment.ui\:table.header.scoreAverage +users=Benutzer / Kursstruktur +waiting.review=$org.olat.modules.assessment.ui\:waiting.review diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties index f8c8f7ed80b0dfb4f9fe0b3600b5ae48d6e050ae..055d78faebda0aaf8efea51cfeb34d5200c11ab8 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties @@ -1,4 +1,4 @@ -#Tue Jun 28 15:08:56 CEST 2016 +#Fri Aug 05 08:44:19 CEST 2016 assessment.status.done=$org.olat.modules.assessment.ui\:assessment.status.done assessment.status.inProgress=$org.olat.modules.assessment.ui\:assessment.status.inProgress assessment.status.inReview=$org.olat.modules.assessment.ui\:assessment.status.inReview @@ -10,6 +10,9 @@ assessment.tool.numOfPassed=$org.olat.modules.assessment.ui\:assessment.tool.num assessment.tool.overview=Overview certificate=Certificates certificates.wizard.title=$org.olat.course.certificate.ui\:certificates.wizard.title +confirm.certificate.deleted=$org.olat.course.certificate.ui\:confirm.certificate.deleted +confirm.delete.certificate.title=$org.olat.course.certificate.ui\:confirm.delete.certificate.title +confirm.delete.certificate.text=$org.olat.course.certificate.ui\:confirm.delete.certificate.text command.next=To the next user command.previous=Back to previous user elements.to.review=<i class\="o_icon o_icon_warning"> </i> {0} pending @@ -22,6 +25,7 @@ filter.inReview=$org.olat.modules.assessment.ui\:filter.inReview filter.passed=$org.olat.modules.assessment.ui\:filter.passed generate.certificate=$org.olat.course.certificate.ui\:generate.certificate no.certificate=No certificate available +msg.certificate.pending=$org.olat.course.certificate.ui\:msg.certificate.pending previous=Previous statistics.small.overview=Statistics overview sub.details=Details @@ -29,9 +33,10 @@ table.entries=Entries table.header.assessmentStatus=$org.olat.modules.assessment.ui\:table.header.assessmentStatus table.header.elements.toReview=Elements table.header.name=User name +table.header.numOfParticipants=$org.olat.modules.assessment.ui\:table.header.numOfParticipants table.header.numOfAssessedIdentities=$org.olat.modules.assessment.ui\:table.header.numOfAssessedIdentities table.header.numOfInitialLaunch=$org.olat.modules.assessment.ui\:table.header.numOfInitialLaunch table.header.numOfPassed=$org.olat.modules.assessment.ui\:table.header.numOfPassed table.header.scoreAverage=$org.olat.modules.assessment.ui\:table.header.scoreAverage -users=Users +users=Users / course structure waiting.review=$org.olat.modules.assessment.ui\:waiting.review diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java index 7fa24cd3170d57f3eaacf0d4afcb015d6d352c06..de5999bc8fedc7d968ebe3636f0e03ff5cd2fe05 100644 --- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java @@ -88,6 +88,7 @@ import org.olat.ims.qti.statistics.ui.QTI12StatisticsToolController; import org.olat.ims.qti21.model.QTI21StatisticSearchParams; import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController; import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult; +import org.olat.ims.qti21.ui.statistics.QTI21StatisticsToolController; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.iq.IQSecurityCallback; @@ -200,12 +201,29 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe public List<Controller> createAssessmentTools(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, CourseEnvironment courseEnv, AssessmentToolOptions options) { List<Controller> tools = new ArrayList<>(); - tools.add(new QTI12StatisticsToolController(ureq, wControl, stackPanel, courseEnv, options, this)); - if(options.getGroup() == null && options.getIdentities() != null && options.getIdentities().size() > 0) { - for(Identity assessedIdentity:options.getIdentities()) { - if(isTestRunning(assessedIdentity, courseEnv)) { - tools.add(new QTI12PullTestsToolController(ureq, wControl, courseEnv, options, this)); - break; + + RepositoryEntry qtiTestEntry = getReferencedRepositoryEntry(); + if(ImsQTI21Resource.TYPE_NAME.equals(qtiTestEntry.getOlatResource().getResourceableTypeName())) { + tools.add(new QTI21StatisticsToolController(ureq, wControl, stackPanel, courseEnv, options, this)); + + + /*if(options.getGroup() == null && options.getIdentities() != null && options.getIdentities().size() > 0) { + for(Identity assessedIdentity:options.getIdentities()) { + if(isTestRunning(assessedIdentity, courseEnv)) { + tools.add(new QTI12PullTestsToolController(ureq, wControl, courseEnv, options, this)); + break; + } + } + }*/ + + } else { + tools.add(new QTI12StatisticsToolController(ureq, wControl, stackPanel, courseEnv, options, this)); + if(options.getGroup() == null && options.getIdentities() != null && options.getIdentities().size() > 0) { + for(Identity assessedIdentity:options.getIdentities()) { + if(isTestRunning(assessedIdentity, courseEnv)) { + tools.add(new QTI12PullTestsToolController(ureq, wControl, courseEnv, options, this)); + break; + } } } } diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 410ae3772501119526a2f2842b8adb928a6cc45f..af3e3eb22d0f358985b8c5b23d2d490ea2f1a7d2 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -150,7 +150,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im //tools private Link folderLink, - assessmentLink, assessment_v2_Link, archiverLink, + assessmentLink, assessment_v2_Link, archiverLink, courseStatisticLink, surveyStatisticLink, testStatisticLink, areaLink, dbLink, //settings @@ -431,11 +431,11 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im tools.addComponent(membersLink); } if (reSecurity.isEntryAdmin() || reSecurity.isCourseCoach() || reSecurity.isGroupCoach() || hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) { - assessmentLink = LinkFactory.createToolLink("assessment",translate("command.openassessment"), this, "o_icon_assessment_tool"); - assessmentLink.setElementCssClass("o_sel_course_assessment_tool"); - tools.addComponent(assessmentLink); - assessment_v2_Link = LinkFactory.createToolLink("assessment", translate("command.openassessment") + " v2", this, "o_icon_assessment_tool"); + assessmentLink = LinkFactory.createToolLink("assessment", "<del>" + translate("command.openassessment") + "</del>", this, "o_icon_assessment_tool"); + tools.addComponent(assessmentLink); + + assessment_v2_Link = LinkFactory.createToolLink("assessment", translate("command.openassessment"), this, "o_icon_assessment_tool"); assessment_v2_Link.setElementCssClass("o_sel_course_assessment_tool"); tools.addComponent(assessment_v2_Link); diff --git a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties index 29f0a2b547d20dad84bfe11490bc641b0b69858b..223c8899f449bc5e5606402dff1ac389de647878 100644 --- a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties @@ -204,7 +204,7 @@ form.imd.title=Titel form.imd.error.empty.title=Bitte geben Sie einen Titel ein form.imd.tries=Anzahl L\u00F6sungsversuche form.imd.type=Typ -form.metadata.cutvalue=Notwendige Punktzahl für 'bestanden' +form.metadata.cutvalue=Notwendige Punktzahl für Bestanden' form.metadata.duration=Zeitbeschr\u00E4nkung form.metadata.globalfeedbackNsolution=Feedback / Lösungen f\u00FCr gesamten Test setzen form.metadata.globalfeedbackNsolution.hover=Bestimmen Sie, ob Feedback und Lösungen grundsätzlich dem Benutzer angezeigt werden sollen. diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties index 124433223caa40943583f805c12763a66d009ec1..0f4a50255407b48d061da051df2d95ce35d8b699 100644 --- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties @@ -27,7 +27,7 @@ chart.questions=Fragen chart.duration=Bearbeitungs-Dauer in Sekunden chart.percent=Prozent chart.maxscore=Maximale Punktzahl -chart.cutscore=Notwendige Punktzahl für "bestanden" +chart.cutscore=Notwendige Punktzahl für "Bestanden" chart.title.ovpassedfailed=Bestanden / Nicht bestanden diff --git a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java index e00e209284f0684f60d6daf97fd9338508c59861..d20bc88e1a2a3d8aab292fd1cf6e9363ef8c9836 100644 --- a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java +++ b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java @@ -54,8 +54,8 @@ import org.olat.ims.qti21.QTI21Constants; import org.olat.ims.qti21.manager.CorrectResponsesUtil; import org.olat.ims.qti21.model.QTI21QuestionType; import org.olat.ims.qti21.model.xml.AssessmentHtmlBuilder; -import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.model.xml.AssessmentTestBuilder; +import org.olat.ims.qti21.model.xml.QtiNodesExtractor; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.NumericalEntry; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.TextEntry; @@ -294,7 +294,7 @@ public class QTI21WordExport implements MediaResource { default: typeDescription = null; break; } - Double maxScore = AssessmentItemFactory.extractMaxScore(item); + Double maxScore = QtiNodesExtractor.extractMaxScore(item); if(StringHelper.containsNonWhitespace(typeDescription) || maxScore != null) { if(StringHelper.containsNonWhitespace(typeDescription)) { diff --git a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemFactory.java b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemFactory.java index ad76301de3380b322f4828eac1af43a8c756a0cb..fdb7b9fce14a1411792a78be4a377b7243cebca2 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemFactory.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemFactory.java @@ -20,7 +20,6 @@ package org.olat.ims.qti21.model.xml; import static org.olat.ims.qti21.QTI21Constants.MAXSCORE_CLX_IDENTIFIER; -import static org.olat.ims.qti21.QTI21Constants.MAXSCORE_IDENTIFIER; import static org.olat.ims.qti21.QTI21Constants.MINSCORE_CLX_IDENTIFIER; import static org.olat.ims.qti21.QTI21Constants.SCORE_CLX_IDENTIFIER; import static org.olat.ims.qti21.QTI21Constants.SCORE_IDENTIFIER; @@ -81,7 +80,6 @@ import uk.ac.ed.ph.jqtiplus.node.item.response.processing.ResponseProcessing; import uk.ac.ed.ph.jqtiplus.node.item.response.processing.ResponseRule; import uk.ac.ed.ph.jqtiplus.node.item.response.processing.SetOutcomeValue; import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; -import uk.ac.ed.ph.jqtiplus.node.shared.BaseTypeAndCardinality; import uk.ac.ed.ph.jqtiplus.node.shared.FieldValue; import uk.ac.ed.ph.jqtiplus.node.shared.declaration.DefaultValue; import uk.ac.ed.ph.jqtiplus.node.test.View; @@ -93,11 +91,8 @@ import uk.ac.ed.ph.jqtiplus.value.Cardinality; import uk.ac.ed.ph.jqtiplus.value.DirectedPairValue; import uk.ac.ed.ph.jqtiplus.value.FloatValue; import uk.ac.ed.ph.jqtiplus.value.IdentifierValue; -import uk.ac.ed.ph.jqtiplus.value.MultipleValue; import uk.ac.ed.ph.jqtiplus.value.Orientation; -import uk.ac.ed.ph.jqtiplus.value.SingleValue; import uk.ac.ed.ph.jqtiplus.value.StringValue; -import uk.ac.ed.ph.jqtiplus.value.Value; /** * @@ -1024,41 +1019,7 @@ public class AssessmentItemFactory { return list; } - public static void extractIdentifiersFromCorrectResponse(CorrectResponse correctResponse, List<Identifier> correctAnswers) { - BaseTypeAndCardinality responseDeclaration = correctResponse.getParent(); - if(responseDeclaration.hasCardinality(Cardinality.MULTIPLE)) { - Value value = FieldValue.computeValue(Cardinality.MULTIPLE, correctResponse.getFieldValues()); - if(value instanceof MultipleValue) { - MultipleValue multiValue = (MultipleValue)value; - for(SingleValue sValue:multiValue.getAll()) { - if(sValue instanceof IdentifierValue) { - IdentifierValue identifierValue = (IdentifierValue)sValue; - Identifier correctAnswer = identifierValue.identifierValue(); - correctAnswers.add(correctAnswer); - } - } - } - } else if(responseDeclaration.hasCardinality(Cardinality.SINGLE)) { - Value value = FieldValue.computeValue(Cardinality.SINGLE, correctResponse.getFieldValues()); - if(value instanceof IdentifierValue) { - IdentifierValue identifierValue = (IdentifierValue)value; - correctAnswers.add(identifierValue.identifierValue()); - } - } - } + - public static Double extractMaxScore(AssessmentItem assessmentItem) { - Double maxScore = null; - OutcomeDeclaration outcomeDeclaration = assessmentItem.getOutcomeDeclaration(MAXSCORE_IDENTIFIER); - if(outcomeDeclaration != null) { - DefaultValue defaultValue = outcomeDeclaration.getDefaultValue(); - if(defaultValue != null) { - Value maxScoreValue = defaultValue.evaluate(); - if(maxScoreValue instanceof FloatValue) { - maxScore = new Double(((FloatValue)maxScoreValue).doubleValue()); - } - } - } - return maxScore; - } + } diff --git a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java index dd52049f4d42c26b38772462b807840cb42e1036..f5d0872ca51afc9b3d6e4343e834afd61849b1cd 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java @@ -71,10 +71,15 @@ public class AssessmentTestBuilder { } private void extract() { + extractMaxScore(); extractRules(); extractFeedbacks(); } + private void extractMaxScore() { + maxScore = QtiNodesExtractor.extractMaxScore(assessmentTest); + } + private void extractRules() { if(assessmentTest.getOutcomeProcessing() != null) { List<OutcomeRule> outcomeRules = assessmentTest.getOutcomeProcessing().getOutcomeRules(); diff --git a/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesExtractor.java b/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesExtractor.java new file mode 100644 index 0000000000000000000000000000000000000000..dfd0c019dbb66d9e85873aca038da9ea7dd63e09 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesExtractor.java @@ -0,0 +1,82 @@ +package org.olat.ims.qti21.model.xml; + +import static org.olat.ims.qti21.QTI21Constants.MAXSCORE_IDENTIFIER; +import static org.olat.ims.qti21.QTI21Constants.MINSCORE_IDENTIFIER; + +import java.util.List; + +import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; +import uk.ac.ed.ph.jqtiplus.node.item.CorrectResponse; +import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; +import uk.ac.ed.ph.jqtiplus.node.shared.BaseTypeAndCardinality; +import uk.ac.ed.ph.jqtiplus.node.shared.FieldValue; +import uk.ac.ed.ph.jqtiplus.node.shared.declaration.DefaultValue; +import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; +import uk.ac.ed.ph.jqtiplus.types.Identifier; +import uk.ac.ed.ph.jqtiplus.value.Cardinality; +import uk.ac.ed.ph.jqtiplus.value.FloatValue; +import uk.ac.ed.ph.jqtiplus.value.IdentifierValue; +import uk.ac.ed.ph.jqtiplus.value.MultipleValue; +import uk.ac.ed.ph.jqtiplus.value.SingleValue; +import uk.ac.ed.ph.jqtiplus.value.Value; + +/** + * + * This is an helper class which extract data from the java model of QtiWorks. + * + * Initial date: 05.08.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface QtiNodesExtractor { + + public static Double extractMaxScore(AssessmentItem assessmentItem) { + return getOutcomeDeclarationDefaultFloatValue(assessmentItem.getOutcomeDeclaration(MAXSCORE_IDENTIFIER)); + } + + public static Double extractMaxScore(AssessmentTest assessmentTest) { + return getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(MAXSCORE_IDENTIFIER)); + } + + public static Double extractMinScore(AssessmentTest assessmentTest) { + return getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(MINSCORE_IDENTIFIER)); + } + + public static Double getOutcomeDeclarationDefaultFloatValue(OutcomeDeclaration outcomeDeclaration) { + Double doubleValue = null; + if(outcomeDeclaration != null) { + DefaultValue defaultValue = outcomeDeclaration.getDefaultValue(); + if(defaultValue != null) { + Value evaluatedValue = defaultValue.evaluate(); + if(evaluatedValue instanceof FloatValue) { + doubleValue = new Double(((FloatValue)evaluatedValue).doubleValue()); + } + } + } + return doubleValue; + } + + public static void extractIdentifiersFromCorrectResponse(CorrectResponse correctResponse, List<Identifier> correctAnswers) { + BaseTypeAndCardinality responseDeclaration = correctResponse.getParent(); + if(responseDeclaration.hasCardinality(Cardinality.MULTIPLE)) { + Value value = FieldValue.computeValue(Cardinality.MULTIPLE, correctResponse.getFieldValues()); + if(value instanceof MultipleValue) { + MultipleValue multiValue = (MultipleValue)value; + for(SingleValue sValue:multiValue.getAll()) { + if(sValue instanceof IdentifierValue) { + IdentifierValue identifierValue = (IdentifierValue)sValue; + Identifier correctAnswer = identifierValue.identifierValue(); + correctAnswers.add(correctAnswer); + } + } + } + } else if(responseDeclaration.hasCardinality(Cardinality.SINGLE)) { + Value value = FieldValue.computeValue(Cardinality.SINGLE, correctResponse.getFieldValues()); + if(value instanceof IdentifierValue) { + IdentifierValue identifierValue = (IdentifierValue)value; + correctAnswers.add(identifierValue.identifierValue()); + } + } + } + +} diff --git a/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesHelper.java b/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesHelper.java deleted file mode 100644 index 40488fe05f72f02c988b7a6273ac9b392c897028..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/ims/qti21/model/xml/QtiNodesHelper.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * <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.ims.qti21.model.xml; - -import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; -import uk.ac.ed.ph.jqtiplus.node.shared.declaration.DefaultValue; -import uk.ac.ed.ph.jqtiplus.value.FloatValue; -import uk.ac.ed.ph.jqtiplus.value.Value; - -/** - * - * Initial date: 24.05.2016<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class QtiNodesHelper { - - public static Double getOutcomeDeclarationDefaultFloatValue(OutcomeDeclaration outcomeDeclaration) { - Double doubleValue = null; - if(outcomeDeclaration != null) { - DefaultValue defaultValue = outcomeDeclaration.getDefaultValue(); - if(defaultValue != null) { - Value evaluatedValue = defaultValue.evaluate(); - if(evaluatedValue instanceof FloatValue) { - doubleValue = new Double(((FloatValue)evaluatedValue).doubleValue()); - } - } - } - return doubleValue; - } - -} diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java index ef5a88a675d32e45f8b6ccae9817746db1066944..6c9a1543225f33d736aecbefc43f42410b71ca6d 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java @@ -25,7 +25,7 @@ import static org.olat.ims.qti21.model.xml.AssessmentItemFactory.appendDefaultOu import static org.olat.ims.qti21.model.xml.AssessmentItemFactory.appendHotspotInteraction; import static org.olat.ims.qti21.model.xml.AssessmentItemFactory.createHotspotEntryResponseDeclarationSingle; import static org.olat.ims.qti21.model.xml.AssessmentItemFactory.createResponseProcessing; -import static org.olat.ims.qti21.model.xml.AssessmentItemFactory.extractIdentifiersFromCorrectResponse; +import static org.olat.ims.qti21.model.xml.QtiNodesExtractor.extractIdentifiersFromCorrectResponse; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java index 1cc5ec5f52dd2e9f65d70b93e1c673afb8e4b469..57cf2b63bd916608afdc471197017b3b63f3a2bd 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java @@ -1245,12 +1245,14 @@ public class AssessmentTestDisplayController extends BasicController implements layoutCont.contextPut("displayQuestionProgress", deliveryOptions.isDisplayQuestionProgress()); if(deliveryOptions.isDisplayScoreProgress()) { - scoreProgress = uifactory.addProgressBar("scoreProgress", null, 250, 0, 0, "", formLayout); + scoreProgress = uifactory.addProgressBar("scoreProgress", null, 100, 0, 0, "", formLayout); + scoreProgress.setWidthInPercent(true); formLayout.add("", scoreProgress); } if(deliveryOptions.isDisplayQuestionProgress()) { - questionProgress = uifactory.addProgressBar("questionProgress", null, 250, 0, 0, "", formLayout); + questionProgress = uifactory.addProgressBar("questionProgress", null, 100, 0, 0, "", formLayout); + questionProgress.setWidthInPercent(true); formLayout.add("questionProgress", questionProgress); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java index ea193f693c727f9f3e90ff422052cf9205f61f02..7e3402110ebad11ba298270c1045134d975265a1 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java @@ -39,7 +39,7 @@ import org.olat.core.util.resource.OresHelper; import org.olat.fileresource.FileResourceManager; import org.olat.ims.qti21.QTI21Constants; import org.olat.ims.qti21.QTI21Service; -import org.olat.ims.qti21.model.xml.QtiNodesHelper; +import org.olat.ims.qti21.model.xml.QtiNodesExtractor; import org.olat.ims.qti21.ui.editor.AssessmentTestComposerController; import org.olat.ims.qti21.ui.statistics.QTI21AssessmentTestStatisticsController; import org.olat.modules.assessment.ui.AssessableResource; @@ -210,8 +210,8 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { ResolvedAssessmentTest resolvedAssessmentTest = qtiService.loadAndResolveAssessmentTest(fUnzippedDirRoot, false); AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); - Double maxScore = QtiNodesHelper.getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(QTI21Constants.MAXSCORE_IDENTIFIER)); - Double minScore = QtiNodesHelper.getOutcomeDeclarationDefaultFloatValue(assessmentTest.getOutcomeDeclaration(QTI21Constants.MINSCORE_IDENTIFIER)); + Double maxScore = QtiNodesExtractor.extractMaxScore(assessmentTest); + Double minScore = QtiNodesExtractor.extractMinScore(assessmentTest); boolean hasScore = assessmentTest.getOutcomeDeclaration(QTI21Constants.SCORE_IDENTIFIER) != null; boolean hasPassed = assessmentTest.getOutcomeDeclaration(QTI21Constants.PASS_IDENTIFIER) != null; return new AssessableResource(hasScore, hasPassed, true, true, minScore, maxScore, null); diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/at_run.html b/src/main/java/org/olat/ims/qti21/ui/_content/at_run.html index 51f8a6560a3173b1ed34d742823fa45fce3aadf8..6fa0e125a766be3e0f628e115f57b6cdd9975b01 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_content/at_run.html +++ b/src/main/java/org/olat/ims/qti21/ui/_content/at_run.html @@ -24,7 +24,7 @@ <div id="o_qti_run_infos" class="panel panel-default"><div class="panel-body"> #if (!$qtiWorksStatus.isSurvey() && $displayScoreProgress && $qtiWorksStatus.score) <div id="o_qti_scoreinfo"> - <div id="o_qti_run_scoreinfo" class="col-sm-3"> + <div id="o_qti_run_scoreinfo" class="col-md-2 col-sm-3"> #if ($qtiWorksStatus.hasMaxScore()) #if ($qtiWorksStatus.maxScore == "-1.0") $r.translate("question.progress.score"): $qtiWorksStatus.score / $r.translate("question.progress.noMaxScore") @@ -35,16 +35,16 @@ $r.translate("question.progress.score"): $qtiWorksStatus.score #end </div> - <div id="o_qti_run_scoreprogress" class="col-sm-3">$r.render("scoreProgress", "nl")</div> + <div id="o_qti_run_scoreprogress" class="col-md-4 col-sm-3">$r.render("scoreProgress", "nl")</div> </div> #end #if ($displayQuestionProgress) - <div id="o_qti_questioninfo" class="row"> - <div id="o_qti_run_questioninfo" class="col-sm-3"> + <div id="o_qti_questioninfo"> + <div id="o_qti_run_questioninfo" class="col-md-2 col-sm-3"> $r.translate("question.progress.answered"): $qtiWorksStatus.numberOfAnsweredQuestions / $qtiWorksStatus.numberOfQuestions </div> - <div id="o_qti_run_questionprogress" class="col-sm-3">$r.render("questionProgress", "nl")</div> + <div id="o_qti_run_questionprogress" class="col-md-4 col-sm-3">$r.render("questionProgress", "nl")</div> </div> #end </div></div> diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties index 22802558bfdc600d710d2630c90433f02006e50a..f70b14c60d1733bc1f06a73f2d0c7d4962b06445 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties @@ -2,12 +2,12 @@ actualPoints=$org.olat.modules.iq\:actualPoints assessment.comment.legend=Pers\u00F6nliche Notizen assessment.item.modal.feedback=Feedback -assessment.item.status.answered=Antwortet -assessment.item.status.finished=Beendet +assessment.item.status.answered=Beantwortet +assessment.item.status.finished=Erledigt assessment.item.status.modelSolution=Musterl\u00F6sung -assessment.item.status.needsAttention=Vorsichtig +assessment.item.status.needsAttention=Achtung assessment.item.status.notAnswered=Nicht beantwortet -assessment.item.status.notSeen=Nicht gesehen +assessment.item.status.notSeen=Ungelesen assessment.item.status.review=\u00DCberpr\u00FCfung assessment.item.status.reviewInvalidAnswer=\u00DCberpr\u00FCfung (ung\u00FCltige Antwort) assessment.item.status.reviewNot=Nicht \u00FCberpr\u00FCfbar @@ -89,5 +89,5 @@ table.header.results=$org.olat.course.nodes.iq\:table.header.results terminated.msg=Der Test ist beendet. test.complete=Test abgeschlossen test.entry.page.text=Der Test hat bis {0} Teile. -test.entry.page.title=Test Eintritt +test.entry.page.title=Testbeginn test.part.complete=Test Part abgeschlossen diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index 45a342ffaf3485adc654a081759d455e1742f807..a03fa9b4f6a29b93120127eb5ac61478cc13ca3e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -1,13 +1,13 @@ -#Fri May 06 15:52:30 CEST 2016 +#Fri Aug 05 08:44:17 CEST 2016 actualPoints=$org.olat.modules.iq\:actualPoints assessment.comment.legend=Please use the following text box if you need to provide any additional information, comments or feedback during this test\: assessment.item.modal.feedback=Feedback assessment.item.status.answered=Answered -assessment.item.status.finished=Finished +assessment.item.status.finished=Completed assessment.item.status.modelSolution=Model solution -assessment.item.status.needsAttention=Needs Attention +assessment.item.status.needsAttention=Attention assessment.item.status.notAnswered=Not answered -assessment.item.status.notSeen=Not seen +assessment.item.status.notSeen=Unread assessment.item.status.review=Review assessment.item.status.reviewInvalidAnswer=Review (Invalid Answer) assessment.item.status.reviewNot=Not Reviewable @@ -18,8 +18,8 @@ assessment.solution.hide=Hide solution assessment.solution.show=Show solution assessment.test.backToTestFeedback=Back to test's feedback assessment.test.cancelled=The test has been cancelled. -assessment.test.close.test=Close test assessment.test.close.results=Close results +assessment.test.close.test=Close test assessment.test.config=Test configuration assessment.test.end.test=Finish test assessment.test.end.testPart=Finish test part @@ -40,14 +40,20 @@ confirm.advance.testpart.text=Do really want to leave this test part and advance confirm.advance.testpart.title=Advance test part confirm.cancel.test=$org.olat.modules.iq\:confirmCancel confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend -exploded.msg=Exploded +debug.outcomes=Output data +debug.responses=Responses data error.as.directed=Please complete this interaction as directed. error.input.invalid=Your input must be a valid {0} error.input.invalid.record=number error.input.invalid.string=text +exploded.msg=Exploded form.metadata.title=Title head.assessment.details=$org.olat.ims.qti\:head.ass.details head.assessment.overview=$org.olat.ims.qti\:head.ass.details +interaction.order.drag.msg=Drag unused items from here... +interaction.order.drop.msg=Drop and order your selected items here... +interaction.order.source=Source +interaction.order.target=Target passed.no=$org.olat.course.nodes.iq\:passed.no passed.yes=$org.olat.course.nodes.iq\:passed.yes passed.yourpassed=$org.olat.course.nodes.iq\:passed.yourpassed @@ -66,12 +72,6 @@ qti.form.summary.compact=$org.olat.course.nodes.iq\:qti.form.summary.compact qti.form.summary.detailed=$org.olat.course.nodes.iq\:qti.form.summary.detailed qti.form.summary.none=$org.olat.course.nodes.iq\:qti.form.summary.none qti.form.summary.section=$org.olat.course.nodes.iq\:qti.form.summary.section -interaction.order.drag.msg=Drag unused items from here... -interaction.order.drop.msg=Drop and order your selected items here... -interaction.order.source=Source -interaction.order.target=Target -debug.outcomes=Output data -debug.responses=Responses data question.progress.answered=Answered question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints @@ -79,12 +79,12 @@ results.duration=Duration results.end.time=End date results.entry.time=Start date results.score.yourscore=$org.olat.course.nodes.iq\:score.yourscore -results.summary.title=$org.olat.course.nodes\:personal.title results.session.status=Status +results.session.status.final=Answered results.session.status.initial=Not started -results.session.status.pendingSubmission=Seen but not answered results.session.status.pendingResponseProcessing=$\:results.session.status.pendingSubmission -results.session.status.final=Answered +results.session.status.pendingSubmission=Seen but not answered +results.summary.title=$org.olat.course.nodes\:personal.title review.responses=Review your responses review.responses.desc=You may review your responses to some (or all) questions. These are listed below. score.max=$org.olat.ims.qti\:score.max @@ -92,10 +92,11 @@ serialize.error=An unexpected happens while saving the file. submit=Submit response suspend.test=$org.olat.modules.iq\:suspendAssess tab.options=Options +table.header.lastModified=$org.olat.course.nodes.iq\:table.header.lastModified +table.header.results=$org.olat.course.nodes.iq\:table.header.results terminated.msg=The test is finished. test.complete=Test complete test.entry.page.text=This test consists of up to {0} parts. -test.entry.page.title=Test entry +test.entry.page.title=Begin test test.part.complete=Test part complete unsupported.custom.interaction=Unsupported custom interaction - diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java index 9d0e81792e9e32b7cbae8fcbd624b177e4bf12fa..24f00e04bba655775d7c6732e6c244efa55d0c27 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java @@ -175,9 +175,9 @@ public class AssessmentItemEditorController extends BasicController { } if(metadataBuilder != null) { - metadataEditor = new MetadataEditorController(ureq, getWindowControl(), metadataBuilder); - listenTo(metadataEditor); - tabbedPane.addTab(translate("form.metadata"), metadataEditor); + //metadataEditor = new MetadataEditorController(ureq, getWindowControl(), metadataBuilder); + //listenTo(metadataEditor); + //tabbedPane.addTab(translate("form.metadata"), metadataEditor); } } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java index f5bb0925a693323573a9d15baa8de296724ece7a..7e8c19407c0d00828349d0704d64cf696c9f990a 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java @@ -78,7 +78,7 @@ import org.olat.ims.qti21.model.xml.AssessmentTestBuilder; import org.olat.ims.qti21.model.xml.AssessmentTestFactory; import org.olat.ims.qti21.model.xml.ManifestBuilder; import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder; -import org.olat.ims.qti21.model.xml.QtiNodesHelper; +import org.olat.ims.qti21.model.xml.QtiNodesExtractor; import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.EntryType; @@ -858,8 +858,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController for(ResolvedAssessmentItem resolvedAssessmentItem:resolvedAssessmentTest.getResolvedAssessmentItemBySystemIdMap().values()) { AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful(); if(assessmentItem != null) { - Double maxScore = QtiNodesHelper - .getOutcomeDeclarationDefaultFloatValue(assessmentItem.getOutcomeDeclaration(QTI21Constants.MAXSCORE_IDENTIFIER)); + Double maxScore = QtiNodesExtractor.extractMaxScore(assessmentItem); if(maxScore != null) { sumMaxScore += maxScore; } diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestFeedbackEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestFeedbackEditorController.java index 067274337300ed45a2cc9babb200cab52990dd77..13d2eb642b37135e34c30950c9d029d63acd9b4e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestFeedbackEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestFeedbackEditorController.java @@ -59,11 +59,6 @@ public class AssessmentTestFeedbackEditorController extends FormBasicController @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - boolean hasCutValue = testBuilder.getCutValue() != null; - if(!hasCutValue) { - setFormWarning("warning.feedback.cutvalue"); - } - //correct feedback TestFeedbackBuilder passedFeedback = testBuilder.getPassedFeedback(); String passedTitle = passedFeedback == null ? "" : passedFeedback.getTitle(); @@ -104,6 +99,12 @@ public class AssessmentTestFeedbackEditorController extends FormBasicController feedbackPassedTextEl.setVisible(hasCutValue); feedbackFailedTitleEl.setVisible(hasCutValue); feedbackFailedTextEl.setVisible(hasCutValue); + + if(hasCutValue) { + setFormWarning(null); + } else { + setFormWarning("warning.feedback.cutvalue"); + } } @Override diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties index 4e29676eaf4000fc9b4ac4028810ed09a07c5054..0782e29e06e2e1c1d1660605cda0e1d9073f245f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_de.properties @@ -2,7 +2,7 @@ answers=Antworten change.elements=Elemente \u00E4ndern correct.answers=Korrekt -cut.value=Notwendige Punktzahl f\u00FCr "bestanden" +cut.value=Notwendige Punktzahl f\u00FCr "Bestanden" delete.item=$org.olat.ims.qti.editor\:delete.item delete.section=$org.olat.ims.qti.editor\:delete.section editor.sc.title=Single choice @@ -43,22 +43,22 @@ form.imd.alignment.right=Rechts form.imd.answer=Antwort form.imd.background=Hintergrund form.imd.correct.kprim=$org.olat.ims.qti.editor\:questionform_correct_kprim -form.imd.correct.spots=Richtige Spots +form.imd.correct.spots=Korrekte Spots form.imd.correct.text=Feedback bei Wahl aller korrekten Antworten form.imd.correct.title=Titel form.imd.descr=Frage form.imd.empty.text=Feedback bei Wahl keiner Antworten form.imd.empty.title=Titel -form.imd.hint.title=Hint Title -form.imd.hint.text=Hint +form.imd.hint.title=Title +form.imd.hint.text=Lösunghinweis form.imd.incorrect.text=Feedback bei Wahl einer falschen Antwort form.imd.incorrect.title=Titel form.imd.layout=$org.olat.ims.qti.editor\:form.imd.layout form.imd.layout.horizontal=$org.olat.ims.qti.editor\:form.imd.layout.horizontal form.imd.layout.vertical=$org.olat.ims.qti.editor\:form.imd.layout.vertical form.imd.limittries=$org.olat.ims.qti.editor\:form.imd.limittries -form.imd.rubric=Rubrik -form.imd.shuffle=Zuf\u00E4llig +form.imd.rubric=Beschreibung +form.imd.shuffle=Zuf\u00E4llige Reihenfolge form.imd.title=Titel form.imd.wrong.kprim=$org.olat.ims.qti.editor\:questionform_wrong_kprim form.metadata=Metadaten @@ -74,7 +74,7 @@ form.score.assessment.per.answer=Punkte pro Antwort form.section.selection_pre=Anzahl Fragen in dieser Sektion form.section.selection_pre.hover=Legen Sie fest ob alle oder nur eine bestimmte Anzahl Fragen im Test angezeigt werden sollen. form.section.shuffle=Zuf\u00E4llige Reihenfolge der Fragen? -form.section.visible=Sichtbar +form.section.visible=Sektionstitel sichtbar in Test form.test.correct.text=Feedback bei Wahl aller korrekten Antworten form.test.correct.title=Titel form.test.export.score=Gesamtergebnis dieser Pr\u00FCfung @@ -90,7 +90,7 @@ item.session.control.show.solution=L\u00F6sung anzeigen max.score=Maximal erreichbare Punktzahl min.score=Minimal erreichbare Punktzahl new.circle=Kreis -new.elements=Neue Elementen +new.elements=Elemente hinzuf\u00FCgen new.essay=Freitext new.fib=L\u00FCcke new.fib.numerical=Numerische Eingabe @@ -113,5 +113,5 @@ tools.export.qpool=$org.olat.ims.qti.editor\:tools.export.qpool tools.import.qpool=$org.olat.ims.qti.editor\:tools.import.qpool tools.import.table=$org.olat.ims.qti.editor\:tools.import.table warning.in.use=Die Ressource wird bereits f\u00FCr Auswertung verwendet. Die Bearbeitung ist begrenzt. -warning.feedback.cutvalue=Feedback basiert auf dem "Notwendige Punktzahl fvr 'bestanden'". Sie m\u00FCssen es zuerst definieren. +warning.feedback.cutvalue=Feedback wird aktiviert sobald bei "Notwendige Punktzahl f\u00FCr 'Bestanden'" eine Punktzahl eingegeben wurde. warning.unkown.assessment.item=Dieser Fragetyp kann nicht mit dem OpenOLAT-Editor bearbeitet werden. diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties index 9df64c3456e0088974257526a8ba0c1518d086a0..7194213e65db44eeff694b9010063c024541f135 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_en.properties @@ -42,21 +42,21 @@ form.imd.answer=Answer form.imd.background=Background form.imd.correct.kprim=$org.olat.ims.qti.editor\:questionform_correct_kprim form.imd.correct.spots=Correct spots -form.imd.correct.text=Correct feedback -form.imd.correct.title=Correct title +form.imd.correct.text=Feedback for all correct answers +form.imd.correct.title=Title form.imd.descr=Question form.imd.empty.text=Empty feedback form.imd.empty.title=Empty title form.imd.hint.text=Hint -form.imd.hint.title=Hint title -form.imd.incorrect.text=Incorrect feedback -form.imd.incorrect.title=Incorrect title +form.imd.hint.title=Title +form.imd.incorrect.text=Feedback for wrong answer +form.imd.incorrect.title=Title form.imd.layout=$org.olat.ims.qti.editor\:form.imd.layout form.imd.layout.horizontal=$org.olat.ims.qti.editor\:form.imd.layout.horizontal form.imd.layout.vertical=$org.olat.ims.qti.editor\:form.imd.layout.vertical form.imd.limittries=$org.olat.ims.qti.editor\:form.imd.limittries -form.imd.rubric=Rubric -form.imd.shuffle=Shuffle +form.imd.rubric=Description +form.imd.shuffle=Shuffle answers form.imd.title=Title form.imd.wrong.kprim=$org.olat.ims.qti.editor\:questionform_wrong_kprim form.kprim=Kprim @@ -73,24 +73,24 @@ form.score.assessment.per.answer=Score per answer form.section.selection_pre=Number of questions in this section form.section.selection_pre.hover=Select whether all or just a specified number of questions should be displayed in the test. form.section.shuffle=Random order of questions? -form.section.visible=Visible -form.test.correct.text=Correct feedback -form.test.correct.title=Correct title +form.section.visible=Section's title visible in test +form.test.correct.text=Feedback for all correct answers +form.test.correct.title=Title form.test.export.score=Overall score of this test -form.test.incorrect.text=Incorrect feedback -form.test.incorrect.title=Incorrect title +form.test.incorrect.text=Feedback for wrong answer +form.test.incorrect.title=Title form.testPart.navigationMode=Navigation mode form.testPart.navigationMode.linear=Linear form.testPart.navigationMode.nonlinear=Non linear form.unkown=Unkown inherit=Inherit -item.session.control.allow.comment=Allow comment +item.session.control.allow.comment=Allow comments item.session.control.attempts=Attempts item.session.control.show.solution=Show solution max.score=Max. score min.score=Min. score new.circle=Circle -new.elements=New elements +new.elements=Add elements new.essay=Essay new.fib=Gap text new.fib.numerical=Numerical input diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties index 0348ea712464adc475ea204cdc3957a954b7445b..2e9bc283bed51012a767533afbf4bc3b3893f1dc 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties @@ -14,7 +14,7 @@ form.imd.layout=$org.olat.ims.qti.editor\:form.imd.layout form.imd.layout.horizontal=$org.olat.ims.qti.editor\:form.imd.layout.horizontal form.imd.layout.vertical=$org.olat.ims.qti.editor\:form.imd.layout.vertical form.imd.limittries=$org.olat.ims.qti.editor\:form.imd.limittries -form.imd.rubric=Rubrique +form.imd.rubric=Description form.imd.title=Titre form.imd.wrong.kprim=$org.olat.ims.qti.editor\:questionform_wrong_kprim form.metadata=M\u00E9tadonn\u00E9es diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java new file mode 100644 index 0000000000000000000000000000000000000000..d87b637a1ba6795dfe67b9cea05d486178b45149 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java @@ -0,0 +1,181 @@ +/** + * <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.ims.qti21.ui.statistics; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.olat.basesecurity.Group; +import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; +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.panel.Panel; +import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.components.tree.GenericTreeModel; +import org.olat.core.gui.components.tree.MenuTree; +import org.olat.core.gui.components.tree.TreeEvent; +import org.olat.core.gui.components.tree.TreeNode; +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.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.util.nodes.INode; +import org.olat.core.util.resource.OresHelper; +import org.olat.course.nodes.ArchiveOptions; +import org.olat.course.nodes.AssessmentToolOptions; +import org.olat.course.nodes.AssessmentToolOptions.AlternativeToIdentities; +import org.olat.course.nodes.QTICourseNode; +import org.olat.course.run.environment.CourseEnvironment; +import org.olat.course.statistic.StatisticResourceNode; +import org.olat.ims.qti21.model.QTI21StatisticSearchParams; +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 05.08.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class QTI21StatisticsToolController extends BasicController implements Activateable2 { + + private MenuTree courseTree; + private final Link statsButton; + private Controller currentCtrl; + private final TooledStackedPanel stackPanel; + private LayoutMain3ColsController layoutCtr; + + private final ArchiveOptions options; + private final QTICourseNode courseNode; + private final RepositoryEntry testEntry; + private final RepositoryEntry courseEntry; + private QTI21StatisticResourceResult result; + + private final QTI21StatisticSearchParams searchParams; + + public QTI21StatisticsToolController(UserRequest ureq, WindowControl wControl, + TooledStackedPanel stackPanel, CourseEnvironment courseEnv, + AssessmentToolOptions asOptions, QTICourseNode courseNode) { + super(ureq, wControl); + this.stackPanel = stackPanel; + this.options = new ArchiveOptions(); + this.options.setGroup(asOptions.getGroup()); + this.options.setIdentities(asOptions.getIdentities()); + this.courseNode = courseNode; + courseEntry = courseEnv.getCourseGroupManager().getCourseEntry(); + testEntry = courseNode.getReferencedRepositoryEntry(); + + searchParams = new QTI21StatisticSearchParams(testEntry, courseEntry, courseNode.getIdent()); + if(asOptions.getGroup() != null) { + List<Group> bGroups = Collections.singletonList(asOptions.getGroup().getBaseGroup()); + searchParams.setLimitToGroups(bGroups); + } else if(asOptions.getAlternativeToIdentities() != null) { + AlternativeToIdentities alt = asOptions.getAlternativeToIdentities(); + searchParams.setMayViewAllUsersAssessments(alt.isMayViewAllUsersAssessments()); + searchParams.setLimitToGroups(alt.getGroups()); + } + + statsButton = LinkFactory.createButton("menu.title", null, this); + statsButton.setTranslator(getTranslator()); + putInitialPanel(statsButton); + getInitialComponent().setSpanAsDomReplaceable(true); // override to wrap panel as span to not break link layout + } + + @Override + protected void doDispose() { + // + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) return; + + ContextEntry entry = entries.get(0); + if(entry.getOLATResourceable() != null && entry.getOLATResourceable().getResourceableTypeName() != null) { + String nodeId = entry.getOLATResourceable().getResourceableTypeName(); + TreeNode nclr = courseTree.getTreeModel().getNodeById(nodeId); + if(nclr != null) { + String selNodeId = nclr.getIdent(); + courseTree.setSelectedNodeId(selNodeId); + doSelectNode(ureq, nclr); + } + } + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if(statsButton == source) { + doLaunchStatistics(ureq, getWindowControl()); + doSelectNode(ureq, courseTree.getTreeModel().getRootNode()); + } else if(courseTree == source) { + if(event instanceof TreeEvent) { + TreeEvent te = (TreeEvent)event; + if(MenuTree.COMMAND_TREENODE_CLICKED.equals(te.getCommand())) { + String ident = te.getNodeId(); + TreeNode selectedNode = courseTree.getTreeModel().getNodeById(ident); + doSelectNode(ureq, selectedNode); + } + } + } + } + + private void doSelectNode(UserRequest ureq, TreeNode selectedNode) { + removeAsListenerAndDispose(currentCtrl); + WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance(selectedNode.getIdent(), 0l), null); + currentCtrl = result.getController(ureq, swControl, stackPanel, selectedNode); + if(currentCtrl != null) { + listenTo(currentCtrl); + layoutCtr.setCol3(currentCtrl.getInitialComponent()); + } else { + layoutCtr.setCol3(new Panel("empty")); + } + } + + private void doLaunchStatistics(UserRequest ureq, WindowControl wControl) { + if(result == null) { + result = new QTI21StatisticResourceResult(testEntry, courseEntry, courseNode, searchParams); + } + + GenericTreeModel treeModel = new GenericTreeModel(); + StatisticResourceNode rootTreeNode = new StatisticResourceNode(courseNode, result); + treeModel.setRootNode(rootTreeNode); + + TreeNode subRootNode = result.getSubTreeModel().getRootNode(); + List<INode> subNodes = new ArrayList<>(); + for(int i=0; i<subRootNode.getChildCount(); i++) { + subNodes.add(subRootNode.getChildAt(i)); + } + for(INode subNode:subNodes) { + rootTreeNode.addChild(subNode); + } + + courseTree = new MenuTree("qti21StatisticsTree"); + courseTree.setTreeModel(treeModel); + courseTree.addListener(this); + + layoutCtr = new LayoutMain3ColsController(ureq, wControl, courseTree, new Panel("empty"), null); + stackPanel.pushController("Stats", layoutCtr); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_de.properties index 978fc2b51595020dc70970d9b629d4a954e1864a..7b7098754bc7cc481ded42df6f6fa20e8b39c5d5 100644 --- a/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_de.properties @@ -32,6 +32,7 @@ fig.surveyId=$org.olat.ims.qti.statistics.ui\:fig.surveyId fig.testId=$org.olat.ims.qti.statistics.ui\:fig.testId fig.title=$org.olat.ims.qti.statistics.ui\:fig.title fig.wronganswers=$org.olat.ims.qti.statistics.ui\:fig.wronganswers +menu.title=$org.olat.ims.qti.statistics.ui\:menu.title section=$org.olat.ims.qti.statistics.ui\:section stats.unsupported.interaction=ist nicht unterst\u00FCtzt. user.not.answer=$org.olat.ims.qti.statistics.ui\:user.not.answer diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_en.properties index 77053a8459e251227b9ab51f72e3d91813663430..28713a5eaad3a90080de0c92145913eb1826dd3e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/statistics/_i18n/LocalStrings_en.properties @@ -32,6 +32,7 @@ fig.surveyId=$org.olat.ims.qti.statistics.ui\:fig.surveyId fig.testId=$org.olat.ims.qti.statistics.ui\:fig.testId fig.title=$org.olat.ims.qti.statistics.ui\:fig.title fig.wronganswers=$org.olat.ims.qti.statistics.ui\:fig.wronganswers +menu.title=$org.olat.ims.qti.statistics.ui\:menu.title section=$org.olat.ims.qti.statistics.ui\:section stats.unsupported.interaction=is not supported. -user.not.answer=$org.olat.ims.qti.statistics.ui\:user.not.answer +user.not.answer=$org.olat.ims.qti.statistics.ui\:user.not.answer \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/interactions/HotspotInteractionStatisticsController.java b/src/main/java/org/olat/ims/qti21/ui/statistics/interactions/HotspotInteractionStatisticsController.java index a7b6b24ce549640cb1300b242cbd457fd68937e7..7d1e21b9da840c6c7cf7cad56a0492b660a058b0 100644 --- a/src/main/java/org/olat/ims/qti21/ui/statistics/interactions/HotspotInteractionStatisticsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/statistics/interactions/HotspotInteractionStatisticsController.java @@ -19,6 +19,8 @@ */ package org.olat.ims.qti21.ui.statistics.interactions; +import static org.olat.ims.qti21.model.xml.QtiNodesExtractor.extractIdentifiersFromCorrectResponse; + import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -46,7 +48,6 @@ import org.olat.ims.qti.statistics.ui.ResponseInfos; import org.olat.ims.qti.statistics.ui.Series; import org.olat.ims.qti21.QTI21StatisticsManager; import org.olat.ims.qti21.model.statistics.HotspotChoiceStatistics; -import org.olat.ims.qti21.model.xml.AssessmentItemFactory; import org.olat.ims.qti21.ui.statistics.QTI21AssessmentItemStatisticsController; import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult; import org.olat.ims.qti21.ui.statistics.SeriesFactory; @@ -151,7 +152,7 @@ public class HotspotInteractionStatisticsController extends BasicController { List<Identifier> correctAnswers = new ArrayList<>(); ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(interaction.getResponseIdentifier()); if(responseDeclaration != null && responseDeclaration.getCorrectResponse() != null) { - AssessmentItemFactory.extractIdentifiersFromCorrectResponse(responseDeclaration.getCorrectResponse(), correctAnswers); + extractIdentifiersFromCorrectResponse(responseDeclaration.getCorrectResponse(), correctAnswers); } return correctAnswers; } diff --git a/src/main/java/org/olat/modules/assessment/ui/AssessmentStatisticsSmallController.java b/src/main/java/org/olat/modules/assessment/ui/AssessmentStatisticsSmallController.java index 89a7e32a3183c852f055df45e2a525cbe74a0fd1..ca344da089eeddf37a453ea374e41e40ec97aced 100644 --- a/src/main/java/org/olat/modules/assessment/ui/AssessmentStatisticsSmallController.java +++ b/src/main/java/org/olat/modules/assessment/ui/AssessmentStatisticsSmallController.java @@ -48,6 +48,7 @@ public class AssessmentStatisticsSmallController extends BasicController { private int numOfPassed; private int numOfFailed; + private int numOfParticipants; private int numOfAssessedIdentities; @Autowired @@ -78,18 +79,21 @@ public class AssessmentStatisticsSmallController extends BasicController { public void updateStatistics() { SearchAssessedIdentityParams params = new SearchAssessedIdentityParams(testEntry, null, testEntry, assessmentCallback); - numOfAssessedIdentities = assessmentToolManager.getNumberOfAssessedIndetities(getIdentity(), params); + numOfAssessedIdentities = assessmentToolManager.getNumberOfAssessedIdentities(getIdentity(), params); mainVC.contextPut("numOfAssessedIdentities", numOfAssessedIdentities); + numOfParticipants = assessmentToolManager.getNumberOfParticipants(getIdentity(), params); + mainVC.contextPut("numOfParticipants", numOfParticipants); + AssessmentStatistics stats = assessmentToolManager.getStatistics(getIdentity(), params); mainVC.contextPut("scoreAverage", AssessmentHelper.getRoundedScore(stats.getAverageScore())); numOfPassed = stats.getCountPassed(); mainVC.contextPut("numOfPassed", numOfPassed); - int percentPassed = numOfAssessedIdentities <= 0 ? 0 : Math.round(100.0f * (stats.getCountPassed() / numOfAssessedIdentities)); + int percentPassed = numOfParticipants <= 0 ? 0 : Math.round(100.0f * (stats.getCountPassed() / numOfParticipants)); mainVC.contextPut("percentPassed", percentPassed); numOfFailed = stats.getCountFailed(); mainVC.contextPut("numOfFailed", numOfFailed); - int percentFailed = numOfAssessedIdentities <= 0 ? 0 : Math.round(100.0f * (stats.getCountFailed() / numOfAssessedIdentities)); + int percentFailed = numOfParticipants <= 0 ? 0 : Math.round(100.0f * (stats.getCountFailed() / numOfParticipants)); mainVC.contextPut("percentFailed", percentFailed); int numOfLaunches = assessmentToolManager.getNumberOfInitialLaunches(getIdentity(), params); diff --git a/src/main/java/org/olat/modules/assessment/ui/_content/test_stats_small.html b/src/main/java/org/olat/modules/assessment/ui/_content/test_stats_small.html index c7bc6da2532b3553870944648d2f9a18cfccef9b..15ec159336d7775e19313796b3ff370f49cef028 100644 --- a/src/main/java/org/olat/modules/assessment/ui/_content/test_stats_small.html +++ b/src/main/java/org/olat/modules/assessment/ui/_content/test_stats_small.html @@ -4,15 +4,15 @@ </div> <table class="table"> <tr> - <th>$r.translate("table.header.numOfAssessedIdentities")</th> - <td>$numOfAssessedIdentities</td> + <th>$r.translate("table.header.numOfParticipants")</th> + <td>$numOfParticipants</td> </tr> <tr> <th>$r.translate("table.header.numOfInitialLaunch")</th> <td> #if($numOfInitialLaunch && $numOfInitialLaunch == 0) <i class="o_icon o_red_led"> </i> - #elseif($numOfInitialLaunch && $numOfInitialLaunch == $numOfAssessedIdentities) + #elseif($numOfInitialLaunch && $numOfInitialLaunch == $numOfParticipants) <i class="o_icon o_green_led"> </i> #else <i class="o_icon o_yellow_led"> </i> @@ -27,13 +27,13 @@ <th>$r.translate("table.header.numOfPassed")</th> <td><div class="progress" title=""> #if($numOfPassed && $numOfPassed > 0) - <div class="progress-bar" role="progressbar" aria-valuenow="$numOfPassed" aria-valuemin="0" aria-valuemax="$numOfAssessedIdentities" style="width: ${percentPassed}%;"> + <div class="progress-bar" role="progressbar" aria-valuenow="$numOfPassed" aria-valuemin="0" aria-valuemax="$numOfParticipants" style="width: ${percentPassed}%;"> <span class="sr-only">${percentPassed}%</span> </div> #end #if($numOfFailed && $numOfFailed > 0) - <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="$numOfFailed" aria-valuemin="0" aria-valuemax="$numOfAssessedIdentities" style="width: ${percentFailed}%;"> + <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="$numOfFailed" aria-valuemin="0" aria-valuemax="$numOfParticipants" style="width: ${percentFailed}%;"> <span class="sr-only">${percentFailed}%</span> </div> #end diff --git a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_de.properties index 7a1cc742c8e42a231557749aac69192fd2249e2e..43a46a258966a96cb35d6b5244ef60020bd024ad 100644 --- a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_de.properties @@ -1,4 +1,4 @@ -#Mon Jun 20 18:44:30 CEST 2016 +#Fri Aug 05 08:46:06 CEST 2016 assessment.status.done=Bewertet assessment.status.inProgress=Gestartet assessment.status.inReview=Korrigieren @@ -7,7 +7,7 @@ assessment.tool.numOfAssessedGroups={0} Gruppe(n) assessment.tool.numOfAssessedIdentities={0} bewertete Benutzer assessment.tool.numOfFailed={0} nicht bestanden assessment.tool.numOfPassed={0} bestanden -assessment.tool.overview=Ubersicht +assessment.tool.overview=\u00DCbersicht filter=Filter filter.done=Bewertet filter.failed=Nicht bestanden @@ -20,9 +20,10 @@ statistics.small.overview=Statistiken \u00DCbersicht table.header.assessmentStatus=Status table.header.elements.toReview=Zu \u00FCberpr\u00FCfen table.header.name=Benutzername +table.header.numOfParticipants=\# Teilnehmer table.header.numOfAssessedIdentities=\# Teilnehmer table.header.numOfInitialLaunch=Eingeloggt table.header.numOfPassed=Bestanden -table.header.scoreAverage=Durschnitt +table.header.scoreAverage=Durchschnitt users=Benutzer -waiting.review=Anh\u00E4ngige Bewertungen +waiting.review=Anstehende Bewertungen diff --git a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_en.properties index dc48ce8fa446fca6ab3be2673e3682a438153fff..886fa273f4d1c2bb64f9afef3f67a50cb70159ed 100644 --- a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_en.properties @@ -1,13 +1,13 @@ -#Fri May 06 21:35:18 CEST 2016 +#Fri Aug 05 08:45:50 CEST 2016 assessment.status.done=Assessed assessment.status.inProgress=Started assessment.status.inReview=To review assessment.status.notStart=Not started -assessment.tool.overview=Overview assessment.tool.numOfAssessedGroups={0} group(s) assessment.tool.numOfAssessedIdentities={0} assessed users assessment.tool.numOfFailed={0} not passed assessment.tool.numOfPassed={0} passed +assessment.tool.overview=Overview filter=Filter filter.done=Assessed filter.failed=Not passed @@ -16,13 +16,14 @@ filter.inProgress=Started filter.inReview=To review filter.passed=Passed review=Review +statistics.small.overview=Statistics overview table.header.assessmentStatus=Status table.header.elements.toReview=To review table.header.name=Username +table.header.numOfParticipants=\# participants table.header.numOfAssessedIdentities=\# participants table.header.numOfInitialLaunch=Logged in table.header.numOfPassed=Passed table.header.scoreAverage=Average -waiting.review=Pending reviews users=Users -statistics.small.overview=Statistics overview \ No newline at end of file +waiting.review=Pending reviews diff --git a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b2d6e3711d22dd831d989fb502964d0d9804cf25 --- /dev/null +++ b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_fr.properties @@ -0,0 +1 @@ +#Fri Aug 05 08:45:50 CEST 2016 \ No newline at end of file diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java index 86eee946ee0c29ed8888bac516583ad74ad5672b..60bfbd211f5c5b0b1d0e7edbe8fd77a85d9726a0 100644 --- a/src/test/java/org/olat/selenium/CourseTest.java +++ b/src/test/java/org/olat/selenium/CourseTest.java @@ -51,6 +51,7 @@ import org.olat.selenium.page.core.AdministrationPage; import org.olat.selenium.page.core.BookingPage; import org.olat.selenium.page.core.MenuTreePageFragment; import org.olat.selenium.page.course.AssessmentCEConfigurationPage; +import org.olat.selenium.page.course.AssessmentToolPage; import org.olat.selenium.page.course.CourseEditorPageFragment; import org.olat.selenium.page.course.CoursePageFragment; import org.olat.selenium.page.course.CourseWizardPage; @@ -1813,9 +1814,10 @@ public class CourseTest { .assertTitleNotExists(infoTitle.substring(0, 20)); //author set assessment to passed - members + AssessmentToolPage assessmentTool = members .clickToolbarBack() - .assessmentTool() + .assessmentTool(); + assessmentTool .users() .assertOnUsers(rei) .selectUser(rei) @@ -1832,8 +1834,8 @@ public class CourseTest { .assertWithTitle(infoTitle.substring(0, 20)); //author can see all - members - .clickToolbarBack() + assessmentTool + .clickToolbarRootCrumb() .clickTree() .assertWithTitle(bcTitle.substring(0, 20)) .assertWithTitle(msTitle.substring(0, 20)) diff --git a/src/test/java/org/olat/selenium/page/course/AssessmentToolPage.java b/src/test/java/org/olat/selenium/page/course/AssessmentToolPage.java index 04c80c9b1c0f6ea6d4ea44cfbabf2002843fc9f0..97a181be3ce146ddf075d55059ab52f80f2d509d 100644 --- a/src/test/java/org/olat/selenium/page/course/AssessmentToolPage.java +++ b/src/test/java/org/olat/selenium/page/course/AssessmentToolPage.java @@ -21,7 +21,6 @@ package org.olat.selenium.page.course; import java.util.List; -import org.jboss.arquillian.drone.api.annotation.Drone; import org.junit.Assert; import org.olat.selenium.page.graphene.OOGraphene; import org.olat.user.restapi.UserVO; @@ -37,19 +36,14 @@ import org.openqa.selenium.WebElement; */ public class AssessmentToolPage { - @Drone - private WebDriver browser; - - public AssessmentToolPage() { - // - } + private final WebDriver browser; public AssessmentToolPage(WebDriver browser) { this.browser = browser; } public AssessmentToolPage users() { - By usersBy = By.cssSelector("li.o_sel_assessment_tool_users a"); + By usersBy = By.cssSelector("a.o_sel_assessment_tool_assessed_users"); WebElement usersLink = browser.findElement(usersBy); usersLink.click(); OOGraphene.waitBusy(browser); @@ -57,7 +51,7 @@ public class AssessmentToolPage { } public AssessmentToolPage assertOnUsers(UserVO user) { - By usersCellsBy = By.cssSelector("div.o_table_layout table tr td.text-left"); + By usersCellsBy = By.cssSelector("div.o_table_flexi table tr td.text-left"); List<WebElement> usersCellsList = browser.findElements(usersCellsBy); Assert.assertFalse(usersCellsList.isEmpty()); @@ -76,7 +70,7 @@ public class AssessmentToolPage { * @return */ public AssessmentToolPage selectUser(UserVO user) { - By userLinksBy = By.xpath("//div[contains(@class,'o_table_layout')]//table//tr//td//a[text()[contains(.,'" + user.getFirstName() + "')]]"); + By userLinksBy = By.xpath("//div[contains(@class,'o_table_flexi')]//table//tr//td//a[text()[contains(.,'" + user.getFirstName() + "')]]"); WebElement userLink = browser.findElement(userLinksBy); userLink.click(); OOGraphene.waitBusy(browser); @@ -124,14 +118,14 @@ public class AssessmentToolPage { By scoreBy = By.cssSelector(".o_sel_assessment_form_score input[type='text']"); browser.findElement(scoreBy).sendKeys(Float.toString(score)); - By saveBy = By.cssSelector(".o_sel_assessment_form button.btn.btn-primary"); + By saveBy = By.cssSelector("a.btn.o_sel_assessment_form_save_and_close"); browser.findElement(saveBy).click(); OOGraphene.waitBusy(browser); return this; } public AssessmentToolPage assertPassed(UserVO user) { - By userInfosBy = By.cssSelector("div.panel li.list-group-item"); + By userInfosBy = By.cssSelector("div.o_user_infos div.o_user_infos_inner table tr td"); List<WebElement> userInfoList = browser.findElements(userInfosBy); Assert.assertFalse(userInfoList.isEmpty()); boolean foundFirstName = false; @@ -140,7 +134,7 @@ public class AssessmentToolPage { } Assert.assertTrue(foundFirstName); - By passedBy = By.cssSelector("div.o_table_layout table tr td.text-left span.o_state.o_passed"); + By passedBy = By.cssSelector("div.o_table_wrapper table tr td.text-left span.o_state.o_passed"); List<WebElement> passedEl = browser.findElements(passedBy); Assert.assertFalse(passedEl.isEmpty()); Assert.assertTrue(passedEl.get(0).isDisplayed()); @@ -168,7 +162,7 @@ public class AssessmentToolPage { } public BulkAssessmentPage bulk() { - By bulkBy = By.cssSelector("li.o_sel_assessment_tool_bulk a"); + By bulkBy = By.cssSelector("li.o_tool a.o_sel_assessment_tool_bulk"); browser.findElement(bulkBy).click(); OOGraphene.waitBusy(browser); @@ -178,4 +172,16 @@ public class AssessmentToolPage { return new BulkAssessmentPage(browser); } -} + /** + * Click back to the course + * + * @return + */ + public CoursePageFragment clickToolbarRootCrumb() { + OOGraphene.closeBlueMessageWindow(browser); + By toolbarBackBy = By.xpath("//li[contains(@class,'o_breadcrumb_back')]/following-sibling::li/a"); + browser.findElement(toolbarBackBy).click(); + OOGraphene.waitBusy(browser); + return new CoursePageFragment(browser); + } +} \ No newline at end of file diff --git a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java index 8997d61c61340ed55d8e7b69bd2c65fe12a81c10..48f1a20b06cf8c544873f3075492227c1e7fc3a4 100644 --- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java +++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java @@ -208,7 +208,7 @@ public class CoursePageFragment { browser.findElement(assessmentToolBy).click(); OOGraphene.waitBusy(browser); - WebElement main = browser.findElement(By.id("o_main")); + WebElement main = browser.findElement(By.id("o_assessment_tool_main")); Assert.assertTrue(main.isDisplayed()); return new AssessmentToolPage(browser); } diff --git a/src/test/java/org/olat/selenium/page/course/MembersPage.java b/src/test/java/org/olat/selenium/page/course/MembersPage.java index c24bfcfaa1d8ef4c8bbbf651ccf971b8993bf1d4..ec9c653b2d146974fa297edb399f2a1d6eb5220b 100644 --- a/src/test/java/org/olat/selenium/page/course/MembersPage.java +++ b/src/test/java/org/olat/selenium/page/course/MembersPage.java @@ -42,7 +42,7 @@ import org.openqa.selenium.WebElement; */ public class MembersPage { - private WebDriver browser; + private final WebDriver browser; public MembersPage(WebDriver browser) { this.browser = browser; diff --git a/src/test/java/org/olat/selenium/page/group/GroupPage.java b/src/test/java/org/olat/selenium/page/group/GroupPage.java index 2781f727cd1ce47c84c5e1818f61a7b7627b9b34..21cbdbb9833357cc70ca57f92a550638d9d4cf69 100644 --- a/src/test/java/org/olat/selenium/page/group/GroupPage.java +++ b/src/test/java/org/olat/selenium/page/group/GroupPage.java @@ -135,7 +135,7 @@ public class GroupPage { public ContactPage openContact() { openMenuItem(contactTool); - OOGraphene.waitElement(By.cssSelector("fieldset.o_sel_contact_form"), 2, browser); + OOGraphene.waitElement(By.cssSelector("fieldset.o_sel_contact_form"), 5, browser); return new ContactPage(browser); } @@ -146,31 +146,31 @@ public class GroupPage { public GroupPage openNews() { openMenuItem(newsTool); - OOGraphene.waitElement(By.id("o_msg_info"), 2, browser); + OOGraphene.waitElement(By.id("o_msg_info"), 5, browser); return this; } public FolderPage openFolder() { openMenuItem(folderTool); - OOGraphene.waitElement(FolderPage.folderBy, 2, browser); + OOGraphene.waitElement(FolderPage.folderBy, 5, browser); return new FolderPage(browser); } public ForumPage openForum() { openMenuItem(forumTool); - OOGraphene.waitElement(ForumPage.threadTableBy, 2, browser); + OOGraphene.waitElement(ForumPage.threadTableBy, 5, browser); return ForumPage.getGroupForumPage(browser); } public WikiPage openWiki() { openMenuItem(wikiTool); - OOGraphene.waitElement(WikiPage.wikiWrapperBy, 2, browser); + OOGraphene.waitElement(WikiPage.wikiWrapperBy, 5, browser); return WikiPage.getGroupWiki(browser); } public PortfolioV2Page openPortfolio() { openMenuItem(portfolioTool); - OOGraphene.waitElement(PortfolioV2Page.tocBy, 2, browser); + OOGraphene.waitElement(PortfolioV2Page.tocBy, 5, browser); return new PortfolioV2Page(browser); } @@ -203,21 +203,21 @@ public class GroupPage { By showOwnersBy = By.cssSelector(".o_sel_group_show_owners input[type='checkbox']"); browser.findElement(showOwnersBy).click(); OOGraphene.waitBusy(browser); - OOGraphene.waitElement(memberMenuItem, 2, browser); + OOGraphene.waitElement(memberMenuItem, 5, browser); } if(participants) { By showParticipants = By.cssSelector(".o_sel_group_show_participants input[type='checkbox']"); browser.findElement(showParticipants).click(); OOGraphene.waitBusy(browser); - OOGraphene.waitElement(memberMenuItem, 2, browser); + OOGraphene.waitElement(memberMenuItem, 5, browser); } if(waitingList) { By showWaitingListBy = By.cssSelector(".o_sel_group_show_waiting_list input[type='checkbox']"); browser.findElement(showWaitingListBy).click(); OOGraphene.waitBusy(browser); - OOGraphene.waitElement(memberMenuItem, 2, browser); + OOGraphene.waitElement(memberMenuItem, 5, browser); } return this; } diff --git a/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java b/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java index f31dee763734d59385a6984c08a8bc3c68ec2e52..bc8f409044b4f7ec5451d93c123411ce827dd19a 100644 --- a/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java +++ b/src/test/java/org/olat/selenium/page/portfolio/PortfolioV2Page.java @@ -37,5 +37,15 @@ public class PortfolioV2Page { public PortfolioV2Page(WebDriver browser) { this.browser = browser; } + + /* + .openEditor() + .selectMapInEditor() + .selectFirstPageInEditor() + .setPage(pageTitle, "With a little description") + .createStructureElement(structureElementTitle, "Structure description") + .closeEditor() + .assertStructure(structureElementTitle); + */ }