Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -163,8 +163,8 @@ label.learning.true.false.true =True label.learning.true.false.false =False label.learning.ordering.sort.answers =Sort answers in the right order -label.learning.marks.penalty =Marks for this submission: {0}/{1}. This submission attracted a penalty of {2}. label.learning.marks =Marks for this submission: {0}/{1}. +label.learning.penalty =This submission attracted a penalty of {0}. label.learning.finish.test =Finish Test label.learning.submit.all =Submit All label.learning.next.activity =Next Activity @@ -177,6 +177,10 @@ label.learning.summary.grade =Grade label.learning.summary.out.of.maximum =out of a maximum of label.learning.summary.feedback =Feedback +label.learning.question.summary.history.responces =History of Responses: +label.learning.question.summary.response =Response +label.learning.question.summary.grade =Grade +label.learning.blockui.time.is.over =Time is over. Processing your answers... monitoring.tab.summary =Summary monitoring.tab.instructions =Instruction monitoring.tab.statistics =Statistic Index: lams_tool_assessment/conf/xdoclet/struts-actions.xml =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -217,28 +217,7 @@ parameter="downOption"> - - - - - - - - - getAssessmentQuestionResultList(Long assessmentUid, Long userId, Long questionUid); // public AssessmentQuestionResult getAssessmentQuestionResult(Long questionUid, Long userId); // Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -r98ccad973dd8280fbae78c301f824877b2564c44 -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 98ccad973dd8280fbae78c301f824877b2564c44) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -24,9 +24,7 @@ package org.lamsfoundation.lams.tool.assessment.dao; import java.util.List; -import java.util.Map; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; public interface AssessmentResultDAO extends DAO { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java =================================================================== diff -u -r98ccad973dd8280fbae78c301f824877b2564c44 -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision 98ccad973dd8280fbae78c301f824877b2564c44) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -23,24 +23,24 @@ /* $$Id$$ */ package org.lamsfoundation.lams.tool.assessment.dao.hibernate; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentQuestionResultDAO; -import org.lamsfoundation.lams.tool.assessment.model.Assessment; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; public class AssessmentQuestionResultDAOHibernate extends BaseDAOHibernate implements AssessmentQuestionResultDAO { // private static final String FIND_BY_QUESTION_AND_USER = "from " + AssessmentQuestionResult.class.getName() // + " as r where r.user.userId = ? and r.assessmentQuestion.uid=?"; // -// private static final String FIND_BY_QUESTION_AND_SESSION = "from " + AssessmentQuestionResult.class.getName() -// + " as r where r.sessionId = ? and r.assessmentQuestion.uid=?"; -// + private static final String FIND_BY_ASSESSMENT_QUESTION_AND_USER = "from " + + AssessmentQuestionResult.class.getName() + + " as q, " + + AssessmentResult.class.getName() + + " as r " + + " where q.resultUid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? order by r.startDate asc"; + //// private static final String FIND_VIEW_COUNT_BY_USER = "select count(*) from " //// + AssessmentQuestionResult.class.getName() + " as r where r.sessionId=? and r.user.userId =?"; // @@ -55,7 +55,7 @@ + " as q, " + AssessmentResult.class.getName() + " as r " - + " where q.resultUid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? and q.mark = 0"; + + " where q.resultUid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? and q.mark < q.assessmentQuestion.defaultGrade"; // public AssessmentQuestionResult getAssessmentQuestionResult(Long questionUid, Long userId) { // List list = getHibernateTemplate().find(FIND_BY_QUESTION_AND_USER, new Object[] { userId, questionUid }); @@ -86,7 +86,7 @@ // } // // public List getAssessmentQuestionResultBySession(Long sessionId, Long questionUid) { -// return getHibernateTemplate().find(FIND_BY_QUESTION_AND_SESSION, new Object[] { sessionId, questionUid }); +// return getHibernateTemplate().find(FIND_BY_ASSESSMENT_QUESTION_AND_USER, new Object[] { sessionId, questionUid }); // } public int getNumberWrongAnswersDoneBefore(Long assessmentUid, Long userId, Long questionUid) { @@ -98,4 +98,8 @@ } } + public List getAssessmentQuestionResultList(Long assessmentUid, Long userId, Long questionUid) { + return getHibernateTemplate().find(FIND_BY_ASSESSMENT_QUESTION_AND_USER, new Object[] { assessmentUid, userId, questionUid }); + } + } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -r98ccad973dd8280fbae78c301f824877b2564c44 -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 98ccad973dd8280fbae78c301f824877b2564c44) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -23,27 +23,21 @@ /* $Id$ */ package org.lamsfoundation.lams.tool.assessment.dao.hibernate; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.lamsfoundation.lams.tool.assessment.dao.AssessmentQuestionResultDAO; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO; -import org.lamsfoundation.lams.tool.assessment.model.Assessment; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; public class AssessmentResultDAOHibernate extends BaseDAOHibernate implements AssessmentResultDAO { private static final String FIND_BY_ASSESSMENT_AND_USER = "from " + AssessmentResult.class.getName() - + " as r where r.user.userId = ? and r.assessment.uid=? order by start_date asc"; + + " as r where r.user.userId = ? and r.assessment.uid=? order by r.startDate asc"; private static final String FIND_BY_ASSESSMENT_AND_SESSION = "from " + AssessmentResult.class.getName() + " as r where r.sessionId = ? and r.assessment.uid=?"; private static final String FIND_ASSESSMENT_RESULT_COUNT_BY_ASSESSMENT_AND_USER = "select count(*) from " - + AssessmentResult.class.getName() + " as r where r.user.userId=? and r.assessment.uid=?"; + + AssessmentResult.class.getName() + " as r where r.user.userId=? and r.assessment.uid=? and (r.finishDate != null)"; // private static final String FIND_SUMMARY = "select v.assessmentQuestion.uid, count(v.assessmentQuestion) from " // + AssessmentQuestionResult.class.getName() + " as v , " + AssessmentSession.class.getName() + " as s, " Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.hbm.xml =================================================================== diff -u -rc56857991e269aa7f5bd250a05b52c767a9957ad -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.hbm.xml (.../Assessment.hbm.xml) (revision c56857991e269aa7f5bd250a05b52c767a9957ad) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.hbm.xml (.../Assessment.hbm.xml) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -240,22 +240,6 @@ /> - - - - matchingPairOptions; + private List questionResults; + public AssessmentQuestion() { questionOptions = new TreeSet(new SequencableComparator()); units = new TreeSet(new SequencableComparator()); @@ -492,4 +495,11 @@ public void setMatchingPairOptions(Set matchingPairOptions) { this.matchingPairOptions = matchingPairOptions; } + + public List getQuestionResults() { + return questionResults; + } + public void setQuestionResults(List questionResults) { + this.questionResults = questionResults; + } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.hbm.xml =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.hbm.xml (.../AssessmentQuestionResult.hbm.xml) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.hbm.xml (.../AssessmentQuestionResult.hbm.xml) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -96,7 +96,6 @@ lazy="false" cascade="all" sort="unsorted" - order-by="sequence_id asc" > optionAnswers; public AssessmentQuestionResult() { - optionAnswers = new TreeSet(new SequencableComparator()); + optionAnswers = new LinkedHashSet(); } /** @@ -171,7 +172,7 @@ /** * - * @hibernate.set cascade="all" order-by="sequence_id asc" + * @hibernate.set cascade="all" * @hibernate.collection-key column="question_result_uid" * @hibernate.collection-one-to-many class="org.lamsfoundation.lams.tool.assessment.model.AssessmentOptionAnswer" * Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -102,7 +102,6 @@ import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.audit.IAuditService; -import org.lamsfoundation.lams.web.util.SessionMap; /** * @@ -426,7 +425,6 @@ result.setSessionId(toolSessionId); result.setStartDate(new Timestamp(new Date().getTime())); assessmentResultDao.saveObject(result); - int dd = 22; } public void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions) { @@ -458,7 +456,7 @@ Set optionAnswers = questionResult.getOptionAnswers(); for (AssessmentQuestionOption questionOption : question.getQuestionOptions()) { AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer(); - optionAnswer.setSequenceId(questionOption.getSequenceId()); + optionAnswer.setQuestionOptionUid(questionOption.getUid()); optionAnswer.setAnswerBoolean(questionOption.getAnswerBoolean()); optionAnswer.setAnswerInt(questionOption.getAnswerInt()); optionAnswers.add(optionAnswer); @@ -479,7 +477,7 @@ } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { float maxMarkForCorrectAnswer = maxMark / question.getQuestionOptions().size(); for (AssessmentQuestionOption option : question.getQuestionOptions()) { - if (option.getAnswerInt() == option.getSequenceId()) { + if (option.getAnswerInt() == option.getUid()) { mark += maxMarkForCorrectAnswer; } } @@ -488,9 +486,9 @@ String optionString = option.getOptionString().replaceAll("\\*", ".*"); Pattern pattern; if (question.isCaseSensitive()) { - pattern = Pattern.compile(optionString, java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE); - } else { pattern = Pattern.compile(optionString); + } else { + pattern = Pattern.compile(optionString, java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE); } boolean isAnswerCorrect = (question.getAnswerString() != null) ? pattern.matcher(question.getAnswerString()).matches() : false; @@ -552,6 +550,10 @@ public int getAssessmentResultCount(Long assessmentUid, Long userId) { return assessmentResultDao.getAssessmentResultCount(assessmentUid, userId); } + + public List getAssessmentQuestionResultList(Long assessmentUid, Long userId, Long questionUid) { + return assessmentQuestionResultDao.getAssessmentQuestionResultList(assessmentUid, userId, questionUid); + } public String finishToolSession(Long toolSessionId, Long userId) throws AssessmentApplicationException { AssessmentUser user = assessmentUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); @@ -627,36 +629,6 @@ } - public Map> getReflectList(Long contentId, boolean setEntry) { - Map> map = new HashMap>(); - - List sessionList = assessmentSessionDao.getByContentId(contentId); - for (AssessmentSession session : sessionList) { - Long sessionId = session.getSessionId(); - boolean hasRefection = session.getAssessment().isReflectOnActivity(); - Set list = new TreeSet(new ReflectDTOComparator()); - // get all users in this session - List users = assessmentUserDao.getBySessionID(sessionId); - for (AssessmentUser user : users) { - ReflectDTO ref = new ReflectDTO(user); - - if (setEntry) { - NotebookEntry entry = getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, user.getUserId().intValue()); - if (entry != null) { - ref.setReflect(entry.getEntry()); - } - } - - ref.setHasRefection(hasRefection); - list.add(ref); - } - map.put(sessionId, list); - } - - return map; - } - // public List getUserListBySessionQuestion(Long sessionId, Long questionUid) { // List logList = assessmentQuestionResultDao.getAssessmentQuestionResultBySession( // sessionId, questionUid); @@ -689,28 +661,6 @@ } } - public Long createNotebookEntry(Long sessionId, Integer notebookToolType, String toolSignature, Integer userId, - String entryText) { - return coreNotebookService.createNotebookEntry(sessionId, notebookToolType, toolSignature, userId, "", - entryText); - } - - public NotebookEntry getEntry(Long sessionId, Integer idType, String signature, Integer userID) { - List list = coreNotebookService.getEntry(sessionId, idType, signature, userID); - if (list == null || list.isEmpty()) { - return null; - } else { - return list.get(0); - } - } - - /** - * @param notebookEntry - */ - public void updateEntry(NotebookEntry notebookEntry) { - coreNotebookService.updateEntry(notebookEntry); - } - public AssessmentUser getUser(Long uid) { return (AssessmentUser) assessmentUserDao.getObject(AssessmentUser.class, uid); } @@ -1062,9 +1012,6 @@ throw new DataMissingException("Unable to set reflective data titled " + title + " on activity toolContentId " + toolContentId + " as the tool content does not exist."); } - - toolContentObj.setReflectOnActivity(Boolean.TRUE); - toolContentObj.setReflectInstructions(description); } /* =================================================================================== */ Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r98ccad973dd8280fbae78c301f824877b2564c44 -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 98ccad973dd8280fbae78c301f824877b2564c44) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -28,7 +28,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.events.IEventNotificationService; @@ -181,6 +180,8 @@ AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId); int getAssessmentResultCount(Long assessmentUid, Long userId); + + List getAssessmentQuestionResultList(Long assessmentUid, Long userId, Long questionUid); /** * If success return next activity's url, otherwise return null. @@ -226,42 +227,6 @@ public List> exportByContentId(Long contentId); /** - * Create refection entry into notebook tool. - * - * @param sessionId - * @param notebook_tool - * @param tool_signature - * @param userId - * @param entryText - */ - public Long createNotebookEntry(Long sessionId, Integer notebookToolType, String toolSignature, Integer userId, - String entryText); - - /** - * Get reflection entry from notebook tool. - * - * @param sessionId - * @param idType - * @param signature - * @param userID - * @return - */ - public NotebookEntry getEntry(Long sessionId, Integer idType, String signature, Integer userID); - - /** - * @param notebookEntry - */ - public void updateEntry(NotebookEntry notebookEntry); - - /** - * Get Reflect DTO list grouped by sessionID. - * - * @param contentId - * @return - */ - Map> getReflectList(Long contentId, boolean setEntry); - - /** * Get user by UID * * @param uid Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -25,17 +25,11 @@ package org.lamsfoundation.lams.tool.assessment.web.action; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -48,12 +42,9 @@ import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.apache.struts.action.Action; -import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.apache.struts.action.ActionMessage; -import org.apache.struts.action.ActionMessages; import org.lamsfoundation.lams.events.DeliveryMethodMail; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; @@ -70,7 +61,6 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.service.AssessmentApplicationException; import org.lamsfoundation.lams.tool.assessment.service.IAssessmentService; -import org.lamsfoundation.lams.tool.assessment.util.AssessmentQuestionResultComparator; import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; import org.lamsfoundation.lams.tool.assessment.web.form.ReflectionForm; import org.lamsfoundation.lams.usermanagement.User; @@ -95,7 +85,6 @@ HttpServletResponse response) throws IOException, ServletException { String param = mapping.getParameter(); - // -----------------------Assessment Learner function --------------------------- if (param.equals("start")) { return start(mapping, form, request, response); } @@ -121,14 +110,6 @@ return downOption(mapping, form, request, response); } - // ================ Reflection ======================= - if (param.equals("newReflection")) { - return newReflection(mapping, form, request, response); - } - if (param.equals("submitReflection")) { - return submitReflection(mapping, form, request, response); - } - return mapping.findForward(AssessmentConstants.ERROR); } @@ -183,16 +164,6 @@ boolean finishedLock = ((assessmentUser != null) && assessmentUser.isSessionFinished()) || ((attemptsAllowed <= dbResultCount) && (attemptsAllowed != 0)); - // get notebook entry - String entryText = new String(); - if (assessmentUser != null) { - NotebookEntry notebookEntry = service.getEntry(toolSessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, assessmentUser.getUserId().intValue()); - if (notebookEntry != null) { - entryText = notebookEntry.getEntry(); - } - } - // basic information sessionMap.put(AssessmentConstants.ATTR_TITLE, assessment.getTitle()); sessionMap.put(AssessmentConstants.ATTR_INSTRUCTIONS, assessment.getInstructions()); @@ -205,10 +176,6 @@ sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); sessionMap.put(AssessmentConstants.ATTR_USER, assessmentUser); sessionMap.put(AttributeNames.ATTR_MODE, mode); - // reflection information - sessionMap.put(AssessmentConstants.ATTR_REFLECTION_ON, assessment.isReflectOnActivity()); - sessionMap.put(AssessmentConstants.ATTR_REFLECTION_INSTRUCTION, assessment.getReflectInstructions()); - sessionMap.put(AssessmentConstants.ATTR_REFLECTION_ENTRY, entryText); // add define later support if (assessment.isDefineLater()) { @@ -263,11 +230,10 @@ } } - // TODO it moght need to be changed //setAttemptStarted -// if (! finishedLock) { + if (! finishedLock) { service.setAttemptStarted(assessment, assessmentUser, toolSessionId); -// } + } //paging ArrayList> pagedQuestions = new ArrayList>(); @@ -318,7 +284,9 @@ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); boolean finishedLock = (Boolean) sessionMap.get(AssessmentConstants.ATTR_FINISHED_LOCK); if (! finishedLock) { - preserveUserAnswers(request); + preserveUserAnswers(request); + request.setAttribute(AssessmentConstants.PARAM_SECONDS_LEFT, + request.getParameter(AssessmentConstants.PARAM_SECONDS_LEFT)); } int pageNumber = WebUtil.readIntParam(request, AssessmentConstants.ATTR_PAGE_NUMBER); @@ -387,7 +355,7 @@ LearningAction.log.error("Failed finishing tool session:" + e.getMessage()); } - sessionMap.put(AssessmentConstants.ATTR_IS_RESUBMIT_ALLOWED, isResubmitAllowed(sessionMap)); + sessionMap.put(AssessmentConstants.ATTR_IS_RESUBMIT_ALLOWED, false); sessionMap.put(AssessmentConstants.ATTR_FINISHED_LOCK, true); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMapID); return mapping.findForward(AssessmentConstants.SUCCESS); @@ -525,80 +493,6 @@ return mapping.findForward(AssessmentConstants.SUCCESS); } - /** - * Display empty reflection form. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - private ActionForward newReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { - // get session value - String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); - - ReflectionForm refForm = (ReflectionForm) form; - HttpSession ss = SessionManager.getSession(); - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - - refForm.setUserID(user.getUserID()); - refForm.setSessionMapID(sessionMapID); - - // get the existing reflection entry - IAssessmentService submitFilesService = getAssessmentService(); - - SessionMap map = (SessionMap) request.getSession().getAttribute(sessionMapID); - Long toolSessionID = (Long) map.get(AttributeNames.PARAM_TOOL_SESSION_ID); - NotebookEntry entry = submitFilesService.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, user.getUserID()); - - if (entry != null) { - refForm.setEntryText(entry.getEntry()); - } - - return mapping.findForward(AssessmentConstants.SUCCESS); - } - - /** - * Submit reflection form input database. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - private ActionForward submitReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { - ReflectionForm refForm = (ReflectionForm) form; - Integer userId = refForm.getUserID(); - - String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - - IAssessmentService service = getAssessmentService(); - - // check for existing notebook entry - NotebookEntry entry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, userId); - - if (entry == null) { - // create new entry - service.createNotebookEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, userId, refForm.getEntryText()); - } else { - // update existing entry - entry.setEntry(refForm.getEntryText()); - entry.setLastModified(new Date()); - service.updateEntry(entry); - } - - return finish(mapping, form, request, response); - } - // ************************************************************************************* // Private method // ************************************************************************************* @@ -659,6 +553,10 @@ String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); question.setAnswerString(answerString); } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) { + int j = 0; + for (AssessmentQuestionOption option : question.getQuestionOptions()) { + option.setAnswerInt(j++); + } } } } @@ -671,22 +569,26 @@ IAssessmentService service = getAssessmentService(); AssessmentResult result = service.getLastAssessmentResult(assessment.getUid(), userId); - for(LinkedHashSet questionsForOnePage : pagedQuestions) { + for (LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { question.setMark(questionResult.getMark()); question.setPenalty(questionResult.getPenalty()); - + question.setQuestionFeedback(null); for (AssessmentQuestionOption questionOption : question.getQuestionOptions()) { if (questionOption.getUid().equals(questionResult.getSubmittedOptionUid())) { question.setQuestionFeedback(questionOption.getFeedback()); break; } } + + List questionResults = service.getAssessmentQuestionResultList( + assessment.getUid(), userId, question.getUid()); + question.setQuestionResults(questionResults); } - } + } } } @@ -728,7 +630,7 @@ for (AssessmentQuestionOption questionOption : question.getQuestionOptions()) { for (AssessmentOptionAnswer optionAnswer : questionResult.getOptionAnswers()) { - if (questionOption.getSequenceId() == optionAnswer.getSequenceId()) { + if (questionOption.getUid().equals(optionAnswer.getQuestionOptionUid())) { questionOption.setAnswerBoolean(optionAnswer.getAnswerBoolean()); questionOption.setAnswerInt(optionAnswer.getAnswerInt()); break; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -154,14 +154,11 @@ Assessment assessment = service.getAssessmentByContentId(contentId); assessment.toDTO(); - Map> relectList = service.getReflectList(contentId, false); - // cache into sessionMap sessionMap.put(AssessmentConstants.ATTR_SUMMARY_LIST, groupList); sessionMap.put(AssessmentConstants.PAGE_EDITABLE, assessment.isContentInUse()); sessionMap.put(AssessmentConstants.ATTR_ASSESSMENT, assessment); sessionMap.put(AssessmentConstants.ATTR_TOOL_CONTENT_ID, contentId); - sessionMap.put(AssessmentConstants.ATTR_REFLECT_LIST, relectList); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -187,22 +184,20 @@ IAssessmentService service = getAssessmentService(); AssessmentUser user = service.getUser(uid); - NotebookEntry notebookEntry = service.getEntry(sessionID, CoreNotebookConstants.NOTEBOOK_TOOL, - AssessmentConstants.TOOL_SIGNATURE, user.getUserId().intValue()); AssessmentSession session = service.getAssessmentSessionBySessionId(sessionID); - ReflectDTO refDTO = new ReflectDTO(user); - if (notebookEntry == null) { - refDTO.setFinishReflection(false); - refDTO.setReflect(null); - } else { - refDTO.setFinishReflection(true); - refDTO.setReflect(notebookEntry.getEntry()); - } - refDTO.setReflectInstrctions(session.getAssessment().getReflectInstructions()); +// ReflectDTO refDTO = new ReflectDTO(user); +// if (notebookEntry == null) { +// refDTO.setFinishReflection(false); +// refDTO.setReflect(null); +// } else { +// refDTO.setFinishReflection(true); +// refDTO.setReflect(notebookEntry.getEntry()); +// } +// refDTO.setReflectInstrctions(session.getAssessment().getReflectInstructions()); - request.setAttribute("userDTO", refDTO); +// request.setAttribute("userDTO", refDTO); return mapping.findForward("success"); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/form/AssessmentForm.java =================================================================== diff -u -rc56857991e269aa7f5bd250a05b52c767a9957ad -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/form/AssessmentForm.java (.../AssessmentForm.java) (revision c56857991e269aa7f5bd250a05b52c767a9957ad) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/form/AssessmentForm.java (.../AssessmentForm.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -80,7 +80,6 @@ assessment.setDefineLater(false); assessment.setShuffled(false); assessment.setRunOffline(false); - assessment.setReflectOnActivity(false); } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java =================================================================== diff -u -ra3e987093464232bfb4536f3335acc9851291b95 -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision a3e987093464232bfb4536f3335acc9851291b95) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java (.../ExportServlet.java) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -165,22 +165,6 @@ if (group.size() > 0) groupList.add(group); - // Add flag to indicate whether to render user notebook entries - sessionMap.put(AssessmentConstants.ATTR_REFLECTION_ON, content.isReflectOnActivity()); - - // Create reflectList if reflection is enabled. - if (content.isReflectOnActivity()) { - // Create reflectList, need to follow same structure used in teacher - // see service.getReflectList(); - Map> map = new HashMap>(); - Set reflectDTOSet = new TreeSet(new ReflectDTOComparator()); - reflectDTOSet.add(getReflectionEntry(learner)); - map.put(toolSessionID, reflectDTOSet); - - // Add reflectList to sessionMap - sessionMap.put(AssessmentConstants.ATTR_REFLECT_LIST, map); - } - sessionMap.put(AssessmentConstants.ATTR_TITLE, content.getTitle()); sessionMap.put(AssessmentConstants.ATTR_INSTRUCTIONS, content.getInstructions()); sessionMap.put(AssessmentConstants.ATTR_SUMMARY_LIST, groupList); @@ -210,16 +194,6 @@ } } - // Add flag to indicate whether to render user notebook entries - sessionMap.put(AssessmentConstants.ATTR_REFLECTION_ON, content.isReflectOnActivity()); - - // Create reflectList if reflection is enabled. - if (content.isReflectOnActivity()) { - Map> reflectList = service.getReflectList(content.getContentId(), true); - // Add reflectList to sessionMap - sessionMap.put(AssessmentConstants.ATTR_REFLECT_LIST, reflectList); - } - // put it into HTTPSession sessionMap.put(AssessmentConstants.ATTR_TITLE, content.getTitle()); sessionMap.put(AssessmentConstants.ATTR_INSTRUCTIONS, content.getInstructions()); @@ -265,18 +239,4 @@ } return handler; } - - private ReflectDTO getReflectionEntry(AssessmentUser assessmentUser) { - ReflectDTO reflectDTO = new ReflectDTO(assessmentUser); - NotebookEntry notebookEntry = service.getEntry(assessmentUser.getSession().getSessionId(), - CoreNotebookConstants.NOTEBOOK_TOOL, AssessmentConstants.TOOL_SIGNATURE, assessmentUser.getUserId() - .intValue()); - - // check notebookEntry is not null - if (notebookEntry != null) { - reflectDTO.setReflect(notebookEntry.getEntry()); - logger.debug("Could not find notebookEntry for AssessmentUser: " + assessmentUser.getUid()); - } - return reflectDTO; - } } Index: lams_tool_assessment/web/includes/css/jquery.countdown.css =================================================================== diff -u --- lams_tool_assessment/web/includes/css/jquery.countdown.css (revision 0) +++ lams_tool_assessment/web/includes/css/jquery.countdown.css (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -0,0 +1,47 @@ +/* jQuery Countdown styles */ +.hasCountdown { + border: 1px solid #ccc; + background-color: #eee; +} +.countdown_rtl { + direction: rtl; +} +.countdown_holding div { + background-color: #ccc; +} +.countdown_row { + clear: both; + width: 100%; + text-align: center; +} +.countdown_show1 div { + width: 100%; +} +.countdown_show2 div { + width: 50%; +} +.countdown_show3 div { + width: 33%; +} +.countdown_show4 div { + width: 25%; +} +.countdown_show5 div { + width: 20%; +} +.countdown_show6 div { + width: 16%; +} +.countdown_show7 div { + width: 14%; +} +.countdown_section { + float: left; + font-size: 75% +} +.countdown_amount { + font-size: 200%; +} +.countdown_descr { + width: 100%; +} Index: lams_tool_assessment/web/includes/javascript/jquery.blockUI.js =================================================================== diff -u --- lams_tool_assessment/web/includes/javascript/jquery.blockUI.js (revision 0) +++ lams_tool_assessment/web/includes/javascript/jquery.blockUI.js (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -0,0 +1,398 @@ +/* + * jQuery blockUI plugin + * Version 2.15 (1-MAR-2009) + * @requires jQuery v1.2.3 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2008 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ + +;(function($) { + +if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) { + alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery); + return; +} + +$.fn._fadeIn = $.fn.fadeIn; + +// global $ methods for blocking/unblocking the entire page +$.blockUI = function(opts) { install(window, opts); }; +$.unblockUI = function(opts) { remove(window, opts); }; + +// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) +$.growlUI = function(title, message, timeout) { + var $m = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + if (timeout == undefined) timeout = 3000; + $.blockUI({ + message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, + timeout: timeout, showOverlay: false, + css: $.blockUI.defaults.growlCSS + }); +}; + +// plugin method for blocking element content +$.fn.block = function(opts) { + return this.each(function() { + if ($.css(this,'position') == 'static') + this.style.position = 'relative'; + if ($.browser.msie) + this.style.zoom = 1; // force 'hasLayout' + install(this, opts); + }); +}; + +// plugin method for unblocking element content +$.fn.unblock = function(opts) { + return this.each(function() { + remove(this, opts); + }); +}; + +$.blockUI.version = 2.14; // 2nd generation blocking at no extra cost! + +// override these in your code to change the default behavior and style +$.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '

Please wait...

', + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '3px solid #aaa', + backgroundColor:'#fff', + cursor: 'wait' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: '0.6' + }, + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: '0.6', + cursor: null, + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius': '10px', + '-moz-border-radius': '10px' + }, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // be default blockUI will supress tab navigation from leaving blocking content; + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + applyPlatformOpacityRules: true, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4 +}; + +// private data and functions follow... + +var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent); +var pageBlock = null; +var pageBlockEls = []; + +function install(el, opts) { + var full = (el == window); + var msg = opts && opts.message !== undefined ? opts.message : undefined; + opts = $.extend({}, $.blockUI.defaults, opts || {}); + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + var css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to supress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor + // layer3 is the message content that is displayed while blocking + + var lyr1 = ($.browser.msie) ? $('') + : $(''); + var lyr2 = $(''); + var lyr3 = full ? $('') + : $(''); + + // if we have a message, style it + if (msg) + lyr3.css(css); + + // style the overlay + if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform))) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if ($.browser.msie) + lyr1.css('opacity','0.0'); + + $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr && lyr3[0].style.setExpression) { + // give body 100% height + if (full && opts.allowBodyStretch && $.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each([lyr1,lyr2,lyr3], function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"') + : s.setExpression('height','this.parentNode.offsetHeight + "px"'); + full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') + : s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ($.browser.msie && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn); + if (msg) + lyr3.fadeIn(opts.fadeIn); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(':input:enabled:visible',pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + full ? $.unblockUI(opts) : $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } +}; + +// remove the block +function remove(el, opts) { + var full = el == window; + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el); + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + els.fadeOut(opts.fadeOut); + setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut); + } + else + reset(els, data, opts, el); +}; + +// move blocking element back into the DOM where it started +function reset(els,data,opts,el) { + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + if (data.parent) + data.parent.appendChild(data.el); + $(data.el).removeData('blockUI.history'); + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); +}; + +// bind/unbind the handler +function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + if (!full) + $el.data('blockUI.isBlocked', b); + + if (b && !opts.showOverlay) // don't prevent events when overlay not in use + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress'; + b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler); + +// former impl... +// var $e = $('a,:input'); +// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); +}; + +// event handler to suppress keyboard/mouse events when blocking +function handler(e) { + // allow tab navigation (conditionally) + if (e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target == els[els.length-1]; + var back = e.shiftKey && e.target == els[0]; + if (fwd || back) { + setTimeout(function(){focus(back)},10); + return false; + } + } + } + // allow events within the message content + if ($(e.target).parents('div.blockMsg').length > 0) + return true; + + // allow events for content that is not being blocked + return $(e.target).parents().children().filter('div.blockUI').length == 0; +}; + +function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); +}; + +function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; +}; + +function sz(el, p) { + return parseInt($.css(el,p))||0; +}; + +})(jQuery); Index: lams_tool_assessment/web/includes/javascript/jquery.countdown.js =================================================================== diff -u --- lams_tool_assessment/web/includes/javascript/jquery.countdown.js (revision 0) +++ lams_tool_assessment/web/includes/javascript/jquery.countdown.js (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -0,0 +1,505 @@ +/* http://keith-wood.name/countdown.html + Countdown for jQuery v1.4.3. + Written by Keith Wood (kbwood@virginbroadband.com.au) January 2008. + Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and + MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. + Please attribute the author if you use it. */ + +/* Display a countdown timer. + Attach it with options like: + $('div selector').countdown( + {until: new Date(2009, 1 - 1, 1, 0, 0, 0), onExpiry: happyNewYear}); */ + +(function($) { // Hide scope, no $ conflict + +/* Countdown manager. */ +function Countdown() { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + // The display texts for the counters + labels: ['Years', 'Months', 'Weeks', 'Days', 'Hours', 'Minutes', 'Seconds'], + // The display texts for the counters if only one + labels1: ['Year', 'Month', 'Week', 'Day', 'Hour', 'Minute', 'Second'], + compactLabels: ['y', 'm', 'w', 'd'], // The compact texts for the counters + timeSeparator: ':', // Separator for time periods + isRTL: false // True for right-to-left languages, false for left-to-right + }; + this._defaults = { + format: 'dHMS', // Format for display - upper case for always, lower case only if non-zero, + // 'Y' years, 'O' months, 'W' weeks, 'D' days, 'H' hours, 'M' minutes, 'S' seconds + layout: '', // Build your own layout for the countdown + compact: false, // True to display in a compact format, false for an expanded one + description: '', // The description displayed for the countdown + expiryUrl: null, // A URL to load upon expiry, replacing the current page + alwaysExpire: false, // True to trigger onExpiry even if never counted down + onExpiry: null, // Callback when the countdown expires - + // receives no parameters and 'this' is the containing division + onTick: null, // Callback when the countdown is updated - + // receives int[7] being the breakdown by period (based on format) + // and 'this' is the containing division + serverTime: null // The current time on the server, to calculate an offset for other time zones + }; + $.extend(this._defaults, this.regional['']); +} + +var PROP_NAME = 'countdown'; + +var Y = 0; // Years +var O = 1; // Months +var W = 2; // Weeks +var D = 3; // Days +var H = 4; // Hours +var M = 5; // Minutes +var S = 6; // Seconds + +$.extend(Countdown.prototype, { + /* Class name added to elements to indicate already configured with countdown. */ + markerClassName: 'hasCountdown', + + /* Override the default settings for all instances of the countdown widget. + @param options (object) the new settings to use as defaults */ + setDefaults: function(options) { + this._resetExtraLabels(this._defaults, options); + extendRemove(this._defaults, options || {}); + }, + + /* Attach the countdown widget to a div. + @param target (element) the containing division + @param options (object) the initial settings for the countdown */ + _attachCountdown: function(target, options) { + target = $(target); + if (target.hasClass(this.markerClassName)) { + return; + } + target.addClass(this.markerClassName); + var inst = {}; + inst.options = $.extend({}, options); + inst._periods = [0, 0, 0, 0, 0, 0, 0]; + this._adjustSettings(inst); + $.data(target[0], PROP_NAME, inst); + this._updateCountdown(target, inst); + }, + + /* Redisplay the countdown with an updated display. + @param target (jQuery) the containing division + @param inst (object) the current settings for this instance */ + _updateCountdown: function(target, inst) { + var target = $(target); + inst = inst || $.data(target[0], PROP_NAME); + if (!inst) { + return; + } + target.html(this._generateHTML(inst)); + target[(this._get(inst, 'isRTL') ? 'add' : 'remove') + 'Class']('countdown_rtl'); + var onTick = this._get(inst, 'onTick'); + if (onTick) { + onTick.apply(target[0], [inst._hold != 'lap' ? inst._periods : + this._calculatePeriods(inst, inst._show, new Date())]); + } + var expired = inst._hold != 'pause' && + (inst._since ? inst._now.getTime() <= inst._since.getTime() : + inst._now.getTime() >= inst._until.getTime()); + if (expired) { + if (inst._timer || this._get(inst, 'alwaysExpire')) { + var onExpiry = this._get(inst, 'onExpiry'); + if (onExpiry) { + onExpiry.apply(target[0], []); + } + var expiryUrl = this._get(inst, 'expiryUrl'); + if (expiryUrl) { + window.location = expiryUrl; + } + } + inst._timer = null; + } + else if (inst._hold == 'pause') { + inst._timer = null; + } + else { + var format = this._get(inst, 'format'); + inst._timer = setTimeout(function() { $.countdown._updateCountdown(target); }, + (format.match('s|S') ? 1 : (format.match('m|M') ? 30 : 600)) * 980); // just under the full time + } + $.data(target[0], PROP_NAME, inst); + }, + + /* Reconfigure the settings for a countdown div. + @param target (element) the containing division + @param options (object) the new settings for the countdown */ + _changeCountdown: function(target, options) { + var inst = $.data(target, PROP_NAME); + if (inst) { + this._resetExtraLabels(inst.options, options); + extendRemove(inst.options, options || {}); + this._adjustSettings(inst); + $.data(target, PROP_NAME, inst); + this._updateCountdown(target, inst); + } + }, + + /* Reset any extra labelsn and compactLabelsn entries if changing labels. + @param base (object) the options to be updated + @param options (object) the new option values */ + _resetExtraLabels: function(base, options) { + var changingLabels = false; + for (var n in options) { + if (n.match(/[Ll]abels/)) { + changingLabels = true; + break; + } + } + if (changingLabels) { + for (var n in base) { // Remove custom numbered labels + if (n.match(/[Ll]abels[0-9]/)) { + base[n] = null; + } + } + } + }, + + /* Remove the countdown widget from a div. + @param target (element) the containing division */ + _destroyCountdown: function(target) { + target = $(target); + if (!target.hasClass(this.markerClassName)) { + return; + } + target.removeClass(this.markerClassName).empty(); + var inst = $.data(target[0], PROP_NAME); + if (inst._timer) { + clearTimeout(inst._timer); + } + $.removeData(target[0], PROP_NAME); + }, + + /* Pause a countdown widget at the current time. + Stop it running but remember and display the current time. + @param target (element) the containing division */ + _pauseCountdown: function(target) { + this._hold(target, 'pause'); + }, + + /* Pause a countdown widget at the current time. + Stop the display but keep the countdown running. + @param target (element) the containing division */ + _lapCountdown: function(target) { + this._hold(target, 'lap'); + }, + + /* Resume a paused countdown widget. + @param target (element) the containing division */ + _resumeCountdown: function(target) { + this._hold(target, null); + }, + + /* Pause or resume a countdown widget. + @param target (element) the containing division + @param hold (string) the new hold setting */ + _hold: function(target, hold) { + var inst = $.data(target, PROP_NAME); + if (inst) { + if (inst._hold == 'pause' && !hold) { + inst._periods = inst._savePeriods; + var sign = (inst._since ? '-' : '+'); + inst[inst._since ? '_since' : '_until'] = + this._determineTime(sign + inst._periods[0] + 'Y' + + sign + inst._periods[1] + 'O' + sign + inst._periods[2] + 'W' + + sign + inst._periods[3] + 'D' + sign + inst._periods[4] + 'H' + + sign + inst._periods[5] + 'M' + sign + inst._periods[6] + 'S'); + } + inst._hold = hold; + inst._savePeriods = (hold == 'pause' ? inst._periods : null); + $.data(target, PROP_NAME, inst); + this._updateCountdown(target, inst); + } + }, + + /* Return the current time periods. + @param target (element) the containing division + @return (number[7]) the current periods for the countdown */ + _getTimesCountdown: function(target) { + var inst = $.data(target, PROP_NAME); + return (!inst ? null : (!inst._hold ? inst._periods : + this._calculatePeriods(inst, inst._show, new Date()))); + }, + + /* Get a setting value, defaulting if necessary. + @param inst (object) the current settings for this instance + @param name (string) the name of the required setting + @return (any) the setting's value or a default if not overridden */ + _get: function(inst, name) { + return (inst.options[name] != null ? + inst.options[name] : $.countdown._defaults[name]); + }, + + /* Calculate interal settings for an instance. + @param inst (object) the current settings for this instance */ + _adjustSettings: function(inst) { + var now = new Date(); + var serverTime = this._get(inst, 'serverTime'); + inst._offset = (serverTime ? serverTime.getTime() - now.getTime() : 0); + inst._since = this._get(inst, 'since'); + if (inst._since) { + inst._since = this._determineTime(inst._since, null); + } + inst._until = this._determineTime(this._get(inst, 'until'), now); + inst._show = this._determineShow(inst); + }, + + /* A time may be specified as an exact value or a relative one. + @param setting (string or number or Date) - the date/time value + as a relative or absolute value + @param defaultTime (Date) the date/time to use if no other is supplied + @return (Date) the corresponding date/time */ + _determineTime: function(setting, defaultTime) { + var offsetNumeric = function(offset) { // e.g. +300, -2 + var time = new Date(); + time.setTime(time.getTime() + offset * 1000); + return time; + }; + var getDaysInMonth = function(year, month) { + return 32 - new Date(year, month, 32).getDate(); + }; + var offsetString = function(offset) { // e.g. '+2d', '-4w', '+3h +30m' + var time = new Date(); + var year = time.getFullYear(); + var month = time.getMonth(); + var day = time.getDate(); + var hour = time.getHours(); + var minute = time.getMinutes(); + var second = time.getSeconds(); + var pattern = /([+-]?[0-9]+)\s*(s|S|m|M|h|H|d|D|w|W|o|O|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 's') { + case 's' : case 'S' : + second += parseInt(matches[1], 10); break; + case 'm' : case 'M' : + minute += parseInt(matches[1], 10); break; + case 'h' : case 'H' : + hour += parseInt(matches[1], 10); break; + case 'd' : case 'D' : + day += parseInt(matches[1], 10); break; + case 'w' : case 'W' : + day += parseInt(matches[1], 10) * 7; break; + case 'o' : case 'O' : + month += parseInt(matches[1], 10); + day = Math.min(day, getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1], 10); + day = Math.min(day, getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + time = new Date(year, month, day, hour, minute, second, 0); + return time; + }; + var time = (setting == null ? defaultTime : + (typeof setting == 'string' ? offsetString(setting) : + (typeof setting == 'number' ? offsetNumeric(setting) : setting))); + if (time) time.setMilliseconds(0); + return time; + }, + + /* Generate the HTML to display the countdown widget. + @param inst (object) the current settings for this instance + @return (string) the new HTML for the countdown display */ + _generateHTML: function(inst) { + // Determine what to show + inst._periods = periods = (inst._hold ? inst._periods : + this._calculatePeriods(inst, inst._show, new Date())); + // Show all 'asNeeded' after first non-zero value + var shownNonZero = false; + var showCount = 0; + for (var period = 0; period < inst._show.length; period++) { + shownNonZero |= (inst._show[period] == '?' && periods[period] > 0); + inst._show[period] = (inst._show[period] == '?' && !shownNonZero ? null : inst._show[period]); + showCount += (inst._show[period] ? 1 : 0); + } + var compact = this._get(inst, 'compact'); + var layout = this._get(inst, 'layout'); + var labels = (compact ? this._get(inst, 'compactLabels') : this._get(inst, 'labels')); + var timeSeparator = this._get(inst, 'timeSeparator'); + var description = this._get(inst, 'description') || ''; + var twoDigits = function(value) { + return (value < 10 ? '0' : '') + value; + }; + var showCompact = function(period) { + var labelsNum = $.countdown._get(inst, 'compactLabels' + periods[period]); + return (inst._show[period] ? periods[period] + + (labelsNum ? labelsNum[period] : labels[period]) + ' ' : ''); + }; + var showFull = function(period) { + var labelsNum = $.countdown._get(inst, 'labels' + periods[period]); + return (inst._show[period] ? + '
' + + periods[period] + '
' + + (labelsNum ? labelsNum[period] : labels[period]) + '
' : ''); + }; + return (layout ? this._buildLayout(inst, layout, compact) : + ((compact ? // Compact version + '
' + + showCompact(Y) + showCompact(O) + showCompact(W) + showCompact(D) + + (inst._show[H] ? twoDigits(periods[H]) : '') + + (inst._show[M] ? (inst._show[H] ? timeSeparator : '') + twoDigits(periods[M]) : '') + + (inst._show[S] ? (inst._show[H] || inst._show[M] ? timeSeparator : '') + + twoDigits(periods[S]) : '') : + // Full version + '
' + + showFull(Y) + showFull(O) + showFull(W) + showFull(D) + + showFull(H) + showFull(M) + showFull(S)) + '
' + + (description ? '
' + description + '
' : ''))); + }, + + /* Construct a custom layout. + @param inst (object) the current settings for this instance + @param layout (string) the customised layout + @param compact (boolean) true if using compact labels + @return (string) the custom HTML */ + _buildLayout: function(inst, layout, compact) { + var labels = (compact ? this._get(inst, 'compactLabels') : this._get(inst, 'labels')); + var html = layout; + var processPeriod = function(period, index) { + var pattern1 = new RegExp('%' + period + '.*%' + period); + var pattern2 = new RegExp('%' + period + '.*'); + while (true) { + var matches = pattern1.exec(html); + if (!matches) { + break; + } + matches[0] = matches[0].substr(0, 2) + + matches[0].substr(2).replace(pattern2, '%' + period); + html = html.replace(matches[0], inst._show[index] ? + customisePeriod(matches[0], period, index) : ''); + } + }; + var customisePeriod = function(text, period, index) { + var labelsNum = $.countdown._get(inst, + (compact ? 'compactLabels' : 'labels') + inst._periods[index]); + return text.substr(2, text.length - 4). + replace(/%nn/g, (inst._periods[index] < 10 ? '0' : '') + + inst._periods[index]). + replace(/%n/g, inst._periods[index]). + replace(/%l/g, (labelsNum ? labelsNum[index] : labels[index])); + }; + processPeriod('Y', Y); + processPeriod('O', O); + processPeriod('W', W); + processPeriod('D', D); + processPeriod('H', H); + processPeriod('M', M); + processPeriod('S', S); + return html; + }, + + /* Translate the format into flags for each period. + @param inst (object) the current settings for this instance + @return (string[7]) flags indicating which periods are requested (?) or + required (!) by year, month, week, day, hour, minute, second */ + _determineShow: function(inst) { + var format = this._get(inst, 'format'); + var show = []; + show[Y] = (format.match('y') ? '?' : (format.match('Y') ? '!' : null)); + show[O] = (format.match('o') ? '?' : (format.match('O') ? '!' : null)); + show[W] = (format.match('w') ? '?' : (format.match('W') ? '!' : null)); + show[D] = (format.match('d') ? '?' : (format.match('D') ? '!' : null)); + show[H] = (format.match('h') ? '?' : (format.match('H') ? '!' : null)); + show[M] = (format.match('m') ? '?' : (format.match('M') ? '!' : null)); + show[S] = (format.match('s') ? '?' : (format.match('S') ? '!' : null)); + return show; + }, + + /* Calculate the requested periods between now and the target time. + @param inst (object) the current settings for this instance + @param show (string[7]) flags indicating which periods are requested/required + @param now (Date) the current date and time + @return (number[7]) the current time periods (always positive) + by year, month, week, day, hour, minute, second */ + _calculatePeriods: function(inst, show, now) { + // Find endpoints + inst._now = now; + inst._now.setMilliseconds(0); + var until = new Date(inst._now.getTime()); + if (inst._since && now.getTime() < inst._since.getTime()) { + inst._now = now = until; + } + else if (inst._since) { + now = inst._since; + } + else { + until.setTime(inst._until.getTime()); + if (now.getTime() > inst._until.getTime()) { + inst._now = now = until; + } + } + until.setTime(until.getTime() - inst._offset); // Adjust for time zone + // Calculate differences by period + var periods = [0, 0, 0, 0, 0, 0, 0]; + if (show[Y] || show[O]) { + var months = Math.max(0, (until.getFullYear() - now.getFullYear()) * 12 + + until.getMonth() - now.getMonth() + (until.getDate() < now.getDate() ? -1 : 0)); + periods[Y] = (show[Y] ? Math.floor(months / 12) : 0); + periods[O] = (show[O] ? months - periods[Y] * 12 : 0); + if (inst._since) { + until.setFullYear(until.getFullYear() - periods[Y]); + until.setMonth(until.getMonth() - periods[O]); + } + else { + now = new Date(now.getTime()); + now.setFullYear(now.getFullYear() + periods[Y]); + now.setMonth(now.getMonth() + periods[O]); + } + } + var diff = Math.floor((until.getTime() - now.getTime()) / 1000); + var extractPeriod = function(period, numSecs) { + periods[period] = (show[period] ? Math.floor(diff / numSecs) : 0); + diff -= periods[period] * numSecs; + }; + extractPeriod(W, 604800); + extractPeriod(D, 86400); + extractPeriod(H, 3600); + extractPeriod(M, 60); + extractPeriod(S, 1); + return periods; + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) { + if (props[name] == null) { + target[name] = null; + } + } + return target; +} + +/* Attach the countdown functionality to a jQuery selection. + @param command (string) the command to run (optional, default 'attach') + @param options (object) the new settings to use for these countdown instances + @return (jQuery) for chaining further calls */ +$.fn.countdown = function(options) { + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (options == 'getTimes') { + return $.countdown['_' + options + 'Countdown']. + apply($.countdown, [this[0]].concat(otherArgs)); + } + return this.each(function() { + if (typeof options == 'string') { + $.countdown['_' + options + 'Countdown'].apply($.countdown, [this].concat(otherArgs)); + } + else { + $.countdown._attachCountdown(this, options); + } + }); +}; + +/* Initialise the countdown functionality. */ +$.countdown = new Countdown(); // singleton instance + +})(jQuery); Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -20,149 +20,154 @@ + + + + + + + + + + + + + -

${assessment.title}

-

- ${assessment.instructions} -

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

+ ${assessment.instructions} +

- - <%@ include file="/common/messages.jsp"%> -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
- - - - -
- - - - - ${result.maximumGrade} (%) -
- - - ${result.overallFeedback} -
-
+ + <%@ include file="/common/messages.jsp"%> +
+ + <%@ include file="parts/attemptsummary.jsp"%> +
-
+ ${status.index + sessionMap.questionNumberingOffset} @@ -195,18 +200,14 @@ <%@ include file="parts/ordering.jsp"%> + + <%@ include file="parts/questionsummary.jsp"%>
- +
@@ -229,7 +230,7 @@
- + Fisheye: Tag 95a8036ef190595474c3bac650ecd8e004434fd2 refers to a dead (removed) revision in file `lams_tool_assessment/web/pages/learning/notebook.jsp'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_assessment/web/pages/learning/parts/attemptsummary.jsp =================================================================== diff -u --- lams_tool_assessment/web/pages/learning/parts/attemptsummary.jsp (revision 0) +++ lams_tool_assessment/web/pages/learning/parts/attemptsummary.jsp (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + +
+ + + + + ${result.maximumGrade} (%) +
+ + + ${result.overallFeedback} +
+

+
\ No newline at end of file Index: lams_tool_assessment/web/pages/learning/parts/markandpenaltyarea.jsp =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/web/pages/learning/parts/markandpenaltyarea.jsp (.../markandpenaltyarea.jsp) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/web/pages/learning/parts/markandpenaltyarea.jsp (.../markandpenaltyarea.jsp) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -7,12 +7,16 @@ -
- +
+ ${question.defaultGrade} - + + + + +
Index: lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp =================================================================== diff -u -r3dab7c956ec906f70368dfeb1fafde8e720a473c -r95a8036ef190595474c3bac650ecd8e004434fd2 --- lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp (.../matchingpairs.jsp) (revision 3dab7c956ec906f70368dfeb1fafde8e720a473c) +++ lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp (.../matchingpairs.jsp) (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -9,10 +9,10 @@ - + - + @@ -24,7 +24,7 @@ - ${selectOption.optionString} + ${selectOption.optionString} Index: lams_tool_assessment/web/pages/learning/parts/questionsummary.jsp =================================================================== diff -u --- lams_tool_assessment/web/pages/learning/parts/questionsummary.jsp (revision 0) +++ lams_tool_assessment/web/pages/learning/parts/questionsummary.jsp (revision 95a8036ef190595474c3bac650ecd8e004434fd2) @@ -0,0 +1,114 @@ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ # + + + + + + +
+ ${status.index + 1} + +
+ ${currentAssessmentResult.finishDate} +
+
+ + + + + + ${questionOption.optionString} + + + + + + + + + + + + +
+ ${questionOption.question} + + - + + + + + ${questionOption2.optionString} + + + + +
+
+ + ${questionResult.answerString} + + + ${questionResult.answerString} + + + + ${questionResult.answerBoolean} + + + + ${questionResult.answerString} + + + + + + + + ${questionOption.optionString} + + + + + + +
+
+
+ +
+
+
\ No newline at end of file