Index: lams_tool_daco/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r9dcdc46408a8664a0fb27f09ae58a340c15f5764 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 9dcdc46408a8664a0fb27f09ae58a340c15f5764) +++ lams_tool_daco/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -252,6 +252,8 @@ label.export.file.answer.date =Added on label.authoring.cancel.button =Cancel label.learning.submit =Finish +label.search=Search... +label.monitoring.average.number.records.heading=Average Number of Records #======= End labels: Exported 246 labels for en AU ===== Index: lams_tool_daco/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r9dcdc46408a8664a0fb27f09ae58a340c15f5764 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 9dcdc46408a8664a0fb27f09ae58a340c15f5764) +++ lams_tool_daco/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -252,6 +252,8 @@ label.export.file.answer.date =Added on label.authoring.cancel.button =Cancel label.learning.submit =Finish +label.search=Search... +label.monitoring.average.number.records.heading=Average Number of Records #======= End labels: Exported 246 labels for en AU ===== Index: lams_tool_daco/conf/xdoclet/struts-actions.xml =================================================================== diff -u -r6d674e346dea6ce7a824366c8a7c315660677744 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 6d674e346dea6ce7a824366c8a7c315660677744) +++ lams_tool_daco/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -140,6 +140,15 @@ + + + + + + + + + Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/DacoConstants.java =================================================================== diff -u -r6d674e346dea6ce7a824366c8a7c315660677744 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/DacoConstants.java (.../DacoConstants.java) (revision 6d674e346dea6ce7a824366c8a7c315660677744) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/DacoConstants.java (.../DacoConstants.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -110,7 +110,7 @@ public static final String LEARNING_VIEW_VERTICAL = "vertical"; - // monitoring summary query match + // monitoring summary query match & user data return public static final Long MONITORING_SUMMARY_MATCH_ALL = null; public static final Long MONITORING_SUMMARY_MATCH_NONE = -1L; @@ -121,6 +121,10 @@ public static final String USER_FULL_NAME = "userFullName"; + public static final String NOTEBOOK_ENTRY = "notebookEntry"; + + public static final String RECORD_COUNT = "recordCount"; + // for parameters' name public static final String PARAM_FILE_VERSION_ID = "fileVersionId"; @@ -180,6 +184,8 @@ public static final String ATTR_QUESTION_SUMMARIES = "questionSummaries"; + public static final String ATTR_SESSION_SUMMARIES = "sessionSummaries"; + public static final String ATTR_TOTAL_RECORD_COUNT = "totalRecordCount"; public static final String ATTR_IS_GROUPED_ACTIVITY = "isGroupedActivity"; @@ -300,4 +306,12 @@ public static final String KEY_LABEL_EXPORT_FILE_TITLE = "label.export.file.title"; public static final String KEY_LABEL_EXPORT_FILE_ANSWER_DATE = "label.export.file.answer.date"; + + // paging and sorting + public static final String ATTR_SORT = "sort"; + public static final int SORT_BY_NO = 0; + public static final int SORT_BY_USER_NAME_ASC = 1; + public static final int SORT_BY_USER_NAME_DESC = 2; + public static final int SORT_BY_NUM_RECORDS_ASC = 3; + public static final int SORT_BY_NUM_RECORDS_DESC = 4; } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoAnswerDAO.java =================================================================== diff -u -r3a7e6ed4a8777745c7c873a638306011036b8a8c -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoAnswerDAO.java (.../DacoAnswerDAO.java) (revision 3a7e6ed4a8777745c7c873a638306011036b8a8c) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoAnswerDAO.java (.../DacoAnswerDAO.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -24,4 +24,9 @@ * @return number of records for that user */ Integer getUserRecordCount(Long userId, Long sessionId); + + /** + * Gets the number of records entered by users in this session. + */ + Integer getSessionRecordCount(Long sessionId); } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoSessionDAO.java =================================================================== diff -u -r843648563725cffa91af1dfd96dce9682d39b410 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoSessionDAO.java (.../DacoSessionDAO.java) (revision 843648563725cffa91af1dfd96dce9682d39b410) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoSessionDAO.java (.../DacoSessionDAO.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -25,6 +25,7 @@ import java.util.List; +import org.lamsfoundation.lams.tool.daco.dto.MonitoringSummarySessionDTO; import org.lamsfoundation.lams.tool.daco.model.DacoSession; public interface DacoSessionDAO extends DAO { @@ -34,5 +35,7 @@ List getByContentId(Long toolContentId); void deleteBySessionId(Long toolSessionId); + + List statistics(Long toolContentUid); } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoUserDAO.java =================================================================== diff -u -r843648563725cffa91af1dfd96dce9682d39b410 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoUserDAO.java (.../DacoUserDAO.java) (revision 843648563725cffa91af1dfd96dce9682d39b410) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/DacoUserDAO.java (.../DacoUserDAO.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -25,6 +25,7 @@ import java.util.List; +import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; import org.lamsfoundation.lams.tool.daco.model.DacoUser; public interface DacoUserDAO extends DAO { @@ -34,4 +35,10 @@ DacoUser getUserByUserIdAndContentId(Long userId, Long contentId); List getBySessionId(Long sessionId); + + List getBySessionId(Long sessionId, int sorting); + + List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString, + boolean getNotebookEntries, ICoreNotebookService coreNotebookService); + int getCountUsersBySession(final Long sessionId, String searchString); } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoAnswerDAOHibernate.java =================================================================== diff -u -rceeb83235b4187f29543399d17414d15d7fd4df3 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoAnswerDAOHibernate.java (.../DacoAnswerDAOHibernate.java) (revision ceeb83235b4187f29543399d17414d15d7fd4df3) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoAnswerDAOHibernate.java (.../DacoAnswerDAOHibernate.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -49,7 +49,9 @@ private static final String FIND_USER_RECORD_COUNT = "SELECT COUNT (DISTINCT a.recordId) FROM " + DacoAnswer.class.getName() + " AS a WHERE a.user.userId=:userId AND a.user.session.sessionId=:sessionId"; - @SuppressWarnings("unchecked") + private static final String FIND_SESSION_RECORD_COUNT = "SELECT COUNT (DISTINCT a.recordId) FROM " + + DacoAnswer.class.getName() + " AS a WHERE a.user.session.sessionId=:sessionId"; + public List getQuestionSummaries(Long userUid, List summaries) { List result = (List) doFindByNamedParam( @@ -166,4 +168,9 @@ return ((Number) doFindByNamedParam(DacoAnswerDAOHibernate.FIND_USER_RECORD_COUNT, new String[] { "userId", "sessionId" }, new Object[] { userId, sessionId }).get(0)).intValue(); } + + public Integer getSessionRecordCount(Long sessionId) { + return ((Number) doFindByNamedParam(DacoAnswerDAOHibernate.FIND_SESSION_RECORD_COUNT, + new String[] { "sessionId" }, new Object[] { sessionId }).get(0)).intValue(); + } } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoSessionDAOHibernate.java =================================================================== diff -u -rceeb83235b4187f29543399d17414d15d7fd4df3 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoSessionDAOHibernate.java (.../DacoSessionDAOHibernate.java) (revision ceeb83235b4187f29543399d17414d15d7fd4df3) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoSessionDAOHibernate.java (.../DacoSessionDAOHibernate.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -25,8 +25,16 @@ import java.util.List; +import org.hibernate.Hibernate; +import org.hibernate.SQLQuery; +import org.hibernate.transform.Transformers; +import org.hibernate.type.IntegerType; +import org.hibernate.type.LongType; +import org.hibernate.type.StringType; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.tool.daco.dao.DacoSessionDAO; +import org.lamsfoundation.lams.tool.daco.dto.MonitoringSessionStatsDTO; +import org.lamsfoundation.lams.tool.daco.dto.MonitoringSummarySessionDTO; import org.lamsfoundation.lams.tool.daco.model.DacoSession; import org.springframework.stereotype.Repository; @@ -37,6 +45,14 @@ private static final String FIND_BY_CONTENT_ID = "from " + DacoSession.class.getName() + " as p where p.daco.contentId=? ORDER BY p.sessionId"; + private static final String CALC_SESSION_STATS = "SELECT sessionId, sessionName, COUNT(user_uid) numberLearners, SUM(record_count) totalRecordCount FROM " + + " (SELECT user.uid user_uid, sess.uid sessionId, sess.session_name sessionName, COUNT(DISTINCT(record_id)) record_count " + + " FROM tl_ladaco10_users user " + + " JOIN tl_ladaco10_sessions sess ON sess.uid = user.session_uid AND sess.content_uid = :contentUid " + + " LEFT JOIN tl_ladaco10_answers ans ON ans.user_uid = user.uid " + + " GROUP by user.uid) user_counts " + + " GROUP BY sessionId"; + public DacoSession getSessionBySessionId(Long sessionId) { List list = doFind(DacoSessionDAOHibernate.FIND_BY_SESSION_ID, sessionId); if (list == null || list.size() == 0) { @@ -53,4 +69,17 @@ public void deleteBySessionId(Long toolSessionId) { this.removeObject(DacoSession.class, toolSessionId); } + + public List statistics(Long toolContentUid) { + SQLQuery query = getSession().createSQLQuery(DacoSessionDAOHibernate.CALC_SESSION_STATS); + query.addScalar("sessionId", LongType.INSTANCE) + .addScalar("sessionName", StringType.INSTANCE) + .addScalar("numberLearners", IntegerType.INSTANCE) + .addScalar("totalRecordCount", IntegerType.INSTANCE) + .setLong("contentUid", toolContentUid) + .setResultTransformer(Transformers.aliasToBean(MonitoringSessionStatsDTO.class)); + return query.list(); + + } + } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoUserDAOHibernate.java =================================================================== diff -u -rceeb83235b4187f29543399d17414d15d7fd4df3 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoUserDAOHibernate.java (.../DacoUserDAOHibernate.java) (revision ceeb83235b4187f29543399d17414d15d7fd4df3) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoUserDAOHibernate.java (.../DacoUserDAOHibernate.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -25,7 +25,15 @@ import java.util.List; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.hibernate.Hibernate; +import org.hibernate.SQLQuery; +import org.hibernate.type.IntegerType; +import org.hibernate.type.StringType; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; +import org.lamsfoundation.lams.tool.daco.DacoConstants; import org.lamsfoundation.lams.tool.daco.dao.DacoUserDAO; import org.lamsfoundation.lams.tool.daco.model.DacoUser; import org.springframework.stereotype.Repository; @@ -62,4 +70,117 @@ public List getBySessionId(Long sessionId) { return (List) doFind(DacoUserDAOHibernate.FIND_BY_SESSION_ID, sessionId); } + + // support sorting by name or user id, not by record number + @SuppressWarnings("unchecked") + public List getBySessionId(Long sessionId, int sorting) { + String sortingOrder; + switch (sorting) { + case DacoConstants.SORT_BY_USER_NAME_ASC: + sortingOrder = " ORDER BY u.lastName ASC, u.firstName ASC"; + break; + case DacoConstants.SORT_BY_USER_NAME_DESC: + sortingOrder = " ORDER BY u.lastName DESC, u.firstName DESC"; + break; + case DacoConstants.SORT_BY_NO: + default: + sortingOrder = " ORDER BY u.uid"; + } + return (List) doFind(DacoUserDAOHibernate.FIND_BY_SESSION_ID+sortingOrder, sessionId); + } + + @SuppressWarnings("unchecked") + /** Will return List<[DacoUser, Integer (record count), String (notebook entry)], [DacoUser, Integer, String], ... , [DacoUser, Integer, String]> + * where the String is the notebook entry. No notebook entries needed? Will return "null" in their place. + */ + public List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, String searchString, + boolean getNotebookEntries, ICoreNotebookService coreNotebookService) { + + String sortingOrder; + switch (sorting) { + case DacoConstants.SORT_BY_USER_NAME_ASC: + sortingOrder = "user.last_name ASC, user.first_name ASC"; + break; + case DacoConstants.SORT_BY_USER_NAME_DESC: + sortingOrder = "user.last_name DESC, user.first_name DESC"; + break; + case DacoConstants.SORT_BY_NUM_RECORDS_ASC: + sortingOrder = "record_count ASC"; + break; + case DacoConstants.SORT_BY_NUM_RECORDS_DESC: + sortingOrder = "record_count DESC"; + break; + case DacoConstants.SORT_BY_NO: + default: + sortingOrder = "user.uid"; + } + + // If the session uses notebook, then get the SQL to join across to get the entries + String[] notebookEntryStrings = null; + if (getNotebookEntries) { + notebookEntryStrings = coreNotebookService.getNotebookEntrySQLStrings(sessionId.toString(), + DacoConstants.TOOL_SIGNATURE, "user.user_id"); + } + + // Basic select for the user records + StringBuilder queryText = new StringBuilder(); + + queryText.append("SELECT user.* "); + queryText.append(notebookEntryStrings != null ? notebookEntryStrings[0] : ", NULL notebookEntry"); + queryText.append(", COUNT(DISTINCT(record_id)) record_count"); + queryText.append(" FROM tl_ladaco10_users user "); + queryText.append(" JOIN tl_ladaco10_sessions sess on user.session_uid = sess.uid and sess.session_id = :sessionId"); + + // If filtering by name add a name based where clause + buildNameSearch(queryText, searchString); + + queryText.append(" LEFT JOIN tl_ladaco10_answers ans ON ans.user_uid = user.uid"); + + // If using notebook, add the notebook join + if ( notebookEntryStrings != null ) + queryText.append(notebookEntryStrings[1]); + + queryText.append(" GROUP BY user.uid"); + + // Now specify the sort based on the switch statement above. + queryText.append(" ORDER BY " + sortingOrder); + + SQLQuery query = getSession().createSQLQuery(queryText.toString()); + query.addEntity("user", DacoUser.class) + .addScalar("record_count", IntegerType.INSTANCE) + .addScalar("notebookEntry", StringType.INSTANCE) + .setLong("sessionId", sessionId.longValue()) + .setFirstResult(page * size) + .setMaxResults(size); + return query.list(); + + } + + private void buildNameSearch(StringBuilder queryText, String searchString) { + if (!StringUtils.isBlank(searchString)) { + String[] tokens = searchString.trim().split("\\s+"); + for (String token : tokens) { + String escToken = StringEscapeUtils.escapeSql(token); + queryText.append(" AND (user.first_name LIKE '%").append(escToken) + .append("%' OR user.last_name LIKE '%").append(escToken) + .append("%' OR user.login_name LIKE '%").append(escToken).append("%')"); + } + } + } + + @SuppressWarnings("rawtypes") + /** Return the number of potential users in a session for the tablesorter */ + public int getCountUsersBySession(final Long sessionId, String searchString) { + + StringBuilder queryText = new StringBuilder("SELECT count(*) FROM tl_ladaco10_users user "); + queryText.append(" JOIN tl_ladaco10_sessions sess on user.session_uid = sess.uid and sess.session_id = :sessionId"); + buildNameSearch(queryText, searchString); + + List list = getSession().createSQLQuery(queryText.toString()).setLong("sessionId", sessionId.longValue()).list(); + if (list == null || list.size() == 0) { + return 0; + } + return ((Number) list.get(0)).intValue(); + } + } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSessionStatsDTO.java =================================================================== diff -u --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSessionStatsDTO.java (revision 0) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSessionStatsDTO.java (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -0,0 +1,79 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.tool.daco.dto; + + +/** + * Basic statistics for a summary. + * + * @author Fiona Malikoff + * + */ +public class MonitoringSessionStatsDTO { + + private Long sessionId; + private String sessionName; + private Integer numberLearners; + private Integer totalRecordCount; + + public String getSessionName() { + return sessionName; + } + + public void setSessionName(String sessionName) { + this.sessionName = sessionName; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + public Integer getNumberLearners() { + return numberLearners != null ? numberLearners : 0; + } + + public void setNumberLearners(Integer numberLearners) { + this.numberLearners = numberLearners; + } + + public Integer getTotalRecordCount() { + return totalRecordCount != null ? totalRecordCount : 0; + } + + public void setTotalRecordCount(Integer totalRecordCount) { + this.totalRecordCount = totalRecordCount; + } + + public Integer getAverageRecordCount() { + if ( numberLearners != null && numberLearners > 0 && totalRecordCount != null ) { + return Math.round((float)totalRecordCount/numberLearners); + } + return 0; + } +} \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/DacoUser.java =================================================================== diff -u -r843648563725cffa91af1dfd96dce9682d39b410 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/DacoUser.java (.../DacoUser.java) (revision 843648563725cffa91af1dfd96dce9682d39b410) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/DacoUser.java (.../DacoUser.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -254,4 +254,8 @@ public void setAnswers(Set answers) { this.answers = answers; } + + public String getFullName() { + return new StringBuilder(getLastName()).append(" ").append(getFirstName()).toString(); + } } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java =================================================================== diff -u -r708bd4d049ae0a59d70c964ef2f864d2b7a352e6 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java (.../DacoServiceImpl.java) (revision 708bd4d049ae0a59d70c964ef2f864d2b7a352e6) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java (.../DacoServiceImpl.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -248,8 +248,7 @@ } @Override - public List> getDacoAnswersByUserUid(Long userUid) { - DacoUser user = getUser(userUid); + public List> getDacoAnswersByUser(DacoUser user) { Set answers = user.getAnswers(); List> result = new LinkedList>(); if ((answers != null) && (answers.size() > 0)) { @@ -443,16 +442,74 @@ List result = new ArrayList(sessions.size()); Daco daco = getDacoByContentId(contentId); for (DacoSession session : sessions) { + // for each session a monitoring summary is created but don't include users as the paging fetches them + MonitoringSummarySessionDTO monitoringRecordList = new MonitoringSummarySessionDTO(session.getSessionId(), + session.getSessionName()); + result.add(monitoringRecordList); + } + return result; + } + + @Override + public List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, + String searchString, boolean getNotebookEntries) { + return dacoUserDao.getUsersForTablesorter(sessionId, page, size, sorting, searchString, + getNotebookEntries, coreNotebookService); + } + + public int getCountUsersBySession(final Long sessionId, String searchString) { + return dacoUserDao.getCountUsersBySession( sessionId, searchString); + } + + public List getSessionStatistics(Long toolContentUid) { + return dacoSessionDao.statistics(toolContentUid); + } + + public MonitoringSummarySessionDTO getAnswersAsRecords(final Long sessionId, final Long userId, int sorting) + { + DacoSession session = dacoSessionDao.getSessionBySessionId(sessionId); + MonitoringSummarySessionDTO monitoringRecordList = new MonitoringSummarySessionDTO(session.getSessionId(), session.getSessionName()); + + List monitoringUsers = new ArrayList(); + if ( userId == null ) { + List users = dacoUserDao.getBySessionId(sessionId, sorting); + for ( DacoUser user : users ) { + monitoringUsers.add(getAnswersAsRecordsForUser(user)); + } + } else { + monitoringUsers.add(getAnswersAsRecordsForUser(getUserByUserIdAndSessionId(userId, sessionId))); + } + + monitoringRecordList.setUsers(monitoringUsers); + return monitoringRecordList; + } + + // called by getAnswersAsRecords + private MonitoringSummaryUserDTO getAnswersAsRecordsForUser(DacoUser user) { + MonitoringSummaryUserDTO monitoringUser = new MonitoringSummaryUserDTO(user.getUid(), + user.getUserId().intValue(), user.getFullName(), + user.getLoginName()); + List> records = getDacoAnswersByUser(user); + monitoringUser.setRecords(records); + monitoringUser.setRecordCount(records.size()); + return monitoringUser; + } + + public List getExportPortfolioSummary(Long contentId, Long userUid) { + List sessions = dacoSessionDao.getByContentId(contentId); + List result = new ArrayList(sessions.size()); + Daco daco = getDacoByContentId(contentId); + for (DacoSession session : sessions) { // for each session a monitoring summary is created MonitoringSummarySessionDTO monitoringRecordList = new MonitoringSummarySessionDTO(session.getSessionId(), session.getSessionName()); List users = dacoUserDao.getBySessionId(session.getSessionId()); List monitoringUsers = new ArrayList(users.size()); for (DacoUser user : users) { MonitoringSummaryUserDTO monitoringUser = new MonitoringSummaryUserDTO(user.getUid(), - user.getUserId().intValue(), user.getLastName() + " " + user.getFirstName(), + user.getUserId().intValue(), user.getFullName(), user.getLoginName()); - List> records = getDacoAnswersByUserUid(user.getUid()); + List> records = getDacoAnswersByUser(user); /* * If the user provided as "userUid" matches current user UID, the summary is filled with additional * data. NULL matches all users. UID < 0 matches no users, so only the brief description of users is @@ -525,15 +582,13 @@ @Override public void notifyTeachersOnLearnerEntry(Long sessionId, DacoUser dacoUser) { - String userName = dacoUser.getLastName() + " " + dacoUser.getFirstName(); - String message = getLocalisedMessage("event.learnerentry.body", new Object[] { userName }); + String message = getLocalisedMessage("event.learnerentry.body", new Object[] { dacoUser.getFullName() }); eventNotificationService.notifyLessonMonitors(sessionId, message, false); } @Override public void notifyTeachersOnRecordSumbit(Long sessionId, DacoUser dacoUser) { - String userName = dacoUser.getLastName() + " " + dacoUser.getFirstName(); - String message = getLocalisedMessage("event.recordsubmit.body", new Object[] { userName }); + String message = getLocalisedMessage("event.recordsubmit.body", new Object[] { dacoUser.getFullName() }); eventNotificationService.notifyLessonMonitors(sessionId, message, false); } @@ -590,7 +645,7 @@ @Override public void forceCompleteUser(Long toolSessionId, User user) { - //no actions required + // no actions required } @Override @@ -790,6 +845,7 @@ coreNotebookService.deleteEntry(entry); } } + dacoDao.removeObject(Daco.class, daco.getUid()); } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java =================================================================== diff -u -rbb597b8155375e6ac4dfe280f630d323b6e5e575 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java (.../IDacoService.java) (revision bb597b8155375e6ac4dfe280f630d323b6e5e575) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java (.../IDacoService.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -133,13 +133,13 @@ void deleteDacoRecord(List record); /** - * Return all reource questions within the given toolSessionID. + * Return all answers for a given user, grouped by record. * - * @param sessionId + * @param user * * @return */ - List> getDacoAnswersByUserUid(Long userUid); + List> getDacoAnswersByUser(DacoUser user); /** * Get daco which is relative with the special toolSession. @@ -272,9 +272,9 @@ * @return number of records in that group */ Integer getGroupRecordCount(MonitoringSummarySessionDTO monitoringSummary); - + /** - * Creates summary that is later used in the monitoring. + * Creates summary that is later used in the monitoring. Does not include users. * * @param contentId * ID of Daco for which the summary should be created @@ -286,7 +286,33 @@ */ List getMonitoringSummary(Long contentId, Long userUid); + /** Get the detailed records for a user (userId != null) or group (userId == null). SessionId should + * always be set. + */ + MonitoringSummarySessionDTO getAnswersAsRecords(final Long sessionId, final Long userId, int sorting); + /** + * Creates summary that is later used in the export portfolio. + * + * @param contentId + * ID of Daco for which the summary should be created + * @param userUid + * ID of the user for who the summary details should be created; null if the summary + * details should be created for all users; < 0 if the summary details should be + * created for noone + * @return list of monitoring summaries, one for each session + */ + List getExportPortfolioSummary(Long contentId, Long userUid); + + /** Get a paged user list for monitoring */ + List getUsersForTablesorter(final Long sessionId, int page, int size, int sorting, + String searchString, boolean getNotebookEntries); + int getCountUsersBySession(final Long sessionId, String searchString); + + /** Get the basic statistics for all sessions. Used by Monitoring */ + List getSessionStatistics(Long toolContentUid); + + /** * Get how many records has the given user posted. * * @param userID Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java =================================================================== diff -u -rbb597b8155375e6ac4dfe280f630d323b6e5e575 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java (.../LearningAction.java) (revision bb597b8155375e6ac4dfe280f630d323b6e5e575) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java (.../LearningAction.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -53,8 +53,6 @@ import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.upload.FormFile; -import org.lamsfoundation.lams.events.DeliveryMethodMail; -import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.learning.web.bean.ActivityPositionDTO; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -73,7 +71,6 @@ import org.lamsfoundation.lams.tool.daco.util.DacoQuestionComparator; import org.lamsfoundation.lams.tool.daco.web.form.RecordForm; import org.lamsfoundation.lams.tool.daco.web.form.ReflectionForm; -import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.FileValidatorUtil; import org.lamsfoundation.lams.util.NumberUtil; @@ -149,9 +146,11 @@ * @return */ protected ActionForward diplayHorizontalRecordList(ActionMapping mapping, HttpServletRequest request) { - request - .setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, request + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, request .getParameter(DacoConstants.ATTR_SESSION_MAP_ID)); + Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID , true); + if ( userUid != null ) + request.setAttribute(DacoConstants.USER_UID, userUid); return mapping.findForward(DacoConstants.SUCCESS); } @@ -210,7 +209,7 @@ sessionMap.put(DacoConstants.ATTR_DACO, daco); sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - List> records = service.getDacoAnswersByUserUid(dacoUser.getUid()); + List> records = service.getDacoAnswersByUser(dacoUser); sessionMap.put(DacoConstants.ATTR_RECORD_LIST, records); request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, records.size() + 1); @@ -1043,13 +1042,28 @@ IDacoService service = getDacoService(); DacoUser user = getCurrentUser(service, sessionId, daco); - List summaries = service.getQuestionSummaries(user.getUid()); - sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + // get mode - monitoring vs learner + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + if (mode != null && mode.isTeacher()) { + // monitoring mode - user is specified in URL + // user may be null if the user was force completed. + user = getSpecifiedUser(service, sessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, + false)); + } else { + user = getCurrentUser(service, sessionId, daco); + } - Integer totalRecordCount = service.getGroupRecordCount(user.getSession().getSessionId()); - sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + if ( user != null ) { + List summaries = service.getQuestionSummaries(user.getUid()); + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + Integer totalRecordCount = service.getGroupRecordCount(user.getSession().getSessionId()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); + } else { + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, new LinkedList()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, 0); + } + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); return mapping.findForward(DacoConstants.SUCCESS); } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java =================================================================== diff -u -r6d674e346dea6ce7a824366c8a7c315660677744 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 6d674e346dea6ce7a824366c8a7c315660677744) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -39,12 +39,16 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.daco.DacoConstants; @@ -74,12 +78,15 @@ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException, ParseException { + HttpServletResponse response) throws IOException, ServletException, ParseException, JSONException { String param = mapping.getParameter(); if (param.equals("summary")) { return summary(mapping, request); } + if (param.equals("getUsers")) { + return getUsers(mapping, form, request, response); + } if (param.equals("viewReflection")) { return viewReflection(mapping, request); } @@ -90,24 +97,54 @@ if (param.equals("changeView")) { return changeView(mapping, request); } + if (param.equals("getQuestionSummaries")) { + return getQuestionSummaries(mapping, request); + } + if (param.equals("statistic")) { + return statistic(mapping, request); + } if (param.equals("exportToSpreadsheet")) { return exportToSpreadsheet(request, response); } + return mapping.findForward(DacoConstants.ERROR); } protected ActionForward listRecords(ActionMapping mapping, HttpServletRequest request) { + return listRecords(mapping, request, false); + } + + protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { + return listRecords(mapping, request, true); + } + + private ActionForward listRecords(ActionMapping mapping, HttpServletRequest request, boolean changeView) { + String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); - Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); - IDacoService service = getDacoService(); - sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, service - .getMonitoringSummary(daco.getContentId(), userUid)); + Long toolSessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID, true); + Long userId = WebUtil.readLongParam(request, DacoConstants.USER_ID, true); + Integer sortOrder = WebUtil.readIntParam(request, DacoConstants.ATTR_SORT, true); + if ( sortOrder == null ) + sortOrder = DacoConstants.SORT_BY_NO; + + sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, + getDacoService().getAnswersAsRecords(toolSessionId, userId, sortOrder)); request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + request.setAttribute(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); + request.setAttribute(DacoConstants.ATTR_SORT, sortOrder); + request.setAttribute(DacoConstants.USER_ID, userId); - request.setAttribute(DacoConstants.USER_UID, userUid); + if (changeView) { + String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); + if ( DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); + } else { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); + } + } + return mapping.findForward(DacoConstants.SUCCESS); } @@ -139,22 +176,9 @@ userUid = (Long) sessionMap.get(DacoConstants.USER_UID); request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 1); } else { - request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 4); + request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 3); } - if (userUid == null && !monitoringSummaryList.isEmpty() && !monitoringSummaryList.get(0).getUsers().isEmpty()) { - userUid = monitoringSummaryList.get(0).getUsers().get(0).getUid(); - } - if (userUid != null) { - List summaries = service.getQuestionSummaries(userUid); - sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); - - Integer totalRecordCount = service - .getGroupRecordCount(service.getUser(userUid).getSession().getSessionId()); - sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); - monitoringSummaryList = service.getMonitoringSummary(contentId, userUid); - } - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); sessionMap.put(DacoConstants.USER_UID, userUid); sessionMap.put(DacoConstants.PAGE_EDITABLE, !daco.isContentInUse()); @@ -174,6 +198,74 @@ return mapping.findForward(DacoConstants.SUCCESS); } + protected ActionForward getUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse res) throws IOException, ServletException, JSONException { + + IDacoService service = getDacoService(); + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID, true); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + + Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); + + Long contentId = sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID) == null ? WebUtil.readLongParam(request, + AttributeNames.PARAM_TOOL_CONTENT_ID) : (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); + + // paging parameters of tablesorter + int size = WebUtil.readIntParam(request, "size"); + int page = WebUtil.readIntParam(request, "page"); + Integer isSort1 = WebUtil.readIntParam(request, "column[0]", true); + Integer isSort2 = WebUtil.readIntParam(request, "column[1]", true); + String searchString = request.getParameter("fcol[0]"); + + int sorting = DacoConstants.SORT_BY_NO; + if ((isSort1 != null) && isSort1.equals(0)) { + sorting = DacoConstants.SORT_BY_USER_NAME_ASC; + + } else if ((isSort1 != null) && isSort1.equals(1)) { + sorting = DacoConstants.SORT_BY_USER_NAME_DESC; + + } else if ((isSort2 != null) && isSort2.equals(0)) { + sorting = DacoConstants.SORT_BY_NUM_RECORDS_ASC; + + } else if ((isSort2 != null) && isSort2.equals(1)) { + sorting = DacoConstants.SORT_BY_NUM_RECORDS_DESC; + } + + Daco daco = service.getDacoByContentId(contentId); + + List users = service.getUsersForTablesorter(sessionId, page, size, sorting, searchString, + daco.isReflectOnActivity()); + + JSONArray rows = new JSONArray(); + + JSONObject responsedata = new JSONObject(); + responsedata.put("total_rows", service.getCountUsersBySession(sessionId, searchString)); + + for (Object[] userAndReflection : users) { + + JSONObject responseRow = new JSONObject(); + + DacoUser user = (DacoUser) userAndReflection[0]; + + responseRow.put(DacoConstants.USER_ID, user.getUserId()); + responseRow.put(DacoConstants.USER_FULL_NAME, StringEscapeUtils.escapeHtml(user.getFullName())); + + if ( userAndReflection.length > 1 && userAndReflection[1] != null) { + responseRow.put(DacoConstants.RECORD_COUNT, (Integer)userAndReflection[1]); + } else { + responseRow.put(DacoConstants.RECORD_COUNT, 0); + } + + if ( userAndReflection.length > 2 && userAndReflection[2] != null) { + responseRow.put(DacoConstants.NOTEBOOK_ENTRY, StringEscapeUtils.escapeHtml((String)userAndReflection[2])); + } + rows.put(responseRow); + } + responsedata.put("rows", rows); + res.setContentType("application/json;charset=utf-8"); + res.getWriter().print(new String(responsedata.toString())); + return null; + } protected ActionForward viewReflection(ActionMapping mapping, HttpServletRequest request) { String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); @@ -185,8 +277,7 @@ NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, DacoConstants.TOOL_SIGNATURE, userId); - MonitoringSummaryUserDTO userDTO = new MonitoringSummaryUserDTO(null, userId, user.getLastName() + " " - + user.getFirstName(), null); + MonitoringSummaryUserDTO userDTO = new MonitoringSummaryUserDTO(null, userId, user.getFullName(), null); userDTO.setReflectionEntry(notebookEntry.getEntry()); sessionMap.put(DacoConstants.ATTR_USER, userDTO); request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); @@ -199,22 +290,6 @@ return (IDacoService) wac.getBean(DacoConstants.DACO_SERVICE); } - protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - - String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); - Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); - request.setAttribute(DacoConstants.USER_UID, userUid); - if (DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - } else { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); - } - return mapping.findForward(DacoConstants.SUCCESS); - } - /** * Exports all learners' data to an Excel or CSV file. * @@ -259,7 +334,7 @@ List rows = new LinkedList(); // We get all sessions with all users with all their records from the given Daco content - List monitoringSummary = service.getMonitoringSummary(daco.getContentId(), null); + List monitoringSummary = service.getExportPortfolioSummary(daco.getContentId(), null); // Get current user's locale to format numbers properly Locale monitoringUserLocale = null; HttpSession ss = SessionManager.getSession(); @@ -404,4 +479,62 @@ // Return the file inside response, but not any JSP page return null; } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected ActionForward getQuestionSummaries(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + + Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); + IDacoService service = getDacoService(); + + DacoUser user; + Long userId = WebUtil.readLongParam(request, DacoConstants.USER_ID, true); + user = userId != null ? service.getUserByUserIdAndSessionId(userId, sessionId) : null; + + if ( user != null ) { + List summaries = service.getQuestionSummaries(user.getUid()); + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + Integer totalRecordCount = service.getGroupRecordCount(sessionId); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); + Integer userRecordCount = service.getRecordNum(userId, sessionId); + sessionMap.put(DacoConstants.RECORD_COUNT, userRecordCount); + sessionMap.put(DacoConstants.USER_FULL_NAME, user.getFullName()); + } else { + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, new LinkedList()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, 0); + sessionMap.put(DacoConstants.RECORD_COUNT, 0); + sessionMap.put(DacoConstants.USER_FULL_NAME, ""); + } + + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return mapping.findForward(DacoConstants.SUCCESS); + } + + /** + * Show statistics page. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + private ActionForward statistic(ActionMapping mapping, HttpServletRequest request) { + + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + + IDacoService service = getDacoService(); + + Long contentId = sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID) == null ? WebUtil.readLongParam(request, + AttributeNames.PARAM_TOOL_CONTENT_ID) : (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); + Daco daco = service.getDacoByContentId(contentId); + List sessList = service.getSessionStatistics(daco.getUid()); + + request.setAttribute(DacoConstants.ATTR_SESSION_SUMMARIES, sessList); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return mapping.findForward(DacoConstants.SUCCESS); + } + } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/servlet/ExportServlet.java =================================================================== diff -u -r6d674e346dea6ce7a824366c8a7c315660677744 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision 6d674e346dea6ce7a824366c8a7c315660677744) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -115,7 +115,7 @@ ExportServlet.logger.error(error); throw new DacoApplicationException(error); } - List monitoringSummary = service.getMonitoringSummary(daco.getContentId(), + List monitoringSummary = service.getExportPortfolioSummary(daco.getContentId(), DacoConstants.MONITORING_SUMMARY_MATCH_ALL); sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, monitoringSummary); sessionMap.put(AttributeNames.ATTR_MODE, ToolAccessMode.TEACHER); @@ -160,7 +160,7 @@ } } if (anyRecordsAvailable) { - writeResponseToFile(basePath + "/pages/monitoring/listRecords.jsp?sessionMapID=" + sessionMap.getSessionID() + writeResponseToFile(basePath + "/pages/export/listRecords.jsp?sessionMapID=" + sessionMap.getSessionID() + "&includeMode=exportportfolio", learnerDirectory, "allRecords.html", cookies); } } @@ -196,7 +196,7 @@ sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); sessionMap.put(DacoConstants.ATTR_DACO, daco); - List> records = service.getDacoAnswersByUserUid(user.getUid()); + List> records = service.getDacoAnswersByUser(user); new File(directory, "files").mkdir(); for (List record : records) { Index: lams_tool_daco/web/common/jqueryheader.jsp =================================================================== diff -u --- lams_tool_daco/web/common/jqueryheader.jsp (revision 0) +++ lams_tool_daco/web/common/jqueryheader.jsp (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -0,0 +1,22 @@ +<%@ include file="/common/taglibs.jsp"%> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: lams_tool_daco/web/includes/javascript/dacoMonitoring.js =================================================================== diff -u -r843648563725cffa91af1dfd96dce9682d39b410 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/web/includes/javascript/dacoMonitoring.js (.../dacoMonitoring.js) (revision 843648563725cffa91af1dfd96dce9682d39b410) +++ lams_tool_daco/web/includes/javascript/dacoMonitoring.js (.../dacoMonitoring.js) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -9,15 +9,15 @@ function doSelectTab(tabId) { selectTab(tabId); currentTab = tabId; + + //for statistic page change: + if(tabId == 3) { + doStatistic(); + } } - function refreshPage (url){ - var userDropdown=document.getElementById("userDropdown"); - var selectedValue = userDropdown.options[userDropdown.selectedIndex].value; - if (selectedValue == "SHOW_ALL"){ - document.location.href = url; - } - else if (selectedValue >= 0){ - document.location.href = url+"&userUid="+selectedValue; - } - } \ No newline at end of file + function doStatistic(){ + var url = gStatisticsUrl+"&reqID="+(new Date()).getTime(); + $("#statisticArea").load(url); + } + \ No newline at end of file Index: lams_tool_daco/web/pages/export/listRecords.jsp =================================================================== diff -u --- lams_tool_daco/web/pages/export/listRecords.jsp (revision 0) +++ lams_tool_daco/web/pages/export/listRecords.jsp (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -0,0 +1,74 @@ +<%@ include file="/common/taglibs.jsp"%> + + + + <%-- This page modifies its content depending on the page it was included from. --%> + + + + + + + + + + + + + <%@ include file="/common/header.jsp"%> + + + + + <fmt:message key="title.monitoring.recordlist" /> + + + +
+
+
+
+ + + + + + + + + + + + + + + + + +
+ : ${userGroup.sessionName} +
+ + + ${user.recordCount} +
+ <%-- for each user his record list is displayed --%> + + + <%@ include file="/pages/learning/listRecords.jsp" %> + +
+
+
+
+ +
+ +
Index: lams_tool_daco/web/pages/learning/listRecords.jsp =================================================================== diff -u -re101d0a2cb3707a0d566c12d0c59c8ec1bbac3b0 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/web/pages/learning/listRecords.jsp (.../listRecords.jsp) (revision e101d0a2cb3707a0d566c12d0c59c8ec1bbac3b0) +++ lams_tool_daco/web/pages/learning/listRecords.jsp (.../listRecords.jsp) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -94,7 +94,7 @@ - + Index: lams_tool_daco/web/pages/learning/listRecordsHorizontalPart.jsp =================================================================== diff -u -re101d0a2cb3707a0d566c12d0c59c8ec1bbac3b0 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/web/pages/learning/listRecordsHorizontalPart.jsp (.../listRecordsHorizontalPart.jsp) (revision e101d0a2cb3707a0d566c12d0c59c8ec1bbac3b0) +++ lams_tool_daco/web/pages/learning/listRecordsHorizontalPart.jsp (.../listRecordsHorizontalPart.jsp) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -17,21 +17,6 @@ <%-- It contains users info divided into sessions. --%> - - <%-- Record list comes from different sources, depending on the including page. --%> - - - - - - - - - - - - - <%-- To enable the table to have maximum height. --%> @@ -50,6 +35,20 @@ + + <%-- Record list comes from different sources, depending on the including page. --%> + + + + + + + + + + + + <%-- Each column is one record. This is pure data - header was done in the including page. --%> Index: lams_tool_daco/web/pages/monitoring/listRecords.jsp =================================================================== diff -u -re8fca2eb1f86ce02244d9735c2a4332224ae5a40 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/web/pages/monitoring/listRecords.jsp (.../listRecords.jsp) (revision e8fca2eb1f86ce02244d9735c2a4332224ae5a40) +++ lams_tool_daco/web/pages/monitoring/listRecords.jsp (.../listRecords.jsp) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -1,26 +1,20 @@ <%@ include file="/common/taglibs.jsp"%> - + - <%-- This page modifies its content depending on the page it was included from. --%> + <%-- This page/learning/listRecords.jsp page modifies its content depending on the page it was included from. --%> - <%-- The style sheet file is either on the server (monitoring) - or in the parent directory (export portfolio) --%> - - - - - + <%@ include file="/common/header.jsp"%> @@ -41,72 +35,29 @@
- +
<%-- Switch between the horizontal and vertical views --%> - + + + " onclick="javascript:document.location.href='${changeViewUrl}'" />
-
- - - - -
-
- <%-- Users in the dropdown menu are divided into groups. - Currently displayed user is selected. - There is also an option to display all records of all users. --%> - -
- - - - - - -
- -
- - - - + + +

: ${userGroup.sessionName}

+
+
+ - - - - -
- : ${userGroup.sessionName} -
@@ -116,14 +67,11 @@
- <%-- for each user his record list is displayed --%> <%@ include file="/pages/learning/listRecords.jsp" %> -
-
Index: lams_tool_daco/web/pages/monitoring/monitoring.jsp =================================================================== diff -u -r6d674e346dea6ce7a824366c8a7c315660677744 -r102a93686f5779e8caf5a693f388edda2e01f05d --- lams_tool_daco/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 6d674e346dea6ce7a824366c8a7c315660677744) +++ lams_tool_daco/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 102a93686f5779e8caf5a693f388edda2e01f05d) @@ -6,7 +6,7 @@ - <%@ include file="/common/tabbedheader.jsp" %> + <%@ include file="/common/jqueryheader.jsp" %> + + $(document).ready(function(){ + + $(".tablesorter").tablesorter({ + theme: 'blue', + sortInitialOrder: 'desc', + sortList: [[0]], + widgets: [ "resizable", "filter" ], + headers: { 1: { filter: false}, 2: { filter: false, sorter: false }, 3: { filter: false, sorter: false }, 4: { filter: false, sorter: false } }, + widgetOptions: { + resizable: true, + // include column filters + filter_columnFilters: true, + filter_placeholder: { search : '' }, + filter_searchDelay: 700 + } + }); + + $(".tablesorter").each(function() { + $(this).tablesorterPager({ + savePages: false, + ajaxUrl : "?sessionMapID=${sessionMapID}&page={page}&size={size}&{sortList:column}&{filterList:fcol}&toolSessionID=" + $(this).attr('data-session-id'), + ajaxProcessing: function (data, table) { + if (data && data.hasOwnProperty('rows')) { + var rows = [], + json = {}; + + for (i = 0; i < data.rows.length; i++){ + var userData = data.rows[i]; + + rows += ''; + + rows += ''; + rows += userData["userFullName"]; + rows += ''; + + rows += ''; + rows += userData["recordCount"]; + rows += ''; + rows += ''; + if ( userData["recordCount"] > 0) { + var url = '?sessionMapID=${sessionMapID}&toolSessionID='+$(table).attr('data-session-id')+'&sort=1&userId='+userData["userId"]; + var popUpTitle = ''; + rows += '  '; + rows += 'View Records' + url = '?sessionMapID=${sessionMapID}&toolSessionID='+$(table).attr('data-session-id')+'&userId='+userData["userId"]; + popUpTitle = ''; + rows += '  '; + rows += 'View Summary' + rows += ''; + } + rows += ''; + + if (${daco.reflectOnActivity}) { + rows += ''; + rows += (userData["notebookEntry"]) ? userData["notebookEntry"] : '' ; + rows += ''; + } + + rows += ''; + } + + json.total = data.total_rows; + json.rows = $(rows); + return json; + + } + }, + container: $(this).next(".pager"), + output: '{startRow} to {endRow} ({totalRows})', + // css class names of pager arrows + cssNext: '.tablesorter-next', // next page arrow + cssPrev: '.tablesorter-prev', // previous page arrow + cssFirst: '.tablesorter-first', // go to first page arrow + cssLast: '.tablesorter-last', // go to last page arrow + cssGoto: '.gotoPage', // select dropdown to allow choosing a page + cssPageDisplay: '.pagedisplay', // location of where the "output" is displayed + cssPageSize: '.pagesize', // page size selector - select dropdown that sets the "size" option + // class added to arrows when at the extremes (i.e. prev/first arrows are "disabled" when on the first page) + cssDisabled: 'disabled' // Note there is no period "." in front of this class name + }) + }); + }) +

-
+
- +
+ + +
+ +

+ : +

+ + + +
- - - - - - - - - - +
+
+ - + + + + + + + + + + + + - - - - - - - - - - - -
- : ${sessionSummary.sessionName} -
- - - - - - - - - - - ${user.recordCount} - - - - 0 - - - - - - - - - - - - - - - - - - -
+ + + + + +
+
+ + + + + + +
+
+ +
+
+ +

- - + + - - - - - - + + + + +