Index: lams_central/web/qb/qbQuestionDetails.jsp =================================================================== diff -u -ra109b7b66649bbed86abf584a192c6af194946ef -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_central/web/qb/qbQuestionDetails.jsp (.../qbQuestionDetails.jsp) (revision a109b7b66649bbed86abf584a192c6af194946ef) +++ lams_central/web/qb/qbQuestionDetails.jsp (.../qbQuestionDetails.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -7,6 +7,7 @@
+
Version: ${question.version} @@ -22,54 +23,37 @@ - - - - - +
- - - -
+ + + - + - - - -
+ + + + - class="text-success"> - ${i.index+1}) - - + class="text-success"> + ${i.index+1}) + + - -
- - - -
-
-
- + + +
+ + + +
+
+ + + +
- - - - - -
- - - -
- "> - - - -
+
+ Index: lams_central/web/qb/search.jsp =================================================================== diff -u -ra109b7b66649bbed86abf584a192c6af194946ef -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_central/web/qb/search.jsp (.../search.jsp) (revision a109b7b66649bbed86abf584a192c6af194946ef) +++ lams_central/web/qb/search.jsp (.../search.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -18,8 +18,8 @@ .question-description-grid { min-height: 10px; max-height: 10px; - max-width: 97%; overflow-x: hidden; + margin-top: 4px; } #close-button .fa { @@ -28,7 +28,11 @@ } #main-panel { border: none; + box-shadow: none; } + #import-button { + display: none; + } #search-widgets { display: flex; margin-bottom: 15px; @@ -43,17 +47,22 @@ /* jqGrid padding */ .ui-jqgrid.ui-jqgrid-bootstrap tr.jqgrow>td { - padding: 8px; + padding: 10px; } /* padding of #grid-container's two columns */ #grid-container > div { padding: 0; } @media (min-width: 768px){ - #question-detail-area { - padding-left: 20px !important; + #question-detail-area { + padding-left: 20px !important; + } } + @media (max-width: 768px){ + #question-detail-area { + margin-top: 20px !important; + } } #question-detail-area table { @@ -70,8 +79,26 @@ } #question-type { - -moz-user-select: none; -webkit-user-select: none; -ms-user-select:none; user-select:none;-o-user-select:none; + -moz-user-select: none; -webkit-user-select: none; -ms-user-select:none; user-select:none;-o-user-select:none; } + + /*----------STICKY FOOTER----------------*/ + html { + position: relative; + min-height: 100%; + } + body { + margin-bottom: 44px; + } + footer { + position: absolute; + bottom: 0; + width: 100%; + height: 44px; + } + footer > div { + height: 44px; + } @@ -114,35 +141,28 @@ '', { questionUid: questionUid + }, + function() { + $("#import-button").show(); } ); }, - gridComplete: function () { - var filters, i, l, rules, rule, iCol, $this = $(this); - //if (this.p.search === true) { - // filters = $.parseJSON(this.p.postData.filters); - // if (filters !== null && typeof filters.rules !== 'undefined' && - // filters.rules.length > 0) { - // rules = filters.rules; - // l = rules.length; - if ($("#filter-questions").val()) { - $('>tbody>tr.jqgrow>td:nth-child(2)', this).highlight($("#filter-questions").val()); - } - // } - // } - // } - }, + gridComplete: function () { + //highlight search results + if ($("#filter-questions").val()) { + $('>tbody>tr.jqgrow>td:nth-child(2)', this).highlight($("#filter-questions").val()); + } + }, loadError: function(xhr,st,err) { - jQuery("#questions-grid").clearGridData(); - $.jgrid.info_dialog("", "", ""); - }, - loadComplete: function () { - + $("#questions-grid").clearGridData(); + $.jgrid.info_dialog.call("", "", ""); + $("#import-button").hide(); + $("#question-detail-area").hide().html(""); } }) .navGrid("#questions-grid-pager", {edit:false,add:false,del:false,search:false}); - //jqgrid autowidth (http://stackoverflow.com/a/1610197) + //jqgrid autowidth $(window).bind('resize', function() { resizeJqgrid($(".ui-jqgrid-btable:visible")); }); @@ -154,60 +174,57 @@ }); }; - $(document).on("click", '#import-qbquestion-button', function() { - var qbQuestionUid = $(this).data("question-uid"); + //handler for "Import" button + $("#import-button").on("click", function() { + var qbQuestionUid = $("#selected-question-uid").val(); parent.jQuery("#itemArea").load( - "${param.returnUrl}", - { - qbQuestionUid: qbQuestionUid - }, - function() { - self.parent.refreshThickbox() - self.parent.tb_remove(); - } - ); + "${param.returnUrl}", + { + qbQuestionUid: qbQuestionUid + }, + function() { + self.parent.refreshThickbox() + self.parent.tb_remove(); + } + ); }); }); - function userNameFormatter (cellvalue, options, rowObject) { - var questionDescription = rowObject[2] ? rowObject[2] : ""; + //auxiliary formatter for jqGrid's question column + function userNameFormatter (cellvalue, options, rowObject) { + var questionDescription = rowObject[2] ? rowObject[2] : ""; - var text = cellvalue + "
"; - if (questionDescription.length > 0) { - text += questionDescription; - } - text += "
" - - return text; + var text = cellvalue + "
"; + if (questionDescription.length > 0) { + text += questionDescription; } + text += "
" + + return text; + } - //search field handler - var timeoutHnd; - function doSearch(ev){ - // var elem = ev.target||ev.srcElement; - if(timeoutHnd) - clearTimeout(timeoutHnd) - timeoutHnd = setTimeout(gridReload,500) - } + //search field handler + var timeoutHnd; + function doSearch(ev){ + // var elem = ev.target||ev.srcElement; + if(timeoutHnd) + clearTimeout(timeoutHnd) + timeoutHnd = setTimeout(gridSearch,500) + } + function gridSearch(){ + $("#questions-grid").jqGrid( + 'setGridParam', + { + postData: { searchString: $("#filter-questions").val() } + }, + { page: 1 } + ).trigger('reloadGrid'); - function gridReload(){ - $("#questions-grid").jqGrid( - 'setGridParam', - { - postData: { searchString: $("#filter-questions").val() } - }, - { page: 1 } - ).trigger('reloadGrid'); - - $("#question-detail-area").hide("slow").html(""); - - - //var nm_mask = jQuery("#item_nm").val(); - //var cd_mask = jQuery("#search_cd").val(); - //jQuery("#bigset").jqGrid('setGridParam',{url:"bigset.php?nm_mask="+nm_mask+"&cd_mask="+cd_mask,page:1}).trigger("reloadGrid"); - } - + $("#question-detail-area").hide("slow").html(""); + $("#import-button").hide("fast"); + //jQuery("#bigset").jqGrid('setGridParam',{url:"bigset.php?nm_mask="+nm_mask+"&cd_mask="+cd_mask,page:1}).trigger("reloadGrid"); + } @@ -229,60 +246,31 @@ Type: Multiple choice - - - -
-
-
-
-
- -
-
- - - - + + Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java =================================================================== diff -u -ra109b7b66649bbed86abf584a192c6af194946ef -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision a109b7b66649bbed86abf584a192c6af194946ef) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -33,17 +33,19 @@ return max == null ? 1 : max + 1; } + @SuppressWarnings("unchecked") @Override public List getPagedQbQuestions(Integer questionType, int page, int size, String sortBy, String sortOrder, String searchString) { + //we sort of strip out HTML tags from the search by using REGEXP_REPLACE which skips all the content between < > final String SELECT_QUESTIONS = "SELECT DISTINCT question.* " + " FROM lams_qb_question question " + " LEFT OUTER JOIN lams_qb_option qboption ON qboption.qb_question_uid = question.uid " + " WHERE question.type = :questionType " + " AND question.local = 0 " - + " AND (question.description LIKE CONCAT('%', :searchString, '%')" + + " AND (REGEXP_REPLACE(question.description, '<[^>]*>+', '') LIKE CONCAT('%', :searchString, '%')" + " OR question.name LIKE CONCAT('%', :searchString, '%') " - + " OR qboption.name LIKE CONCAT('%', :searchString, '%')) "; + + " OR REGEXP_REPLACE(qboption.name, '<[^>]*>+', '') LIKE CONCAT('%', :searchString, '%')) "; final String ORDER_BY_NAME = "ORDER BY question.name "; final String ORDER_BY_SMTH_ELSE = "ORDER BY question.question_id "; @@ -65,43 +67,21 @@ query.addEntity(QbQuestion.class); List queryResults = (List) query.list(); -// ArrayList userDtos = new ArrayList(); -// if (queryResults != null && queryResults.size() > 0) { -// for (Object[] element : queryResults) { -// -// Long userId = ((Number) element[0]).longValue(); -// String firstName = (String) element[1]; -// String lastName = (String) element[2]; -// String login = (String) element[3]; -// float grade = element[4] == null ? 0 : ((Number) element[4]).floatValue(); -// Long portraitId = element[5] == null ? null : ((Number) element[5]).longValue(); -// -// QbQuestion userDto = new QbQuestion(); -// userDto.setUserId(userId); -// userDto.setFirstName(firstName); -// userDto.setLastName(lastName); -// userDto.setLogin(login); -// userDto.setGrade(grade); -// userDto.setPortraitId(portraitId); -// userDtos.add(userDto); -// } -// -// } - return queryResults; } @Override public int getCountQbQuestions(Integer questionType, String searchString) { - final String SELECT_QUESTIONS = "SELECT COUNT(*) " + final String SELECT_QUESTIONS = "SELECT COUNT(DISTINCT question.uid) " + " FROM lams_qb_question question " + " LEFT OUTER JOIN lams_qb_option qboption ON qboption.qb_question_uid = question.uid " - + " AND question.type = :questionType " - + " AND (question.description LIKE CONCAT('%', :searchString, '%')" + + " WHERE question.type = :questionType " + + " AND question.local = 0 " + + " AND (REGEXP_REPLACE(question.description, '<[^>]*>+', '') LIKE CONCAT('%', :searchString, '%')" + " OR question.name LIKE CONCAT('%', :searchString, '%') " - + " OR qboption.name LIKE CONCAT('%', :searchString, '%')) "; + + " OR REGEXP_REPLACE(qboption.name, '<[^>]*>+', '') LIKE CONCAT('%', :searchString, '%')) "; - Query query = getSession().createNativeQuery(SELECT_QUESTIONS); + Query query = getSession().createNativeQuery(SELECT_QUESTIONS); query.setParameter("questionType", questionType); // support for custom search from a toolbar searchString = searchString == null ? "" : searchString; Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java =================================================================== diff -u -rc87bb47eb670934f10192c08922f83367bc36230 -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision c87bb47eb670934f10192c08922f83367bc36230) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -224,24 +224,16 @@ public static List buildDefaultQuestions(McContent mcContent) { List questionDtos = new LinkedList<>(); - Long mapIndex = new Long(1); - for (McQueContent question : mcContent.getMcQueContents()) { McQuestionDTO questionDto = new McQuestionDTO(); - - String feedback = ""; - if (question.getFeedback() != null) { - feedback = question.getFeedback(); - } - - String questionText = question.getQuestion(); - questionDto.setUid(question.getUid()); questionDto.setQbQuestionUid(question.getQbQuestion().getUid()); - questionDto.setQuestion(questionText); + questionDto.setQuestion(question.getQuestion()); questionDto.setDisplayOrder(question.getDisplayOrder()); + String feedback = question.getFeedback() == null ? "" : question.getFeedback(); questionDto.setFeedback(feedback); - questionDto.setMark(question.getMark().toString()); + String mark = question.getMark() == null ? "1" : question.getMark().toString(); + questionDto.setMark(mark); // build candidate dtos List optionDtos = new LinkedList<>(); @@ -252,8 +244,6 @@ questionDto.setOptionDtos(optionDtos); questionDtos.add(questionDto); - - mapIndex = new Long(mapIndex.longValue() + 1); } return questionDtos; Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java =================================================================== diff -u -rf24a82ae2ef1cbaa92dfd356226f6c3edcd5e404 -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java (.../McController.java) (revision f24a82ae2ef1cbaa92dfd356226f6c3edcd5e404) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java (.../McController.java) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -36,6 +36,8 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.qb.model.QbOption; +import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.qb.service.IQbService; import org.lamsfoundation.lams.questions.Answer; import org.lamsfoundation.lams.questions.Question; @@ -62,6 +64,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; /** * Action class that controls the logic of tool behavior. @@ -76,6 +79,9 @@ @Autowired private IMcService mcService; + + @Autowired + private IQbService qbService; @Autowired @Qualifier("lamcMessageService") @@ -421,7 +427,53 @@ return tempQuestionDtos; } + + /** + * Adds QbQuestion, selected in the question bank, to the current question list. + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "/importQbQuestion", method = RequestMethod.POST) + private String importQbQuestion(HttpServletRequest request) { + String sessionMapId = WebUtil.readStrParam(request, McAppConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapId); + request.setAttribute(McAppConstants.ATTR_SESSION_MAP_ID, sessionMapId); + List questionDtos = (List) sessionMap.get(McAppConstants.QUESTION_DTOS); + //get QbQuestion from DB + Long qbQuestionUid = WebUtil.readLongParam(request, "qbQuestionUid"); + QbQuestion qbQuestion = qbService.getQbQuestionByUid(qbQuestionUid); + + //finding max displayOrder + int maxDisplayOrder = 0; + for (McQuestionDTO questionDto : questionDtos) { + int displayOrder = questionDto.getDisplayOrder(); + if (displayOrder > maxDisplayOrder) { + maxDisplayOrder = displayOrder; + } + } + + // build candidate dtos + List optionDtos = new LinkedList<>(); + for (QbOption option : qbQuestion.getQbOptions()) { + McOptionDTO optionDTO = new McOptionDTO(option); + optionDtos.add(optionDTO); + } + + //create new McQuestionDTO and assign imported qbQuestion to it + McQuestionDTO questionDto = new McQuestionDTO(); + questionDto.setQuestion(qbQuestion.getName()); + questionDto.setQbQuestionUid(qbQuestionUid); + questionDto.setFeedback(qbQuestion.getFeedback()); + questionDto.setDisplayOrder(maxDisplayOrder + 1); + questionDto.setOptionDtos(optionDtos); + questionDto.setMark(qbQuestion.getMark() == null ? "1" : String.valueOf(qbQuestion.getMark())); + questionDto.setQbQuestionModified(IQbService.QUESTION_MODIFIED_NONE); + questionDtos.add(questionDto); + + return "authoring/itemlist"; + } + @RequestMapping("/saveQuestion") public String saveQuestion(@ModelAttribute McAuthoringForm mcAuthoringForm, HttpServletRequest request) { Index: lams_tool_lamc/web/authoring/AuthoringTabsHolder.jsp =================================================================== diff -u -raced7ba6c1e7c5a9a50d3f64d8cdd96dd7e76194 -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/web/authoring/AuthoringTabsHolder.jsp (.../AuthoringTabsHolder.jsp) (revision aced7ba6c1e7c5a9a50d3f64d8cdd96dd7e76194) +++ lams_tool_lamc/web/authoring/AuthoringTabsHolder.jsp (.../AuthoringTabsHolder.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -34,7 +34,7 @@ data: { sessionMapId: '${sessionMapId}' }, - target: $('#resourceListArea'), + target: $('#itemArea'), iframe: true, success: function() { document.forms.mcAuthoringForm.action="submitAllContent.do"; Index: lams_tool_lamc/web/authoring/BasicContent.jsp =================================================================== diff -u -r8b62ea3bfd10cb4304b5114c1060cac04242435a -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/web/authoring/BasicContent.jsp (.../BasicContent.jsp) (revision 8b62ea3bfd10cb4304b5114c1060cac04242435a) +++ lams_tool_lamc/web/authoring/BasicContent.jsp (.../BasicContent.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -7,7 +7,7 @@ document.forms.mcAuthoringForm.action='removeQuestion.do'; $('#mcAuthoringForm').ajaxSubmit({ - target: $('#resourceListArea'), + target: $('#itemArea'), data: { sessionMapId: '${sessionMapId}' }, @@ -32,7 +32,7 @@ var form = $(formHTML); form.prop("action", 'authoring/saveQTI.do?sessionMapId=${sessionMapId}').appendTo(document.body); form.ajaxSubmit({ - target: $('#resourceListArea'), + target: $('#itemArea'), iframe: true, success: function() { document.forms.mcAuthoringForm.action="submitAllContent.do"; @@ -62,7 +62,7 @@ -
+
<%@ include file="/authoring/itemlist.jsp"%>
Index: lams_tool_lamc/web/authoring/editQuestionBox.jsp =================================================================== diff -u -rd9b3433f41c2b25011809144d241d33237d9b9d8 -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/web/authoring/editQuestionBox.jsp (.../editQuestionBox.jsp) (revision d9b3433f41c2b25011809144d241d33237d9b9d8) +++ lams_tool_lamc/web/authoring/editQuestionBox.jsp (.../editQuestionBox.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -44,7 +44,7 @@ data: { sessionMapId: '${sessionMapId}', }, - target: parent.jQuery('#resourceListArea'), + target: parent.jQuery('#itemArea'), success: function() { self.parent.refreshThickbox(); self.parent.tb_remove(); Index: lams_tool_lamc/web/authoring/itemlist.jsp =================================================================== diff -u -rf24a82ae2ef1cbaa92dfd356226f6c3edcd5e404 -r3ec7cbf6d6a62b79ba7e4334d770721f8867e999 --- lams_tool_lamc/web/authoring/itemlist.jsp (.../itemlist.jsp) (revision f24a82ae2ef1cbaa92dfd356226f6c3edcd5e404) +++ lams_tool_lamc/web/authoring/itemlist.jsp (.../itemlist.jsp) (revision 3ec7cbf6d6a62b79ba7e4334d770721f8867e999) @@ -28,7 +28,8 @@
- + + + +
+ + + ?sessionMapId=${sessionMapId} + + + + + + Import from question bank + +