Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rd684e691703ae0a5ba9b404d5e9191697564e90e -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision d684e691703ae0a5ba9b404d5e9191697564e90e) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -99,6 +99,7 @@ label.authoring.advance.grade.boundary =Grade boundary label.authoring.advance.feedback =Feedback label.authoring.advance.add.feedback.field =Add feedback +label.authoring.advance.question.etherpad = Show a discussion Etherpad after each question label.authoring.cancel.button =Cancel label.authoring.basic.answer.options =Answer options label.authoring.basic.instruction =Instructions @@ -378,6 +379,6 @@ label.answer.alternatives =Answer alternatives label.someone.allocated.this.answer =Sorry, someone has allocated this answer already label.monitoring.user.summary.full.name =Full name +label.etherpad.discussion = Discussion - #======= End labels: Exported 372 labels for en AU ===== Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== diff -u -r670dd8e248dc4705c92031c79d05a99559e35024 -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision 670dd8e248dc4705c92031c79d05a99559e35024) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -35,9 +35,9 @@ public static final String EXPORT_QUESTIONS_FILENAME = "questions.xml"; // for parameters' name - + public static final String PARAM_WAITING_MESSAGE_KEY = "waitingMessageKey"; - + public static final String PARAM_TOOL_CONTENT_ID = "toolContentID"; public static final String PARAM_TOOL_SESSION_ID = "toolSessionID"; @@ -47,7 +47,7 @@ public static final String PARAM_FILE_UUID = "fileUuid"; public static final String PARAM_QUESTION_INDEX = "questionIndex"; - + public static final String PARAM_QUESTION_DISPLAY_ORDER = "questionDisplayOrder"; public static final String PARAM_QUESTION_UID = "questionUid"; @@ -59,22 +59,22 @@ public static final String PARAM_NOT_A_NUMBER = "nan"; public static final String PARAM_GRADE = "grade"; - + public static final String PARAM_MAX_MARK = "maxMark"; - + public static final String PARAM_SEQUENCE_ID = "sequenceId"; public static final String PARAM_SESSION_ID = "sessionId"; public static final String PARAM_QUESTION_RESULT_UID = "questionResultUid"; // for request attribute name - + /** * used to signify edit in monitor when assessment has been attempted already */ public static final String ATTR_IS_AUTHORING_RESTRICTED = "isAuthoringRestricted"; - + public static final String ATTR_GROUP_USERS = "groupUsers"; public static final String ATTR_IS_USER_LEADER = "isUserLeader"; @@ -86,13 +86,13 @@ public static final String ATTR_TOOL_SESSION_ID = "toolSessionID"; public static final String ATTR_QUESTION_PREFIX = "question"; - + public static final String ATTR_CONFIDENCE_LEVEL_PREFIX = "confidenceLevel"; public static final String ATTR_QUESTION_LIST = "questionList"; - + public static final String ATTR_RANDOM_POOL_QUESTIONS = "randomPoolQuestions"; - + public static final String ATTR_DELETED_RANDOM_POOL_QUESTIONS = "deletedRandomPoolQuestions"; public static final String ATTR_QUESTION_REFERENCES = "questionReferences"; @@ -102,13 +102,13 @@ public static final String ATTR_UNIT_LIST = "unitList"; public static final String ATTR_REFERENCES_MAX_MARKS = "referenceMaxMarks"; - + public static final String ATTR_REFERENCES_SEQUENCE_IDS = "sequenceIds"; - + public static final String ATTR_HAS_EDIT_RIGHT = "hasEditRight"; - + public static final String ATTR_IS_TIME_LIMIT_NOT_LAUNCHED = "isTimeLimitNotLaunched"; - + public static final String ATTR_SECONDS_LEFT = "secondsLeft"; public static final String ATTR_OVERALL_FEEDBACK_LIST = "overallFeedbackList"; @@ -170,7 +170,7 @@ public static final String ATTR_QUESTION_NUMBERING_OFFSET = "questionNumberingOffset"; public static final String ATTR_SUBMISSION_DEADLINE = "submissionDeadline"; - + public static final String ATTR_SUBMISSION_DEADLINE_DATESTRING = "submissionDateString"; public static final String ATTR_IS_SUBMISSION_DEADLINE_PASSED = "isSubmissionDeadlinePassed"; @@ -202,15 +202,19 @@ public static final String OUTPUT_NAME_ORDERED_ANSWERS = "ordered.answers"; public static final String OUTPUT_NAME_CONDITION_ORDERED_ANSWER = "ordered.answer"; - + public static final String ATTR_USER_UID = "userUid"; public static final String DEFUALT_PROTOCOL_REFIX = "http://"; public static final String ALLOW_PROTOCOL_REFIX = new String("[http://|https://|ftp://|nntp://]"); - public static final String EVENT_NAME_NOTIFY_TEACHERS_ON_ASSIGMENT_SUBMIT = "notify_teachers_on_assigment_submit"; - + public static final String EVENT_NAME_NOTIFY_TEACHERS_ON_ASSIGMENT_SUBMIT = "notify_teachers_on_assigment_submit"; + // configuration keys public static final String CONFIG_KEY_HIDE_TITLES = "hideTitles"; + + public static final String ATTR_IS_QUESTION_ETHERPAD_ENABLED = "isQuestionEtherpadEnabled"; + + public static final String ATTR_ALL_GROUP_USERS = "allGroupUsers"; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rabeade6acdabd37cde6e3710ab30073ce26532e2 -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision abeade6acdabd37cde6e3710ab30073ce26532e2) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -3598,4 +3598,9 @@ public String getConfigValue(String key) { return assessmentConfigDao.getConfigValue(key); } + + @Override + public Collection getAllGroupUsers(Long toolSessionId) { + return toolService.getToolSession(toolSessionId).getLearners(); + } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r3b12480474c839c58c38c6a9616ee6102713f25f -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 3b12480474c839c58c38c6a9616ee6102713f25f) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.assessment.service; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -46,6 +47,7 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; import org.lamsfoundation.lams.tool.service.ICommonToolService; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.excel.ExcelSheet; /** @@ -427,15 +429,16 @@ /** * Allocate learner's answer into one of the available answer groups. - * + * * @param questionUid * @param targetOptionUid * @param previousOptionUid * @param questionResultUid * @return if present, it contains optionUid of the option group containing duplicate (added there presumably by * another teacher working in parallel) */ - Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, Long questionResultUid); + Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, + Long questionResultUid); /** * For export purposes @@ -539,4 +542,6 @@ void setConfigValue(String key, String value); String getConfigValue(String key); + + Collection getAllGroupUsers(Long toolSessionId); } \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -r02ce40b60524aa33d326fbda824dcd43f566ab94 -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 02ce40b60524aa33d326fbda824dcd43f566ab94) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -26,6 +26,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -40,7 +41,7 @@ import java.util.SortedSet; import java.util.TimeZone; import java.util.TreeSet; -import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -50,7 +51,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.notebook.model.NotebookEntry; -import org.lamsfoundation.lams.outcome.Outcome; import org.lamsfoundation.lams.qb.model.QbOption; import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.tool.ToolAccessMode; @@ -71,6 +71,7 @@ import org.lamsfoundation.lams.tool.assessment.util.AssessmentSessionComparator; import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; import org.lamsfoundation.lams.tool.assessment.web.form.ReflectionForm; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.AlphanumComparator; import org.lamsfoundation.lams.util.Configuration; @@ -198,15 +199,15 @@ Set questionReferences = new TreeSet<>(new SequencableComparator()); questionReferences.addAll(assessment.getQuestionReferences()); HashMap questionToReferenceMap = new HashMap<>(); - + //add non-random questions for (QuestionReference questionReference : questionReferences) { if (!questionReference.isRandomQuestion()) { AssessmentQuestion question = questionReference.getQuestion(); questionToReferenceMap.put(questionReference.getUid(), question); } } - + // init random pool questions List availableRandomQuestions = new ArrayList<>(); for (AssessmentQuestion question : assessment.getQuestions()) { @@ -218,7 +219,7 @@ AssessmentResult lastResult = service.getLastAssessmentResult(assessment.getUid(), user.getUserId()); for (QuestionReference questionReference : questionReferences) { if (questionReference.isRandomQuestion()) { - + //find random question that will be shown to the user AssessmentQuestion randomQuestion = null; if (lastResult == null) { @@ -389,6 +390,18 @@ service.setAttemptStarted(assessment, user, toolSessionId, pagedQuestionDtos); } + boolean questionEtherpadEnabled = assessment.isUseSelectLeaderToolOuput() + && StringUtils.isNotBlank(Configuration.get(ConfigurationKeys.ETHERPAD_API_KEY)); + request.setAttribute(AssessmentConstants.ATTR_IS_QUESTION_ETHERPAD_ENABLED, questionEtherpadEnabled); + if (questionEtherpadEnabled) { + // get all users from the group, even if they did not reach the Scratchie yet + // order them by first and last name + Collection allGroupUsers = service.getAllGroupUsers(toolSessionId).stream() + .sorted(Comparator.comparing(u -> u.getFirstName() + u.getLastName())) + .collect(Collectors.toList()); + request.setAttribute(AssessmentConstants.ATTR_ALL_GROUP_USERS, allGroupUsers); + } + return "pages/learning/learning"; } } @@ -609,6 +622,7 @@ /** * User pressed Resubmit button. */ + @SuppressWarnings("unchecked") @RequestMapping("/resubmit") public String resubmit(HttpServletRequest request) throws ServletException { SessionMap sessionMap = getSessionMap(request); @@ -618,7 +632,7 @@ AssessmentUser assessmentUser = (AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER); List> pagedQuestionDtos = (List>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTION_DTOS); - + Long userId = assessmentUser.getUserId(); service.unsetSessionFinished(toolSessionId, userId); @@ -704,23 +718,23 @@ service.launchTimeLimit(assessmentUid, userId); } - + @RequestMapping("/vsaAutocomplete") @ResponseBody public String vsaAutocomplete(HttpServletRequest request, HttpServletResponse response) { String userAnswer = WebUtil.readStrParam(request, "term", true); Long questionUid = WebUtil.readLongParam(request, AssessmentConstants.PARAM_QUESTION_UID); AssessmentQuestion question = service.getAssessmentQuestionByUid(questionUid); QbQuestion qbQuestion = question.getQbQuestion(); - + ArrayNode responseJSON = JsonNodeFactory.instance.arrayNode(); if (StringUtils.isNotBlank(userAnswer)) { userAnswer = userAnswer.trim(); userAnswer = qbQuestion.isCaseSensitive() ? userAnswer : userAnswer.toLowerCase(); - + for (QbOption option : qbQuestion.getQbOptions()) { - //filter out options not starting with 'term' and containing '*' + //filter out options not starting with 'term' and containing '*' String optionTitle = qbQuestion.isCaseSensitive() ? option.getName() : option.getName().toLowerCase(); int i = 0; for (String optionAnswer : optionTitle.split("\\r\\n")) { @@ -991,9 +1005,8 @@ break; } else { - boolean isMinWordsLimitReached = ValidationUtil.isMinWordsLimitReached( - questionDto.getAnswer(), questionDto.getMinWordsLimit(), - questionDto.isAllowRichEditor()); + boolean isMinWordsLimitReached = ValidationUtil.isMinWordsLimitReached(questionDto.getAnswer(), + questionDto.getMinWordsLimit(), questionDto.isAllowRichEditor()); // check min words limit is reached if (!isMinWordsLimitReached) { isAllQuestionsReachedMinWordsLimit = false; @@ -1040,7 +1053,7 @@ questionDto.setMark(questionResult.getMark()); questionDto.setResponseSubmitted(questionResult.getFinishDate() != null); questionDto.setPenalty(questionResult.getPenalty()); - + //question feedback questionDto.setQuestionFeedback(null); for (OptionDTO optionDto : questionDto.getOptionDtos()) { @@ -1104,8 +1117,7 @@ // if answers are going to be disclosed, prepare data for the table in results page if (assessment.isAllowDiscloseAnswers()) { // such entities should not go into session map, but as request attributes instead - SortedSet sessions = new TreeSet<>( - new AssessmentSessionComparator()); + SortedSet sessions = new TreeSet<>(new AssessmentSessionComparator()); sessions.addAll(service.getSessionsByContentId(assessment.getContentId())); request.setAttribute("sessions", sessions); Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r3f64433c4c8241c2ecccac71a380267db16b7ea9 -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 3f64433c4c8241c2ecccac71a380267db16b7ea9) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -32,6 +32,14 @@ .slider.slider-horizontal { margin-left: 40px; } + + .question-etherpad { + padding: 0; + } + + [data-toggle="collapse"].collapsed .if-not-collapsed, [data-toggle="collapse"]:not(.collapsed) .if-collapsed { + display: none; + } Index: lams_tool_assessment/web/pages/learning/parts/allquestions.jsp =================================================================== diff -u -re8a7110708b15579af2c6b31ac52a6da427fef6d -rb9300513239d652c59e3bfd190d0973295844f37 --- lams_tool_assessment/web/pages/learning/parts/allquestions.jsp (.../allquestions.jsp) (revision e8a7110708b15579af2c6b31ac52a6da427fef6d) +++ lams_tool_assessment/web/pages/learning/parts/allquestions.jsp (.../allquestions.jsp) (revision b9300513239d652c59e3bfd190d0973295844f37) @@ -1,4 +1,14 @@ <%@ include file="/common/taglibs.jsp"%> + + + <%-- Prepare same content for each question Etherpad. Each group participant's first and last name --%> + +  :
+
+
+
+
+
@@ -71,5 +81,24 @@ + + <%--Display Etherpad for each question --%> + +
+ + +
+
+ ${questionEtherpadContent} +
+
+
+