Index: lams_central/web/includes/javascript/Sortable.js =================================================================== diff -u --- lams_central/web/includes/javascript/Sortable.js (revision 0) +++ lams_central/web/includes/javascript/Sortable.js (revision 21e3286385ca1c464997e9792460b7712d23dcdd) @@ -0,0 +1,3 @@ +/*! Sortable 1.8.1 - MIT | git://github.com/SortableJS/Sortable.git */ + +!function(t){"use strict";"function"==typeof define&&define.amd?define(t):"undefined"!=typeof module&&void 0!==module.exports?module.exports=t():window.Sortable=t()}(function(){"use strict";if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var V,q,G,u,K,Z,h,Y,M,k,Q,o,J,$,l,s,c,f,P,tt,et,nt,ot,it,rt,I=[],at=!1,p=!1,lt=!1,d=[],st=!1,ct=!1,i=/\s+/g,dt="Sortable"+(new Date).getTime(),ht=window,ut=ht.document,g=ht.parseInt,ft=ht.setTimeout,e=ht.jQuery||ht.Zepto,n=ht.Polymer,r={capture:!1,passive:!1},pt=!!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\.|msie|iemobile)/i),v=!!navigator.userAgent.match(/Edge/i),m=v||pt?"cssFloat":"float",a="draggable"in ut.createElement("div"),b=function(){if(pt)return!1;var t=ut.createElement("x");return t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}(),gt=!1,w=!1,vt=Math.abs,_=Math.min,y=[],D=function(t,e){var n=B(t),o=g(n.width),i=W(t,0,e),r=W(t,1,e),a=i&&B(i),l=r&&B(r),s=a&&g(a.marginLeft)+g(a.marginRight)+Mt(i).width,c=l&&g(l.marginLeft)+g(l.marginRight)+Mt(r).width;return"flex"===n.display?"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal":i&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||o<=s&&"none"===n[m]||r&&"none"===n[m]&&o=o.left-i&&t<=o.right+i,a=e>=o.top-i&&e<=o.bottom+i;if(r&&a)return d[n]}}(t.clientX,t.clientY);e&&e[dt]._onDragOver({clientX:t.clientX,clientY:t.clientY,target:e,rootEl:e})}};function _t(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, not "+{}.toString.call(t);this.el=t,this.options=e=U({},e),t[dt]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0,draggable:/[uo]l/i.test(t.nodeName)?"li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return D(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,touchStartThreshold:g(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==_t.supportPointer&&("PointerEvent"in window||window.navigator&&"msPointerEnabled"in window.navigator),emptyInsertThreshold:5};for(var o in n)!(o in e)&&(e[o]=n[o]);for(var i in S(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&a,e.supportPointer?X(t,"pointerdown",this._onTapStart):(X(t,"mousedown",this._onTapStart),X(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(X(t,"dragover",this),X(t,"dragenter",this)),d.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[])}function yt(t,e,n,o){if(t){n=n||ut;do{if(">*"===e&&t.parentNode===n||z(t,e)||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==ut&&i.host.nodeType?i.host:i.parentNode)}var i;return null}function X(t,e,n){t.addEventListener(e,n,r)}function O(t,e,n){t.removeEventListener(e,n,r)}function Dt(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(i," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(i," ")}}function B(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return ut.defaultView&&ut.defaultView.getComputedStyle?n=ut.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function H(t){var e="";do{var n=B(t,"transform");n&&"none"!==n&&(e=n+" "+e)}while(t=t.parentNode);return window.DOMMatrix?new DOMMatrix(e):window.WebKitCSSMatrix?new WebKitCSSMatrix(e):window.CSSMatrix?new CSSMatrix(e):void 0}function R(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=this.options.touchStartThreshold&&this._disableDelayedDrag()},_disableDelayedDrag:function(){var t=this.el.ownerDocument;clearTimeout(this._dragStartTimer),O(t,"mouseup",this._disableDelayedDrag),O(t,"touchend",this._disableDelayedDrag),O(t,"touchcancel",this._disableDelayedDrag),O(t,"mousemove",this._delayedDragTouchMoveHandler),O(t,"touchmove",this._delayedDragTouchMoveHandler),O(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||("touch"==t.pointerType?t:null),!this.nativeDraggable||e?this.options.supportPointer?X(ut,"pointermove",this._onTouchMove):X(ut,e?"touchmove":"mousemove",this._onTouchMove):(X(V,"dragend",this),X(K,"dragstart",this._onDragStart));try{ut.selection?Xt(function(){ut.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t){if(p=!1,K&&V){this.nativeDraggable&&(X(ut,"dragover",this._handleAutoScroll),X(ut,"dragover",T));var e=this.options;!t&&Dt(V,e.dragClass,!1),Dt(V,e.ghostClass,!0),B(V,"transform",""),_t.active=this,t&&this._appendGhost(),Ct(this,K,"start",V,K,K,Q)}else this._nulling()},_emulateDragOver:function(t){if(P){if(this._lastX===P.clientX&&this._lastY===P.clientY&&!t)return;this._lastX=P.clientX,this._lastY=P.clientY,E();for(var e=ut.elementFromPoint(P.clientX,P.clientY),n=e;e&&e.shadowRoot;)n=e=e.shadowRoot.elementFromPoint(P.clientX,P.clientY);if(n)do{if(n[dt])if(n[dt]._onDragOver({clientX:P.clientX,clientY:P.clientY,target:e,rootEl:n})&&!this.options.dragoverBubble)break;e=n}while(n=n.parentNode);V.parentNode[dt]._computeIsAligned(P),x()}},_onTouchMove:function(t){if(f){if(!t.cancelable)return;var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=G&&H(G),a=G&&r&&r.a,l=G&&r&&r.d,s=(i.clientX-f.clientX+o.x)/(a||1),c=(i.clientY-f.clientY+o.y)/(l||1),d=t.touches?"translate3d("+s+"px,"+c+"px,0)":"translate("+s+"px,"+c+"px)";if(!_t.active&&!p){if(n&&_(vt(i.clientX-this._lastX),vt(i.clientY-this._lastY)) correctOptionSet = new TreeSet<>(new SequencableComparator()); - correctOptionSet.addAll(questionDto.getOptionDtos()); + Set originalOptions = questionResult.getAssessmentQuestion().getQuestionDTO().getOptionDtos(); + correctOptionSet.addAll(originalOptions); ArrayList correctOptionList = new ArrayList<>(correctOptionSet); int i = 0; for (OptionDTO optionDto : questionDto.getOptionDtos()) { - if (optionDto.getUid() == correctOptionList.get(i++).getUid()) { + if (optionDto.getUid().equals(correctOptionList.get(i++).getUid())) { mark += maxMarkForCorrectAnswer; } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -r3ee06bc1b00b1673399c1871a73cfa1d8ec2c0db -r21e3286385ca1c464997e9792460b7712d23dcdd --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 3ee06bc1b00b1673399c1871a73cfa1d8ec2c0db) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 21e3286385ca1c464997e9792460b7712d23dcdd) @@ -642,62 +642,6 @@ } /** - * Move up current option. - */ - @RequestMapping("/upOption") - public String upOption(HttpServletRequest request) { - return switchOption(request, true); - } - - /** - * Move down current option. - */ - @RequestMapping("/downOption") - public String downOption(HttpServletRequest request) { - return switchOption(request, false); - } - - @SuppressWarnings("unchecked") - private String switchOption(HttpServletRequest request, boolean up) { - SessionMap sessionMap = getSessionMap(request); - int pageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); - List> pagedQuestionDtos = (List>) sessionMap - .get(AssessmentConstants.ATTR_PAGED_QUESTION_DTOS); - Set questionsForOnePage = pagedQuestionDtos.get(pageNumber - 1); - Long questionUid = WebUtil.readLongParam(request, AssessmentConstants.PARAM_QUESTION_UID); - - QuestionDTO questionDto = null; - for (QuestionDTO questionDtoIter : questionsForOnePage) { - if (questionDtoIter.getUid().equals(questionUid)) { - questionDto = questionDtoIter; - break; - } - } - - Set optionDtoList = questionDto.getOptionDtos(); - - int optionIndex = NumberUtils.stringToInt(request.getParameter(AssessmentConstants.PARAM_OPTION_INDEX), -1); - if (optionIndex != -1) { - List rList = new ArrayList<>(optionDtoList); - - // get current and the target item, and switch their sequnece - OptionDTO option = rList.remove(optionIndex); - if (up) { - rList.add(--optionIndex, option); - } else { - rList.add(++optionIndex, option); - } - - // put back list - optionDtoList = new LinkedHashSet<>(rList); - questionDto.setOptionDtos(optionDtoList); - } - - request.setAttribute(AssessmentConstants.ATTR_QUESTION_FOR_ORDERING, questionDto); - return "pages/learning/parts/ordering"; - } - - /** * auto saves responses */ @RequestMapping("/autoSaveAnswers") @@ -862,6 +806,15 @@ questionDto.setAnswerString(answerString); } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) { + for (OptionDTO optionDto : questionDto.getOptionDtos()) { + int answerSequenceId = WebUtil.readIntParam(request, + AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" + optionDto.getSequenceId()); + optionDto.setSequenceId(answerSequenceId); + } + //sort accrording to the new sequenceIds + Set sortedOptions = new TreeSet<>(new SequencableComparator()); + sortedOptions.addAll(questionDto.getOptionDtos()); + questionDto.setOptionDtos(sortedOptions); } else if (questionType == AssessmentConstants.QUESTION_TYPE_MARK_HEDGING) { Index: lams_tool_assessment/web/includes/css/assessment.scss =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r21e3286385ca1c464997e9792460b7712d23dcdd --- lams_tool_assessment/web/includes/css/assessment.scss (.../assessment.scss) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_assessment/web/includes/css/assessment.scss (.../assessment.scss) (revision 21e3286385ca1c464997e9792460b7712d23dcdd) @@ -101,7 +101,7 @@ margin-top: -10px; } -// countdown growl +/*----------countdown growl----------------*/ .jGrowl { font-size: 22px; font-family: $font-family-base; @@ -117,4 +117,12 @@ .jGrowl-message { padding-left: 10px; padding-top: 5px; -} \ No newline at end of file +} + +/*----------SORTABLE----------------*/ +.sortable-chosen { + background-color: #fff; +} +.sortable-placeholder { + background-color: rgba(241, 241, 241, 0.7); + } \ No newline at end of file Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r67d7232f087b9f5c72ff41f7bbebe29cff81e099 -r21e3286385ca1c464997e9792460b7712d23dcdd --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 67d7232f087b9f5c72ff41f7bbebe29cff81e099) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 21e3286385ca1c464997e9792460b7712d23dcdd) @@ -36,9 +36,9 @@ +