Commit 218d7513 by gradyward

Merge branch 'authoring' of https://github.com/edx/edx-ora2 into grady/assessment-reorder

Conflicts:
	openassessment/xblock/static/js/openassessment-lms.min.js
	openassessment/xblock/static/js/openassessment-studio.min.js
parents e26f6eff 78078148
...@@ -17,8 +17,10 @@ module.exports = function(config) { ...@@ -17,8 +17,10 @@ module.exports = function(config) {
'lib/jquery.min.js', 'lib/jquery.min.js',
'lib/*.js', 'lib/*.js',
'src/oa_shared.js', 'src/oa_shared.js',
'src/*.js',
'src/lms/*.js', 'src/lms/*.js',
'src/studio/*.js', 'src/studio/*.js',
'spec/*.js',
'spec/lms/*.js', 'spec/lms/*.js',
'spec/studio/*.js', 'spec/studio/*.js',
...@@ -39,6 +41,7 @@ module.exports = function(config) { ...@@ -39,6 +41,7 @@ module.exports = function(config) {
// preprocess matching files before serving them to the browser // preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: { preprocessors: {
'src/*.js': 'coverage',
'src/lms/*.js': 'coverage', 'src/lms/*.js': 'coverage',
'src/studio/*.js': 'coverage' 'src/studio/*.js': 'coverage'
}, },
......
if (typeof OpenAssessment == "undefined" || !OpenAssessment) { if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}if(typeof OpenAssessment.Server=="undefined"||!OpenAssessment.Server){OpenAssessment.Server=function(runtime,element){this.runtime=runtime;this.element=element};OpenAssessment.Server.prototype={url:function(handler){return this.runtime.handlerUrl(this.element,handler)},render:function(component){var url=this.url("render_"+component);return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html"}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},renderContinuedPeer:function(){var url=this.url("render_peer_assessment");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html",data:{continue_grading:true}}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},studentInfo:function(student_id){var url=this.url("render_student_info");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html",data:{student_id:student_id}}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},submit:function(submission){var url=this.url("submit");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({submission:submission})}).done(function(data){var success=data[0];if(success){var studentId=data[1];var attemptNum=data[2];defer.resolveWith(this,[studentId,attemptNum])}else{var errorNum=data[1];var errorMsg=data[2];defer.rejectWith(this,[errorNum,errorMsg])}}).fail(function(data){defer.rejectWith(this,["AJAX",gettext("This response could not be submitted.")])})}).promise()},save:function(submission){var url=this.url("save_submission");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({submission:submission})}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This response could not be saved.")])})}).promise()},submitFeedbackOnAssessment:function(text,options){var url=this.url("submit_feedback");var payload=JSON.stringify({feedback_text:text,feedback_options:options});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This feedback could not be submitted.")])})}).promise()},peerAssess:function(optionsSelected,criterionFeedback,overallFeedback){var url=this.url("peer_assess");var payload=JSON.stringify({options_selected:optionsSelected,criterion_feedback:criterionFeedback,overall_feedback:overallFeedback});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})}).promise()},selfAssess:function(optionsSelected){var url=this.url("self_assess");var payload=JSON.stringify({options_selected:optionsSelected});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},trainingAssess:function(optionsSelected){var url=this.url("training_assess");var payload=JSON.stringify({options_selected:optionsSelected});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolveWith(this,[data.corrections])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},scheduleTraining:function(){var url=this.url("schedule_training");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},rescheduleUnfinishedTasks:function(){var url=this.url("reschedule_unfinished_tasks");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("One or more rescheduling tasks failed.")])})})},updateEditorContext:function(kwargs){var url=this.url("update_editor_context");var payload=JSON.stringify({prompt:kwargs.prompt,feedback_prompt:kwargs.feedbackPrompt,title:kwargs.title,submission_start:kwargs.submissionStart,submission_due:kwargs.submissionDue,criteria:kwargs.criteria,assessments:kwargs.assessments});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This problem could not be saved.")])})}).promise()},checkReleased:function(){var url=this.url("check_released");var payload='""';return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolveWith(this,[data.is_released])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("The server could not be contacted.")])})}).promise()}}}if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}OpenAssessment.BaseView=function(runtime,element,server){this.runtime=runtime;this.element=element;this.server=server;this.responseView=new OpenAssessment.ResponseView(this.element,this.server,this);this.trainingView=new OpenAssessment.StudentTrainingView(this.element,this.server,this);this.selfView=new OpenAssessment.SelfView(this.element,this.server,this);this.peerView=new OpenAssessment.PeerView(this.element,this.server,this);this.gradeView=new OpenAssessment.GradeView(this.element,this.server,this);this.messageView=new OpenAssessment.MessageView(this.element,this.server,this);this.staffInfoView=new OpenAssessment.StaffInfoView(this.element,this.server,this)};OpenAssessment.BaseView.prototype={scrollToTop:function(){if($.scrollTo instanceof Function){$(window).scrollTo($("#openassessment__steps"),800,{offset:-50})}},setUpCollapseExpand:function(parentSel,onExpand){parentSel.find(".ui-toggle-visibility__control").click(function(eventData){var sel=$(eventData.target).closest(".ui-toggle-visibility");if(sel.hasClass("is--collapsed")&&onExpand!==undefined){onExpand()}sel.toggleClass("is--collapsed")})},load:function(){this.responseView.load();this.loadAssessmentModules();this.staffInfoView.load()},loadAssessmentModules:function(){this.trainingView.load();this.peerView.load();this.selfView.load();this.gradeView.load()},loadMessageView:function(){this.messageView.load()},toggleActionError:function(type,msg){var element=this.element;var container=null;if(type=="save"){container=".response__submission__actions"}else if(type=="submit"||type=="peer"||type=="self"||type=="student-training"){container=".step__actions"}else if(type=="feedback_assess"){container=".submission__feedback__actions"}if(container===null){if(msg!==null){console.log(msg)}}else{var msgHtml=msg===null?"":msg;$(container+" .message__content",element).html("<p>"+msgHtml+"</p>");$(container,element).toggleClass("has--error",msg!==null)}},showLoadError:function(step){var container="#openassessment__"+step;$(container).toggleClass("has--error",true);$(container+" .step__status__value i").removeClass().addClass("ico icon-warning-sign");$(container+" .step__status__value .copy").html(gettext("Unable to Load"))}};function OpenAssessmentBlock(runtime,element){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.BaseView(runtime,element,server);view.load()}OpenAssessment.Container=function(containerItem,kwargs){this.containerItem=containerItem;this.containerElement=kwargs.containerElement;this.templateElement=kwargs.templateElement;this.addButtonElement=kwargs.addButtonElement;this.removeButtonClass=kwargs.removeButtonClass;this.containerItemClass=kwargs.containerItemClass;$(this.addButtonElement).click($.proxy(this.add,this));var container=this;$("."+this.removeButtonClass,this.containerElement).click(function(eventData){container.remove(eventData.target)});$("."+this.containerItemClass,this.containerElement).each(function(index,element){new container.containerItem(element)})};OpenAssessment.Container.prototype={add:function(){$(this.templateElement).clone().removeAttr("id").toggleClass("is--hidden",false).toggleClass(this.containerItemClass,true).appendTo($(this.containerElement));var container=this;var containerItem=$("."+this.containerItemClass,this.containerElement).last();containerItem.find("."+this.removeButtonClass).click(function(eventData){container.remove(eventData.target)});new this.containerItem(containerItem.get(0))},remove:function(element){$(element).closest("."+this.containerItemClass).remove()},getItemValues:function(){var values=[];var container=this;$("."+this.containerItemClass,this.containerElement).each(function(index,element){var containerItem=new container.containerItem(element);var fieldValues=containerItem.getFieldValues();values.push(fieldValues)});return values},getItemElement:function(index){var element=$("."+this.containerItemClass,this.containerElement).get(index);return element!==undefined?element:null}};OpenAssessment.RubricOption=function(element){this.element=element};OpenAssessment.RubricOption.prototype={getFieldValues:function(){return{name:OpenAssessment.Fields.stringField($(".openassessment_criterion_option_name",this.element)),points:OpenAssessment.Fields.intField($(".openassessment_criterion_option_points",this.element)),explanation:OpenAssessment.Fields.stringField($(".openassessment_criterion_option_explanation",this.element))}}};OpenAssessment.RubricCriterion=function(element){this.element=element;this.optionContainer=new OpenAssessment.Container(OpenAssessment.RubricOption,{containerElement:$(".openassessment_criterion_option_list",this.element).get(0),templateElement:$("#openassessment_option_template").get(0),addButtonElement:$(".openassessment_criterion_add_option",this.element).get(0),removeButtonClass:"openassessment_rubric_remove_button",containerItemClass:"openassessment_criterion_option"})};OpenAssessment.RubricCriterion.prototype={getFieldValues:function(){return{name:OpenAssessment.Fields.stringField($(".openassessment_criterion_name",this.element)),prompt:OpenAssessment.Fields.stringField($(".openassessment_criterion_prompt",this.element)),feedback:OpenAssessment.Fields.stringField($(".openassessment_criterion_feedback",this.element)),options:this.optionContainer.getItemValues()}}};OpenAssessment.GradeView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.GradeView.prototype={load:function(){var view=this;var baseView=this.baseView;this.server.render("grade").done(function(html){$("#openassessment__grade",view.element).replaceWith(html);view.installHandlers()}).fail(function(errMsg){baseView.showLoadError("grade",errMsg)})},installHandlers:function(){var sel=$("#openassessment__grade",this.element);this.baseView.setUpCollapseExpand(sel);var view=this;sel.find("#feedback__submit").click(function(eventObject){eventObject.preventDefault();view.submitFeedbackOnAssessment()})},feedbackText:function(text){if(typeof text==="undefined"){return $("#feedback__remarks__value",this.element).val()}else{$("#feedback__remarks__value",this.element).val(text)}},feedbackOptions:function(options){var view=this;if(typeof options==="undefined"){return $.map($(".feedback__overall__value:checked",view.element),function(element,index){return $(element).val()})}else{$(".feedback__overall__value",this.element).prop("checked",false);$.each(options,function(index,opt){$("#feedback__overall__value--"+opt,view.element).prop("checked",true)})}},setHidden:function(sel,hidden){sel.toggleClass("is--hidden",hidden);sel.attr("aria-hidden",hidden?"true":"false")},isHidden:function(sel){return sel.hasClass("is--hidden")&&sel.attr("aria-hidden")=="true"},feedbackState:function(newState){var containerSel=$(".submission__feedback__content",this.element);var instructionsSel=containerSel.find(".submission__feedback__instructions");var fieldsSel=containerSel.find(".submission__feedback__fields");var actionsSel=containerSel.find(".submission__feedback__actions");var transitionSel=containerSel.find(".transition__status");var messageSel=containerSel.find(".message--complete");if(typeof newState==="undefined"){var isSubmitting=containerSel.hasClass("is--transitioning")&&containerSel.hasClass("is--submitting")&&!this.isHidden(transitionSel)&&this.isHidden(messageSel)&&this.isHidden(instructionsSel)&&this.isHidden(fieldsSel)&&this.isHidden(actionsSel);var hasSubmitted=containerSel.hasClass("is--submitted")&&this.isHidden(transitionSel)&&!this.isHidden(messageSel)&&this.isHidden(instructionsSel)&&this.isHidden(fieldsSel)&&this.isHidden(actionsSel);var isOpen=!containerSel.hasClass("is--submitted")&&!containerSel.hasClass("is--transitioning")&&!containerSel.hasClass("is--submitting")&&this.isHidden(transitionSel)&&this.isHidden(messageSel)&&!this.isHidden(instructionsSel)&&!this.isHidden(fieldsSel)&&!this.isHidden(actionsSel);if(isOpen){return"open"}else if(isSubmitting){return"submitting"}else if(hasSubmitted){return"submitted"}else{throw"Invalid feedback state"}}else{if(newState=="open"){containerSel.toggleClass("is--transitioning",false);containerSel.toggleClass("is--submitting",false);containerSel.toggleClass("is--submitted",false);this.setHidden(instructionsSel,false);this.setHidden(fieldsSel,false);this.setHidden(actionsSel,false);this.setHidden(transitionSel,true);this.setHidden(messageSel,true)}else if(newState=="submitting"){containerSel.toggleClass("is--transitioning",true);containerSel.toggleClass("is--submitting",true);containerSel.toggleClass("is--submitted",false);this.setHidden(instructionsSel,true);this.setHidden(fieldsSel,true);this.setHidden(actionsSel,true);this.setHidden(transitionSel,false);this.setHidden(messageSel,true)}else if(newState=="submitted"){containerSel.toggleClass("is--transitioning",false);containerSel.toggleClass("is--submitting",false);containerSel.toggleClass("is--submitted",true);this.setHidden(instructionsSel,true);this.setHidden(fieldsSel,true);this.setHidden(actionsSel,true);this.setHidden(transitionSel,true);this.setHidden(messageSel,false)}}},submitFeedbackOnAssessment:function(){var view=this;var baseView=this.baseView;$("#feedback__submit",this.element).toggleClass("is--disabled",true);view.feedbackState("submitting");this.server.submitFeedbackOnAssessment(this.feedbackText(),this.feedbackOptions()).done(function(){view.feedbackState("submitted")}).fail(function(errMsg){baseView.toggleActionError("feedback_assess",errMsg)})}};OpenAssessment.MessageView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.MessageView.prototype={load:function(){var view=this;var baseView=this.baseView;this.server.render("message").done(function(html){$("#openassessment__message",view.element).replaceWith(html)}).fail(function(errMsg){baseView.showLoadError("message",errMsg)})}};OpenAssessment.PeerView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null};OpenAssessment.PeerView.prototype={load:function(){var view=this;this.server.render("peer_assessment").done(function(html){$("#openassessment__peer-assessment",view.element).replaceWith(html);view.installHandlers(false)}).fail(function(errMsg){view.baseView.showLoadError("peer-assessment")});view.baseView.loadMessageView()},loadContinuedAssessment:function(){var view=this;this.server.renderContinuedPeer().done(function(html){$("#openassessment__peer-assessment",view.element).replaceWith(html);view.installHandlers(true)}).fail(function(errMsg){view.baseView.showLoadError("peer-assessment")})},installHandlers:function(isContinuedAssessment){var sel=$("#openassessment__peer-assessment",this.element);var view=this;this.baseView.setUpCollapseExpand(sel,$.proxy(view.loadContinuedAssessment,view));var rubricSelector=$("#peer-assessment--001__assessment",this.element);if(rubricSelector.size()>0){var rubricElement=rubricSelector.get(0);this.rubric=new OpenAssessment.Rubric(rubricElement)}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(view.peerSubmitEnabled,view))}sel.find("#peer-assessment--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();if(!isContinuedAssessment){view.peerAssess()}else{view.continuedPeerAssess()}})},peerSubmitEnabled:function(enabled){var button=$("#peer-assessment--001__assessment__submit",this.element);if(typeof enabled==="undefined"){return!button.hasClass("is--disabled")}else{button.toggleClass("is--disabled",!enabled)}},peerAssess:function(){var view=this;var baseView=view.baseView;this.peerAssessRequest(function(){view.load();baseView.loadAssessmentModules();baseView.scrollToTop()})},continuedPeerAssess:function(){var view=this;var gradeView=this.baseView.gradeView;var baseView=view.baseView;view.peerAssessRequest(function(){view.loadContinuedAssessment();gradeView.load();baseView.scrollToTop()})},peerAssessRequest:function(successFunction){var view=this;view.baseView.toggleActionError("peer",null);view.peerSubmitEnabled(false);this.server.peerAssess(this.rubric.optionsSelected(),this.rubric.criterionFeedback(),this.overallFeedback()).done(successFunction).fail(function(errMsg){view.baseView.toggleActionError("peer",errMsg);view.peerSubmitEnabled(true)})},overallFeedback:function(overallFeedback){var selector="#assessment__rubric__question--feedback__value";if(typeof overallFeedback==="undefined"){return $(selector,this.element).val()}else{$(selector,this.element).val(overallFeedback)}}};OpenAssessment.ResponseView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.savedResponse="";this.lastChangeTime=Date.now();this.errorOnLastSave=false;this.autoSaveTimerId=null};OpenAssessment.ResponseView.prototype={AUTO_SAVE_POLL_INTERVAL:2e3,AUTO_SAVE_WAIT:3e4,load:function(){var view=this;this.server.render("submission").done(function(html){$("#openassessment__response",view.element).replaceWith(html);view.installHandlers();view.setAutoSaveEnabled(true)}).fail(function(errMsg){view.baseView.showLoadError("response")})},installHandlers:function(){var sel=$("#openassessment__response",this.element);var view=this;this.baseView.setUpCollapseExpand(sel);this.savedResponse=this.response();var handleChange=function(eventData){view.handleResponseChanged()};sel.find("#submission__answer__value").on("change keyup drop paste",handleChange);sel.find("#step--response__submit").click(function(eventObject){eventObject.preventDefault();view.submit()});sel.find("#submission__save").click(function(eventObject){eventObject.preventDefault();view.save()})},setAutoSaveEnabled:function(enabled){if(enabled){if(this.autoSaveTimerId===null){this.autoSaveTimerId=setInterval($.proxy(this.autoSave,this),this.AUTO_SAVE_POLL_INTERVAL)}}else{if(this.autoSaveTimerId!==null){clearInterval(this.autoSaveTimerId)}}},submitEnabled:function(enabled){var sel=$("#step--response__submit",this.element);if(typeof enabled==="undefined"){return!sel.hasClass("is--disabled")}else{sel.toggleClass("is--disabled",!enabled)}},saveEnabled:function(enabled){var sel=$("#submission__save",this.element);if(typeof enabled==="undefined"){return!sel.hasClass("is--disabled")}else{sel.toggleClass("is--disabled",!enabled)}},saveStatus:function(msg){var sel=$("#response__save_status h3",this.element);if(typeof msg==="undefined"){return sel.text()}else{var label=gettext("Status of Your Response");sel.html('<span class="sr">'+label+":"+"</span>\n"+msg)}},unsavedWarningEnabled:function(enabled){if(typeof enabled==="undefined"){return window.onbeforeunload!==null}else{if(enabled){window.onbeforeunload=function(){return gettext("If you leave this page without saving or submitting your response, you'll lose any work you've done on the response.")}}else{window.onbeforeunload=null}}},response:function(text){var sel=$("#submission__answer__value",this.element);if(typeof text==="undefined"){return sel.val()}else{sel.val(text)}},responseChanged:function(){var currentResponse=$.trim(this.response());var savedResponse=$.trim(this.savedResponse);return savedResponse!==currentResponse},autoSave:function(){var timeSinceLastChange=Date.now()-this.lastChangeTime;if(this.responseChanged()&&timeSinceLastChange>this.AUTO_SAVE_WAIT&&!this.errorOnLastSave){this.save()}},handleResponseChanged:function(){var isBlank=$.trim(this.response())!=="";this.submitEnabled(isBlank);if(this.responseChanged()){this.saveEnabled(isBlank);this.saveStatus(gettext("This response has not been saved."));this.unsavedWarningEnabled(true)}this.lastChangeTime=Date.now()},save:function(){this.errorOnLastSave=false;this.saveStatus(gettext("Saving..."));this.baseView.toggleActionError("save",null);this.unsavedWarningEnabled(false);var view=this;var savedResponse=this.response();this.server.save(savedResponse).done(function(){view.savedResponse=savedResponse;var currentResponse=view.response();view.submitEnabled(currentResponse!=="");if(currentResponse==savedResponse){view.saveEnabled(false);view.saveStatus(gettext("This response has been saved but not submitted."))}}).fail(function(errMsg){view.saveStatus(gettext("Error"));view.baseView.toggleActionError("save",errMsg);view.errorOnLastSave=true})},submit:function(){this.submitEnabled(false);var view=this;var baseView=this.baseView;this.confirmSubmission().pipe(function(){var submission=$("#submission__answer__value",view.element).val();baseView.toggleActionError("response",null);return view.server.submit(submission)}).done($.proxy(view.moveToNextStep,view)).fail(function(errCode,errMsg){if(errCode=="ENOMULTI"){view.moveToNextStep()}else{if(errMsg){baseView.toggleActionError("submit",errMsg)}view.submitEnabled(true)}})},moveToNextStep:function(){this.load();this.baseView.loadAssessmentModules();this.unsavedWarningEnabled(false)},confirmSubmission:function(){var msg="You're about to submit your response for this assignment. "+"After you submit this response, you can't change it or submit a new response.";return $.Deferred(function(defer){if(confirm(msg)){defer.resolve()}else{defer.reject()}})}};OpenAssessment.Rubric=function(element){this.element=element};OpenAssessment.Rubric.prototype={criterionFeedback:function(criterionFeedback){var selector="textarea.answer__value";var feedback={};$(selector,this.element).each(function(index,sel){if(typeof criterionFeedback!=="undefined"){$(sel).val(criterionFeedback[sel.name]);feedback[sel.name]=criterionFeedback[sel.name]}else{feedback[sel.name]=$(sel).val()}});return feedback},optionsSelected:function(optionsSelected){var selector="input[type=radio]";if(typeof optionsSelected==="undefined"){var options={};$(selector+":checked",this.element).each(function(index,sel){options[sel.name]=sel.value});return options}else{$(selector,this.element).prop("checked",false);$(selector,this.element).each(function(index,sel){if(optionsSelected.hasOwnProperty(sel.name)){if(sel.value==optionsSelected[sel.name]){$(sel).prop("checked",true)}}})}},canSubmitCallback:function(callback){$(this.element).change(function(){var numChecked=$("input[type=radio]:checked",this).length;var numAvailable=$(".field--radio.assessment__rubric__question",this).length;var canSubmit=numChecked==numAvailable;callback(canSubmit)})},showCorrections:function(corrections){var selector="input[type=radio]";var hasErrors=false;$(selector,this.element).each(function(index,sel){var listItem=$(sel).parents(".assessment__rubric__question");if(corrections.hasOwnProperty(sel.name)){hasErrors=true;listItem.find(".message--incorrect").removeClass("is--hidden");listItem.find(".message--correct").addClass("is--hidden")}else{listItem.find(".message--correct").removeClass("is--hidden");listItem.find(".message--incorrect").addClass("is--hidden")}});return hasErrors}};OpenAssessment.SelfView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null};OpenAssessment.SelfView.prototype={load:function(){var view=this;this.server.render("self_assessment").done(function(html){$("#openassessment__self-assessment",view.element).replaceWith(html);view.installHandlers()}).fail(function(errMsg){view.showLoadError("self-assessment")})},installHandlers:function(){var view=this;var sel=$("#openassessment__self-assessment",view.element);this.baseView.setUpCollapseExpand(sel);var rubricSelector=$("#self-assessment--001__assessment",this.element);if(rubricSelector.size()>0){var rubricElement=rubricSelector.get(0);this.rubric=new OpenAssessment.Rubric(rubricElement)}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(this.selfSubmitEnabled,this))}sel.find("#self-assessment--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();view.selfAssess()})},selfSubmitEnabled:function(enabled){var button=$("#self-assessment--001__assessment__submit",this.element);if(typeof enabled==="undefined"){return!button.hasClass("is--disabled")}else{button.toggleClass("is--disabled",!enabled)}},selfAssess:function(){var view=this;var baseView=this.baseView;baseView.toggleActionError("self",null);view.selfSubmitEnabled(false);var options=this.rubric.optionsSelected();this.server.selfAssess(options).done(function(){baseView.loadAssessmentModules();baseView.scrollToTop()}).fail(function(errMsg){baseView.toggleActionError("self",errMsg);view.selfSubmitEnabled(true)})}};OpenAssessment.StaffInfoView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.StaffInfoView.prototype={load:function(){var view=this;if($("#openassessment__staff-info",view.element).length>0){this.server.render("staff_info").done(function(html){$("#openassessment__staff-info",view.element).replaceWith(html);view.installHandlers()}).fail(function(errMsg){view.baseView.showLoadError("staff_info")})}},loadStudentInfo:function(){var view=this;var sel=$("#openassessment__staff-info",this.element);var student_id=sel.find("#openassessment__student_id").val();this.server.studentInfo(student_id).done(function(html){$("#openassessment__student-info",view.element).replaceWith(html)}).fail(function(errMsg){view.showLoadError("student_info")})},installHandlers:function(){var sel=$("#openassessment__staff-info",this.element);var view=this;if(sel.length<=0){return}this.baseView.setUpCollapseExpand(sel,function(){});sel.find("#openassessment_student_info_form").submit(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});sel.find("#submit_student_id").click(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});sel.find("#schedule_training").click(function(eventObject){eventObject.preventDefault();view.scheduleTraining()});sel.find("#reschedule_unfinished_tasks").click(function(eventObject){eventObject.preventDefault();view.rescheduleUnfinishedTasks()})},scheduleTraining:function(){var view=this;this.server.scheduleTraining().done(function(msg){$("#schedule_training_message",this.element).text(msg)}).fail(function(errMsg){$("#schedule_training_message",this.element).text(errMsg)})},rescheduleUnfinishedTasks:function(){var view=this;this.server.rescheduleUnfinishedTasks().done(function(msg){$("#reschedule_unfinished_tasks_message",this.element).text(msg)}).fail(function(errMsg){$("#reschedule_unfinished_tasks_message",this.element).text(errMsg)})}};OpenAssessment.StudentTrainingView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null};OpenAssessment.StudentTrainingView.prototype={load:function(){var view=this;this.server.render("student_training").done(function(html){$("#openassessment__student-training",view.element).replaceWith(html);view.installHandlers()}).fail(function(errMsg){view.baseView.showLoadError("student-training")})},installHandlers:function(){var sel=$("#openassessment__student-training",this.element);var view=this;this.baseView.setUpCollapseExpand(sel);var rubricSelector=$("#student-training--001__assessment",this.element);if(rubricSelector.size()>0){var rubricElement=rubricSelector.get(0);this.rubric=new OpenAssessment.Rubric(rubricElement)}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(this.assessButtonEnabled,this))}sel.find("#student-training--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();view.assess()})},assess:function(){this.assessButtonEnabled(false);var options={};if(this.rubric!==null){options=this.rubric.optionsSelected()}var view=this;var baseView=this.baseView;this.server.trainingAssess(options).done(function(corrections){var incorrect=$("#openassessment__student-training--incorrect",this.element);var instructions=$("#openassessment__student-training--instructions",this.element);if(!view.rubric.showCorrections(corrections)){view.load();baseView.loadAssessmentModules();incorrect.addClass("is--hidden");instructions.removeClass("is--hidden")}else{instructions.addClass("is--hidden");incorrect.removeClass("is--hidden")}baseView.scrollToTop()}).fail(function(errMsg){baseView.toggleActionError("student-training",errMsg);view.assessButtonEnabled(true)})},assessButtonEnabled:function(isEnabled){var button=$("#student-training--001__assessment__submit",this.element);if(typeof isEnabled==="undefined"){return!button.hasClass("is--disabled")}else{button.toggleClass("is--disabled",!isEnabled)}}};
OpenAssessment = {}; \ No newline at end of file
}
if (typeof window.gettext === "undefined") {
window.gettext = function(text) {
return text;
};
}
OpenAssessment.BaseView = function(runtime, element, server) {
this.runtime = runtime;
this.element = element;
this.server = server;
this.responseView = new OpenAssessment.ResponseView(this.element, this.server, this);
this.trainingView = new OpenAssessment.StudentTrainingView(this.element, this.server, this);
this.selfView = new OpenAssessment.SelfView(this.element, this.server, this);
this.peerView = new OpenAssessment.PeerView(this.element, this.server, this);
this.gradeView = new OpenAssessment.GradeView(this.element, this.server, this);
this.messageView = new OpenAssessment.MessageView(this.element, this.server, this);
this.staffInfoView = new OpenAssessment.StaffInfoView(this.element, this.server, this);
};
OpenAssessment.BaseView.prototype = {
scrollToTop: function() {
if ($.scrollTo instanceof Function) {
$(window).scrollTo($("#openassessment__steps"), 800, {
offset: -50
});
}
},
setUpCollapseExpand: function(parentSel, onExpand) {
parentSel.find(".ui-toggle-visibility__control").click(function(eventData) {
var sel = $(eventData.target).closest(".ui-toggle-visibility");
if (sel.hasClass("is--collapsed") && onExpand !== undefined) {
onExpand();
}
sel.toggleClass("is--collapsed");
});
},
load: function() {
this.responseView.load();
this.loadAssessmentModules();
this.staffInfoView.load();
},
loadAssessmentModules: function() {
this.trainingView.load();
this.peerView.load();
this.selfView.load();
this.gradeView.load();
},
loadMessageView: function() {
this.messageView.load();
},
toggleActionError: function(type, msg) {
var element = this.element;
var container = null;
if (type == "save") {
container = ".response__submission__actions";
} else if (type == "submit" || type == "peer" || type == "self" || type == "student-training") {
container = ".step__actions";
} else if (type == "feedback_assess") {
container = ".submission__feedback__actions";
}
if (container === null) {
if (msg !== null) {
console.log(msg);
}
} else {
var msgHtml = msg === null ? "" : msg;
$(container + " .message__content", element).html("<p>" + msgHtml + "</p>");
$(container, element).toggleClass("has--error", msg !== null);
}
},
showLoadError: function(step) {
var container = "#openassessment__" + step;
$(container).toggleClass("has--error", true);
$(container + " .step__status__value i").removeClass().addClass("ico icon-warning-sign");
$(container + " .step__status__value .copy").html(gettext("Unable to Load"));
}
};
function OpenAssessmentBlock(runtime, element) {
var server = new OpenAssessment.Server(runtime, element);
var view = new OpenAssessment.BaseView(runtime, element, server);
view.load();
}
OpenAssessment.Container = function(containerItem, kwargs) {
this.containerItem = containerItem;
this.containerElement = kwargs.containerElement;
this.templateElement = kwargs.templateElement;
this.addButtonElement = kwargs.addButtonElement;
this.removeButtonClass = kwargs.removeButtonClass;
this.containerItemClass = kwargs.containerItemClass;
$(this.addButtonElement).click($.proxy(this.add, this));
var container = this;
$("." + this.removeButtonClass, this.containerElement).click(function(eventData) {
container.remove(eventData.target);
});
$("." + this.containerItemClass, this.containerElement).each(function(index, element) {
new container.containerItem(element);
});
};
OpenAssessment.Container.prototype = {
add: function() {
$(this.templateElement).clone().removeAttr("id").toggleClass("is--hidden", false).toggleClass(this.containerItemClass, true).appendTo($(this.containerElement));
var container = this;
var containerItem = $("." + this.containerItemClass, this.containerElement).last();
containerItem.find("." + this.removeButtonClass).click(function(eventData) {
container.remove(eventData.target);
});
new this.containerItem(containerItem.get(0));
},
remove: function(element) {
$(element).closest("." + this.containerItemClass).remove();
},
getItemValues: function() {
var values = [];
var container = this;
$("." + this.containerItemClass, this.containerElement).each(function(index, element) {
var containerItem = new container.containerItem(element);
var fieldValues = containerItem.getFieldValues();
values.push(fieldValues);
});
return values;
},
getItemElement: function(index) {
var element = $("." + this.containerItemClass, this.containerElement).get(index);
return element !== undefined ? element : null;
}
};
OpenAssessment.RubricOption = function(element) {
this.element = element;
};
OpenAssessment.RubricOption.prototype = {
getFieldValues: function() {
return {
name: OpenAssessment.Fields.stringField($(".openassessment_criterion_option_name", this.element)),
points: OpenAssessment.Fields.intField($(".openassessment_criterion_option_points", this.element)),
explanation: OpenAssessment.Fields.stringField($(".openassessment_criterion_option_explanation", this.element))
};
}
};
OpenAssessment.RubricCriterion = function(element) {
this.element = element;
this.optionContainer = new OpenAssessment.Container(OpenAssessment.RubricOption, {
containerElement: $(".openassessment_criterion_option_list", this.element).get(0),
templateElement: $("#openassessment_option_template").get(0),
addButtonElement: $(".openassessment_criterion_add_option", this.element).get(0),
removeButtonClass: "openassessment_rubric_remove_button",
containerItemClass: "openassessment_criterion_option"
});
};
OpenAssessment.RubricCriterion.prototype = {
getFieldValues: function() {
return {
name: OpenAssessment.Fields.stringField($(".openassessment_criterion_name", this.element)),
prompt: OpenAssessment.Fields.stringField($(".openassessment_criterion_prompt", this.element)),
feedback: OpenAssessment.Fields.stringField($(".openassessment_criterion_feedback", this.element)),
options: this.optionContainer.getItemValues()
};
}
};
OpenAssessment.GradeView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
};
OpenAssessment.GradeView.prototype = {
load: function() {
var view = this;
var baseView = this.baseView;
this.server.render("grade").done(function(html) {
$("#openassessment__grade", view.element).replaceWith(html);
view.installHandlers();
}).fail(function(errMsg) {
baseView.showLoadError("grade", errMsg);
});
},
installHandlers: function() {
var sel = $("#openassessment__grade", this.element);
this.baseView.setUpCollapseExpand(sel);
var view = this;
sel.find("#feedback__submit").click(function(eventObject) {
eventObject.preventDefault();
view.submitFeedbackOnAssessment();
});
},
feedbackText: function(text) {
if (typeof text === "undefined") {
return $("#feedback__remarks__value", this.element).val();
} else {
$("#feedback__remarks__value", this.element).val(text);
}
},
feedbackOptions: function(options) {
var view = this;
if (typeof options === "undefined") {
return $.map($(".feedback__overall__value:checked", view.element), function(element, index) {
return $(element).val();
});
} else {
$(".feedback__overall__value", this.element).prop("checked", false);
$.each(options, function(index, opt) {
$("#feedback__overall__value--" + opt, view.element).prop("checked", true);
});
}
},
setHidden: function(sel, hidden) {
sel.toggleClass("is--hidden", hidden);
sel.attr("aria-hidden", hidden ? "true" : "false");
},
isHidden: function(sel) {
return sel.hasClass("is--hidden") && sel.attr("aria-hidden") == "true";
},
feedbackState: function(newState) {
var containerSel = $(".submission__feedback__content", this.element);
var instructionsSel = containerSel.find(".submission__feedback__instructions");
var fieldsSel = containerSel.find(".submission__feedback__fields");
var actionsSel = containerSel.find(".submission__feedback__actions");
var transitionSel = containerSel.find(".transition__status");
var messageSel = containerSel.find(".message--complete");
if (typeof newState === "undefined") {
var isSubmitting = containerSel.hasClass("is--transitioning") && containerSel.hasClass("is--submitting") && !this.isHidden(transitionSel) && this.isHidden(messageSel) && this.isHidden(instructionsSel) && this.isHidden(fieldsSel) && this.isHidden(actionsSel);
var hasSubmitted = containerSel.hasClass("is--submitted") && this.isHidden(transitionSel) && !this.isHidden(messageSel) && this.isHidden(instructionsSel) && this.isHidden(fieldsSel) && this.isHidden(actionsSel);
var isOpen = !containerSel.hasClass("is--submitted") && !containerSel.hasClass("is--transitioning") && !containerSel.hasClass("is--submitting") && this.isHidden(transitionSel) && this.isHidden(messageSel) && !this.isHidden(instructionsSel) && !this.isHidden(fieldsSel) && !this.isHidden(actionsSel);
if (isOpen) {
return "open";
} else if (isSubmitting) {
return "submitting";
} else if (hasSubmitted) {
return "submitted";
} else {
throw "Invalid feedback state";
}
} else {
if (newState == "open") {
containerSel.toggleClass("is--transitioning", false);
containerSel.toggleClass("is--submitting", false);
containerSel.toggleClass("is--submitted", false);
this.setHidden(instructionsSel, false);
this.setHidden(fieldsSel, false);
this.setHidden(actionsSel, false);
this.setHidden(transitionSel, true);
this.setHidden(messageSel, true);
} else if (newState == "submitting") {
containerSel.toggleClass("is--transitioning", true);
containerSel.toggleClass("is--submitting", true);
containerSel.toggleClass("is--submitted", false);
this.setHidden(instructionsSel, true);
this.setHidden(fieldsSel, true);
this.setHidden(actionsSel, true);
this.setHidden(transitionSel, false);
this.setHidden(messageSel, true);
} else if (newState == "submitted") {
containerSel.toggleClass("is--transitioning", false);
containerSel.toggleClass("is--submitting", false);
containerSel.toggleClass("is--submitted", true);
this.setHidden(instructionsSel, true);
this.setHidden(fieldsSel, true);
this.setHidden(actionsSel, true);
this.setHidden(transitionSel, true);
this.setHidden(messageSel, false);
}
}
},
submitFeedbackOnAssessment: function() {
var view = this;
var baseView = this.baseView;
$("#feedback__submit", this.element).toggleClass("is--disabled", true);
view.feedbackState("submitting");
this.server.submitFeedbackOnAssessment(this.feedbackText(), this.feedbackOptions()).done(function() {
view.feedbackState("submitted");
}).fail(function(errMsg) {
baseView.toggleActionError("feedback_assess", errMsg);
});
}
};
OpenAssessment.MessageView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
};
OpenAssessment.MessageView.prototype = {
load: function() {
var view = this;
var baseView = this.baseView;
this.server.render("message").done(function(html) {
$("#openassessment__message", view.element).replaceWith(html);
}).fail(function(errMsg) {
baseView.showLoadError("message", errMsg);
});
}
};
OpenAssessment.PeerView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
this.rubric = null;
};
OpenAssessment.PeerView.prototype = {
load: function() {
var view = this;
this.server.render("peer_assessment").done(function(html) {
$("#openassessment__peer-assessment", view.element).replaceWith(html);
view.installHandlers(false);
}).fail(function(errMsg) {
view.baseView.showLoadError("peer-assessment");
});
view.baseView.loadMessageView();
},
loadContinuedAssessment: function() {
var view = this;
this.server.renderContinuedPeer().done(function(html) {
$("#openassessment__peer-assessment", view.element).replaceWith(html);
view.installHandlers(true);
}).fail(function(errMsg) {
view.baseView.showLoadError("peer-assessment");
});
},
installHandlers: function(isContinuedAssessment) {
var sel = $("#openassessment__peer-assessment", this.element);
var view = this;
this.baseView.setUpCollapseExpand(sel, $.proxy(view.loadContinuedAssessment, view));
var rubricSelector = $("#peer-assessment--001__assessment", this.element);
if (rubricSelector.size() > 0) {
var rubricElement = rubricSelector.get(0);
this.rubric = new OpenAssessment.Rubric(rubricElement);
}
if (this.rubric !== null) {
this.rubric.canSubmitCallback($.proxy(view.peerSubmitEnabled, view));
}
sel.find("#peer-assessment--001__assessment__submit").click(function(eventObject) {
eventObject.preventDefault();
if (!isContinuedAssessment) {
view.peerAssess();
} else {
view.continuedPeerAssess();
}
});
},
peerSubmitEnabled: function(enabled) {
var button = $("#peer-assessment--001__assessment__submit", this.element);
if (typeof enabled === "undefined") {
return !button.hasClass("is--disabled");
} else {
button.toggleClass("is--disabled", !enabled);
}
},
peerAssess: function() {
var view = this;
var baseView = view.baseView;
this.peerAssessRequest(function() {
view.load();
baseView.loadAssessmentModules();
baseView.scrollToTop();
});
},
continuedPeerAssess: function() {
var view = this;
var gradeView = this.baseView.gradeView;
var baseView = view.baseView;
view.peerAssessRequest(function() {
view.loadContinuedAssessment();
gradeView.load();
baseView.scrollToTop();
});
},
peerAssessRequest: function(successFunction) {
var view = this;
view.baseView.toggleActionError("peer", null);
view.peerSubmitEnabled(false);
this.server.peerAssess(this.rubric.optionsSelected(), this.rubric.criterionFeedback(), this.overallFeedback()).done(successFunction).fail(function(errMsg) {
view.baseView.toggleActionError("peer", errMsg);
view.peerSubmitEnabled(true);
});
},
overallFeedback: function(overallFeedback) {
var selector = "#assessment__rubric__question--feedback__value";
if (typeof overallFeedback === "undefined") {
return $(selector, this.element).val();
} else {
$(selector, this.element).val(overallFeedback);
}
}
};
OpenAssessment.ResponseView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
this.savedResponse = "";
this.lastChangeTime = Date.now();
this.errorOnLastSave = false;
this.autoSaveTimerId = null;
};
OpenAssessment.ResponseView.prototype = {
AUTO_SAVE_POLL_INTERVAL: 2e3,
AUTO_SAVE_WAIT: 3e4,
load: function() {
var view = this;
this.server.render("submission").done(function(html) {
$("#openassessment__response", view.element).replaceWith(html);
view.installHandlers();
view.setAutoSaveEnabled(true);
}).fail(function(errMsg) {
view.baseView.showLoadError("response");
});
},
installHandlers: function() {
var sel = $("#openassessment__response", this.element);
var view = this;
this.baseView.setUpCollapseExpand(sel);
this.savedResponse = this.response();
var handleChange = function(eventData) {
view.handleResponseChanged();
};
sel.find("#submission__answer__value").on("change keyup drop paste", handleChange);
sel.find("#step--response__submit").click(function(eventObject) {
eventObject.preventDefault();
view.submit();
});
sel.find("#submission__save").click(function(eventObject) {
eventObject.preventDefault();
view.save();
});
},
setAutoSaveEnabled: function(enabled) {
if (enabled) {
if (this.autoSaveTimerId === null) {
this.autoSaveTimerId = setInterval($.proxy(this.autoSave, this), this.AUTO_SAVE_POLL_INTERVAL);
}
} else {
if (this.autoSaveTimerId !== null) {
clearInterval(this.autoSaveTimerId);
}
}
},
submitEnabled: function(enabled) {
var sel = $("#step--response__submit", this.element);
if (typeof enabled === "undefined") {
return !sel.hasClass("is--disabled");
} else {
sel.toggleClass("is--disabled", !enabled);
}
},
saveEnabled: function(enabled) {
var sel = $("#submission__save", this.element);
if (typeof enabled === "undefined") {
return !sel.hasClass("is--disabled");
} else {
sel.toggleClass("is--disabled", !enabled);
}
},
saveStatus: function(msg) {
var sel = $("#response__save_status h3", this.element);
if (typeof msg === "undefined") {
return sel.text();
} else {
var label = gettext("Status of Your Response");
sel.html('<span class="sr">' + label + ":" + "</span>\n" + msg);
}
},
unsavedWarningEnabled: function(enabled) {
if (typeof enabled === "undefined") {
return window.onbeforeunload !== null;
} else {
if (enabled) {
window.onbeforeunload = function() {
return gettext("If you leave this page without saving or submitting your response, you'll lose any work you've done on the response.");
};
} else {
window.onbeforeunload = null;
}
}
},
response: function(text) {
var sel = $("#submission__answer__value", this.element);
if (typeof text === "undefined") {
return sel.val();
} else {
sel.val(text);
}
},
responseChanged: function() {
var currentResponse = $.trim(this.response());
var savedResponse = $.trim(this.savedResponse);
return savedResponse !== currentResponse;
},
autoSave: function() {
var timeSinceLastChange = Date.now() - this.lastChangeTime;
if (this.responseChanged() && timeSinceLastChange > this.AUTO_SAVE_WAIT && !this.errorOnLastSave) {
this.save();
}
},
handleResponseChanged: function() {
var isBlank = $.trim(this.response()) !== "";
this.submitEnabled(isBlank);
if (this.responseChanged()) {
this.saveEnabled(isBlank);
this.saveStatus(gettext("This response has not been saved."));
this.unsavedWarningEnabled(true);
}
this.lastChangeTime = Date.now();
},
save: function() {
this.errorOnLastSave = false;
this.saveStatus(gettext("Saving..."));
this.baseView.toggleActionError("save", null);
this.unsavedWarningEnabled(false);
var view = this;
var savedResponse = this.response();
this.server.save(savedResponse).done(function() {
view.savedResponse = savedResponse;
var currentResponse = view.response();
view.submitEnabled(currentResponse !== "");
if (currentResponse == savedResponse) {
view.saveEnabled(false);
view.saveStatus(gettext("This response has been saved but not submitted."));
}
}).fail(function(errMsg) {
view.saveStatus(gettext("Error"));
view.baseView.toggleActionError("save", errMsg);
view.errorOnLastSave = true;
});
},
submit: function() {
this.submitEnabled(false);
var view = this;
var baseView = this.baseView;
this.confirmSubmission().pipe(function() {
var submission = $("#submission__answer__value", view.element).val();
baseView.toggleActionError("response", null);
return view.server.submit(submission);
}).done($.proxy(view.moveToNextStep, view)).fail(function(errCode, errMsg) {
if (errCode == "ENOMULTI") {
view.moveToNextStep();
} else {
if (errMsg) {
baseView.toggleActionError("submit", errMsg);
}
view.submitEnabled(true);
}
});
},
moveToNextStep: function() {
this.load();
this.baseView.loadAssessmentModules();
this.unsavedWarningEnabled(false);
},
confirmSubmission: function() {
var msg = "You're about to submit your response for this assignment. " + "After you submit this response, you can't change it or submit a new response.";
return $.Deferred(function(defer) {
if (confirm(msg)) {
defer.resolve();
} else {
defer.reject();
}
});
}
};
OpenAssessment.Rubric = function(element) {
this.element = element;
};
OpenAssessment.Rubric.prototype = {
criterionFeedback: function(criterionFeedback) {
var selector = "textarea.answer__value";
var feedback = {};
$(selector, this.element).each(function(index, sel) {
if (typeof criterionFeedback !== "undefined") {
$(sel).val(criterionFeedback[sel.name]);
feedback[sel.name] = criterionFeedback[sel.name];
} else {
feedback[sel.name] = $(sel).val();
}
});
return feedback;
},
optionsSelected: function(optionsSelected) {
var selector = "input[type=radio]";
if (typeof optionsSelected === "undefined") {
var options = {};
$(selector + ":checked", this.element).each(function(index, sel) {
options[sel.name] = sel.value;
});
return options;
} else {
$(selector, this.element).prop("checked", false);
$(selector, this.element).each(function(index, sel) {
if (optionsSelected.hasOwnProperty(sel.name)) {
if (sel.value == optionsSelected[sel.name]) {
$(sel).prop("checked", true);
}
}
});
}
},
canSubmitCallback: function(callback) {
$(this.element).change(function() {
var numChecked = $("input[type=radio]:checked", this).length;
var numAvailable = $(".field--radio.assessment__rubric__question", this).length;
var canSubmit = numChecked == numAvailable;
callback(canSubmit);
});
},
showCorrections: function(corrections) {
var selector = "input[type=radio]";
var hasErrors = false;
$(selector, this.element).each(function(index, sel) {
var listItem = $(sel).parents(".assessment__rubric__question");
if (corrections.hasOwnProperty(sel.name)) {
hasErrors = true;
listItem.find(".message--incorrect").removeClass("is--hidden");
listItem.find(".message--correct").addClass("is--hidden");
} else {
listItem.find(".message--correct").removeClass("is--hidden");
listItem.find(".message--incorrect").addClass("is--hidden");
}
});
return hasErrors;
}
};
OpenAssessment.SelfView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
this.rubric = null;
};
OpenAssessment.SelfView.prototype = {
load: function() {
var view = this;
this.server.render("self_assessment").done(function(html) {
$("#openassessment__self-assessment", view.element).replaceWith(html);
view.installHandlers();
}).fail(function(errMsg) {
view.showLoadError("self-assessment");
});
},
installHandlers: function() {
var view = this;
var sel = $("#openassessment__self-assessment", view.element);
this.baseView.setUpCollapseExpand(sel);
var rubricSelector = $("#self-assessment--001__assessment", this.element);
if (rubricSelector.size() > 0) {
var rubricElement = rubricSelector.get(0);
this.rubric = new OpenAssessment.Rubric(rubricElement);
}
if (this.rubric !== null) {
this.rubric.canSubmitCallback($.proxy(this.selfSubmitEnabled, this));
}
sel.find("#self-assessment--001__assessment__submit").click(function(eventObject) {
eventObject.preventDefault();
view.selfAssess();
});
},
selfSubmitEnabled: function(enabled) {
var button = $("#self-assessment--001__assessment__submit", this.element);
if (typeof enabled === "undefined") {
return !button.hasClass("is--disabled");
} else {
button.toggleClass("is--disabled", !enabled);
}
},
selfAssess: function() {
var view = this;
var baseView = this.baseView;
baseView.toggleActionError("self", null);
view.selfSubmitEnabled(false);
var options = this.rubric.optionsSelected();
this.server.selfAssess(options).done(function() {
baseView.loadAssessmentModules();
baseView.scrollToTop();
}).fail(function(errMsg) {
baseView.toggleActionError("self", errMsg);
view.selfSubmitEnabled(true);
});
}
};
OpenAssessment.Server = function(runtime, element) {
this.runtime = runtime;
this.element = element;
};
OpenAssessment.Server.prototype = {
url: function(handler) {
return this.runtime.handlerUrl(this.element, handler);
},
render: function(component) {
var url = this.url("render_" + component);
return $.Deferred(function(defer) {
$.ajax({
url: url,
type: "POST",
dataType: "html"
}).done(function(data) {
defer.resolveWith(this, [ data ]);
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This section could not be loaded.") ]);
});
}).promise();
},
renderContinuedPeer: function() {
var url = this.url("render_peer_assessment");
return $.Deferred(function(defer) {
$.ajax({
url: url,
type: "POST",
dataType: "html",
data: {
continue_grading: true
}
}).done(function(data) {
defer.resolveWith(this, [ data ]);
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This section could not be loaded.") ]);
});
}).promise();
},
studentInfo: function(student_id) {
var url = this.url("render_student_info");
return $.Deferred(function(defer) {
$.ajax({
url: url,
type: "POST",
dataType: "html",
data: {
student_id: student_id
}
}).done(function(data) {
defer.resolveWith(this, [ data ]);
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This section could not be loaded.") ]);
});
}).promise();
},
submit: function(submission) {
var url = this.url("submit");
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: JSON.stringify({
submission: submission
})
}).done(function(data) {
var success = data[0];
if (success) {
var studentId = data[1];
var attemptNum = data[2];
defer.resolveWith(this, [ studentId, attemptNum ]);
} else {
var errorNum = data[1];
var errorMsg = data[2];
defer.rejectWith(this, [ errorNum, errorMsg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ "AJAX", gettext("This response could not be submitted.") ]);
});
}).promise();
},
save: function(submission) {
var url = this.url("save_submission");
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: JSON.stringify({
submission: submission
})
}).done(function(data) {
if (data.success) {
defer.resolve();
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This response could not be saved.") ]);
});
}).promise();
},
submitFeedbackOnAssessment: function(text, options) {
var url = this.url("submit_feedback");
var payload = JSON.stringify({
feedback_text: text,
feedback_options: options
});
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolve();
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This feedback could not be submitted.") ]);
});
}).promise();
},
peerAssess: function(optionsSelected, criterionFeedback, overallFeedback) {
var url = this.url("peer_assess");
var payload = JSON.stringify({
options_selected: optionsSelected,
criterion_feedback: criterionFeedback,
overall_feedback: overallFeedback
});
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolve();
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This assessment could not be submitted.") ]);
});
}).promise();
},
selfAssess: function(optionsSelected) {
var url = this.url("self_assess");
var payload = JSON.stringify({
options_selected: optionsSelected
});
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolve();
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This assessment could not be submitted.") ]);
});
});
},
trainingAssess: function(optionsSelected) {
var url = this.url("training_assess");
var payload = JSON.stringify({
options_selected: optionsSelected
});
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolveWith(this, [ data.corrections ]);
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This assessment could not be submitted.") ]);
});
});
},
scheduleTraining: function() {
var url = this.url("schedule_training");
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: '""'
}).done(function(data) {
if (data.success) {
defer.resolveWith(this, [ data.msg ]);
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This assessment could not be submitted.") ]);
});
});
},
rescheduleUnfinishedTasks: function() {
var url = this.url("reschedule_unfinished_tasks");
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: '""'
}).done(function(data) {
if (data.success) {
defer.resolveWith(this, [ data.msg ]);
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("One or more rescheduling tasks failed.") ]);
});
});
},
updateEditorContext: function(kwargs) {
var url = this.url("update_editor_context");
var payload = JSON.stringify({
prompt: kwargs.prompt,
feedback_prompt: kwargs.feedbackPrompt,
title: kwargs.title,
submission_start: kwargs.submissionStart,
submission_due: kwargs.submissionDue,
criteria: kwargs.criteria,
assessments: kwargs.assessments
});
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolve();
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("This problem could not be saved.") ]);
});
}).promise();
},
checkReleased: function() {
var url = this.url("check_released");
var payload = '""';
return $.Deferred(function(defer) {
$.ajax({
type: "POST",
url: url,
data: payload
}).done(function(data) {
if (data.success) {
defer.resolveWith(this, [ data.is_released ]);
} else {
defer.rejectWith(this, [ data.msg ]);
}
}).fail(function(data) {
defer.rejectWith(this, [ gettext("The server could not be contacted.") ]);
});
}).promise();
}
};
OpenAssessment.StaffInfoView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
};
OpenAssessment.StaffInfoView.prototype = {
load: function() {
var view = this;
if ($("#openassessment__staff-info", view.element).length > 0) {
this.server.render("staff_info").done(function(html) {
$("#openassessment__staff-info", view.element).replaceWith(html);
view.installHandlers();
}).fail(function(errMsg) {
view.baseView.showLoadError("staff_info");
});
}
},
loadStudentInfo: function() {
var view = this;
var sel = $("#openassessment__staff-info", this.element);
var student_id = sel.find("#openassessment__student_id").val();
this.server.studentInfo(student_id).done(function(html) {
$("#openassessment__student-info", view.element).replaceWith(html);
}).fail(function(errMsg) {
view.showLoadError("student_info");
});
},
installHandlers: function() {
var sel = $("#openassessment__staff-info", this.element);
var view = this;
if (sel.length <= 0) {
return;
}
this.baseView.setUpCollapseExpand(sel, function() {});
sel.find("#openassessment_student_info_form").submit(function(eventObject) {
eventObject.preventDefault();
view.loadStudentInfo();
});
sel.find("#submit_student_id").click(function(eventObject) {
eventObject.preventDefault();
view.loadStudentInfo();
});
sel.find("#schedule_training").click(function(eventObject) {
eventObject.preventDefault();
view.scheduleTraining();
});
sel.find("#reschedule_unfinished_tasks").click(function(eventObject) {
eventObject.preventDefault();
view.rescheduleUnfinishedTasks();
});
},
scheduleTraining: function() {
var view = this;
this.server.scheduleTraining().done(function(msg) {
$("#schedule_training_message", this.element).text(msg);
}).fail(function(errMsg) {
$("#schedule_training_message", this.element).text(errMsg);
});
},
rescheduleUnfinishedTasks: function() {
var view = this;
this.server.rescheduleUnfinishedTasks().done(function(msg) {
$("#reschedule_unfinished_tasks_message", this.element).text(msg);
}).fail(function(errMsg) {
$("#reschedule_unfinished_tasks_message", this.element).text(errMsg);
});
}
};
OpenAssessment.StudentTrainingView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
this.rubric = null;
};
OpenAssessment.StudentTrainingView.prototype = {
load: function() {
var view = this;
this.server.render("student_training").done(function(html) {
$("#openassessment__student-training", view.element).replaceWith(html);
view.installHandlers();
}).fail(function(errMsg) {
view.baseView.showLoadError("student-training");
});
},
installHandlers: function() {
var sel = $("#openassessment__student-training", this.element);
var view = this;
this.baseView.setUpCollapseExpand(sel);
var rubricSelector = $("#student-training--001__assessment", this.element);
if (rubricSelector.size() > 0) {
var rubricElement = rubricSelector.get(0);
this.rubric = new OpenAssessment.Rubric(rubricElement);
}
if (this.rubric !== null) {
this.rubric.canSubmitCallback($.proxy(this.assessButtonEnabled, this));
}
sel.find("#student-training--001__assessment__submit").click(function(eventObject) {
eventObject.preventDefault();
view.assess();
});
},
assess: function() {
this.assessButtonEnabled(false);
var options = {};
if (this.rubric !== null) {
options = this.rubric.optionsSelected();
}
var view = this;
var baseView = this.baseView;
this.server.trainingAssess(options).done(function(corrections) {
var incorrect = $("#openassessment__student-training--incorrect", this.element);
var instructions = $("#openassessment__student-training--instructions", this.element);
if (!view.rubric.showCorrections(corrections)) {
view.load();
baseView.loadAssessmentModules();
incorrect.addClass("is--hidden");
instructions.removeClass("is--hidden");
} else {
instructions.addClass("is--hidden");
incorrect.removeClass("is--hidden");
}
baseView.scrollToTop();
}).fail(function(errMsg) {
baseView.toggleActionError("student-training", errMsg);
view.assessButtonEnabled(true);
});
},
assessButtonEnabled: function(isEnabled) {
var button = $("#student-training--001__assessment__submit", this.element);
if (typeof isEnabled === "undefined") {
return !button.hasClass("is--disabled");
} else {
button.toggleClass("is--disabled", !isEnabled);
}
}
};
\ No newline at end of file
if (typeof OpenAssessment == "undefined" || !OpenAssessment) { if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}if(typeof OpenAssessment.Server=="undefined"||!OpenAssessment.Server){OpenAssessment.Server=function(runtime,element){this.runtime=runtime;this.element=element};OpenAssessment.Server.prototype={url:function(handler){return this.runtime.handlerUrl(this.element,handler)},render:function(component){var url=this.url("render_"+component);return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html"}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},renderContinuedPeer:function(){var url=this.url("render_peer_assessment");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html",data:{continue_grading:true}}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},studentInfo:function(student_id){var url=this.url("render_student_info");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html",data:{student_id:student_id}}).done(function(data){defer.resolveWith(this,[data])}).fail(function(data){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},submit:function(submission){var url=this.url("submit");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({submission:submission})}).done(function(data){var success=data[0];if(success){var studentId=data[1];var attemptNum=data[2];defer.resolveWith(this,[studentId,attemptNum])}else{var errorNum=data[1];var errorMsg=data[2];defer.rejectWith(this,[errorNum,errorMsg])}}).fail(function(data){defer.rejectWith(this,["AJAX",gettext("This response could not be submitted.")])})}).promise()},save:function(submission){var url=this.url("save_submission");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({submission:submission})}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This response could not be saved.")])})}).promise()},submitFeedbackOnAssessment:function(text,options){var url=this.url("submit_feedback");var payload=JSON.stringify({feedback_text:text,feedback_options:options});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This feedback could not be submitted.")])})}).promise()},peerAssess:function(optionsSelected,criterionFeedback,overallFeedback){var url=this.url("peer_assess");var payload=JSON.stringify({options_selected:optionsSelected,criterion_feedback:criterionFeedback,overall_feedback:overallFeedback});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})}).promise()},selfAssess:function(optionsSelected){var url=this.url("self_assess");var payload=JSON.stringify({options_selected:optionsSelected});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},trainingAssess:function(optionsSelected){var url=this.url("training_assess");var payload=JSON.stringify({options_selected:optionsSelected});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolveWith(this,[data.corrections])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},scheduleTraining:function(){var url=this.url("schedule_training");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})})},rescheduleUnfinishedTasks:function(){var url=this.url("reschedule_unfinished_tasks");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("One or more rescheduling tasks failed.")])})})},updateEditorContext:function(kwargs){var url=this.url("update_editor_context");var payload=JSON.stringify({prompt:kwargs.prompt,feedback_prompt:kwargs.feedbackPrompt,title:kwargs.title,submission_start:kwargs.submissionStart,submission_due:kwargs.submissionDue,criteria:kwargs.criteria,assessments:kwargs.assessments});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This problem could not be saved.")])})}).promise()},checkReleased:function(){var url=this.url("check_released");var payload='""';return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload}).done(function(data){if(data.success){defer.resolveWith(this,[data.is_released])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("The server could not be contacted.")])})}).promise()}}}if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}OpenAssessment.StudioView=function(runtime,element,server){this.element=element;this.runtime=runtime;this.server=server;this.fixModalHeight();$(".openassessment_editor_content_and_tabs",this.element).tabs();this.promptView=new OpenAssessment.EditPromptView($("#oa_prompt_editor_wrapper",this.element).get(0));var studentTrainingView=new OpenAssessment.EditStudentTrainingView($("#oa_student_training_editor",this.element).get(0));var peerAssessmentView=new OpenAssessment.EditPeerAssessmentView($("#oa_peer_assessment_editor",this.element).get(0));var selfAssessmentView=new OpenAssessment.EditSelfAssessmentView($("#oa_self_assessment_editor",this.element).get(0));var exampleBasedAssessmentView=new OpenAssessment.EditExampleBasedAssessmentView($("#oa_ai_assessment_editor",this.element).get(0));var assessmentLookupDictionary={};assessmentLookupDictionary[studentTrainingView.getID()]=studentTrainingView;assessmentLookupDictionary[peerAssessmentView.getID()]=peerAssessmentView;assessmentLookupDictionary[selfAssessmentView.getID()]=selfAssessmentView;assessmentLookupDictionary[exampleBasedAssessmentView.getID()]=exampleBasedAssessmentView;this.settingsView=new OpenAssessment.EditSettingsView($("#oa_basic_settings_editor",this.element).get(0),assessmentLookupDictionary);this.rubricView=new OpenAssessment.EditRubricView($("#oa_rubric_editor_wrapper",this.element).get(0));$(".openassessment_save_button",this.element).click($.proxy(this.save,this));$(".openassessment_cancel_button",this.element).click($.proxy(this.cancel,this));this.initializeSortableAssessments()};OpenAssessment.StudioView.prototype={fixModalHeight:function(){$(this.element).addClass("openassessment_full_height").parentsUntil(".modal-window").addClass("openassessment_full_height");$(this.element).closest(".modal-window").addClass("openassessment_modal_window")},initializeSortableAssessments:function(){var view=this;$("#openassessment_assessment_module_settings_editors",view.element).sortable({start:function(event,ui){$(".openassessment_assessment_module_editor",view.element).hide();var targetHeight="auto";ui.placeholder.height(targetHeight);ui.helper.height(targetHeight);$("#openassessment_assessment_module_settings_editors",view.element).sortable("refresh").sortable("refreshPositions")},stop:function(event,ui){$(".openassessment_assessment_module_editor",view.element).show()},snap:true,axis:"y",handle:".drag-handle",cursorAt:{top:20}});$("#openassessment_assessment_module_settings_editors",view.element).disableSelection()},save:function(){var view=this;this.server.checkReleased().done(function(isReleased){if(isReleased){view.confirmPostReleaseUpdate($.proxy(view.updateEditorContext,view))}else{view.updateEditorContext()}}).fail(function(errMsg){view.showError(errMsg)})},confirmPostReleaseUpdate:function(onConfirm){var msg=gettext("This problem has already been released. Any changes will apply only to future assessments.");if(confirm(msg)){onConfirm()}},updateEditorContext:function(){this.runtime.notify("save",{state:"start"});var view=this;this.server.updateEditorContext({prompt:view.promptView.promptText(),feedbackPrompt:view.rubricView.feedbackPrompt(),criteria:view.rubricView.criteriaDefinition(),title:view.settingsView.displayName(),submissionStart:view.settingsView.submissionStart(),submissionDue:view.settingsView.submissionDue(),assessments:view.settingsView.assessmentsDescription()}).done(function(){view.runtime.notify("save",{state:"end"})}).fail(function(msg){view.showError(msg)})},cancel:function(){this.runtime.notify("cancel",{})},showError:function(errorMsg){this.runtime.notify("error",{msg:errorMsg})}};function OpenAssessmentEditor(runtime,element){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.StudioView(runtime,element,server)}OpenAssessment.ToggleControl=function(element,hiddenSelector,shownSelector){this.element=element;this.hiddenSelector=hiddenSelector;this.shownSelector=shownSelector};OpenAssessment.ToggleControl.prototype={install:function(checkboxSelector){$(checkboxSelector,this.element).change(this,function(event){var control=event.data;if(this.checked){control.show()}else{control.hide()}});return this},show:function(){$(this.hiddenSelector,this.element).fadeOut("fast");$(this.shownSelector,this.element).fadeIn()},hide:function(){$(this.hiddenSelector,this.element).fadeIn();$(this.shownSelector,this.element).fadeOut()}};OpenAssessment.EditPeerAssessmentView=function(element){this.element=element;this.name="peer-assessment";new OpenAssessment.ToggleControl(this.element,"#peer_assessment_description_closed","#peer_assessment_settings_editor").install("#include_peer_assessment")};OpenAssessment.EditPeerAssessmentView.prototype={description:function(){return{must_grade:this.mustGradeNum(),must_be_graded_by:this.mustBeGradedByNum(),start:this.startDatetime(),due:this.dueDatetime()}},isEnabled:function(isEnabled){var sel=$("#include_peer_assessment",this.element);return OpenAssessment.Fields.booleanField(sel,isEnabled)},mustGradeNum:function(num){var sel=$("#peer_assessment_must_grade",this.element);return OpenAssessment.Fields.intField(sel,num)},mustBeGradedByNum:function(num){var sel=$("#peer_assessment_graded_by",this.element);return OpenAssessment.Fields.intField(sel,num)},startDatetime:function(datetime){var sel=$("#peer_assessment_start_date",this.element);return OpenAssessment.Fields.datetimeField(sel,datetime)},dueDatetime:function(datetime){var sel=$("#peer_assessment_due_date",this.element);return OpenAssessment.Fields.datetimeField(sel,datetime)},getID:function(){return $(this.element).attr("id")}};OpenAssessment.EditSelfAssessmentView=function(element){this.element=element;this.name="self-assessment";new OpenAssessment.ToggleControl(this.element,"#self_assessment_description_closed","#self_assessment_settings_editor").install("#include_self_assessment")};OpenAssessment.EditSelfAssessmentView.prototype={description:function(){return{start:this.startDatetime(),due:this.dueDatetime()}},isEnabled:function(isEnabled){var sel=$("#include_self_assessment",this.element);return OpenAssessment.Fields.booleanField(sel,isEnabled)},startDatetime:function(datetime){var sel=$("#self_assessment_start_date",this.element);return OpenAssessment.Fields.datetimeField(sel,datetime)},dueDatetime:function(datetime){var sel=$("#self_assessment_due_date",this.element);return OpenAssessment.Fields.datetimeField(sel,datetime)},getID:function(){return $(this.element).attr("id")}};OpenAssessment.EditStudentTrainingView=function(element){this.element=element;this.name="student-training";new OpenAssessment.ToggleControl(this.element,"#student_training_description_closed","#student_training_settings_editor").install("#include_student_training")};OpenAssessment.EditStudentTrainingView.prototype={description:function(){return{examples:this.exampleDefinitions()}},isEnabled:function(isEnabled){var sel=$("#include_student_training",this.element);return OpenAssessment.Fields.booleanField(sel,isEnabled)},exampleDefinitions:function(xml){var sel=$("#student_training_examples",this.element);return OpenAssessment.Fields.stringField(sel,xml)},getID:function(){return $(this.element).attr("id")}};OpenAssessment.EditExampleBasedAssessmentView=function(element){this.element=element;this.name="example-based-assessment";new OpenAssessment.ToggleControl(this.element,"#ai_assessment_description_closed","#ai_assessment_settings_editor").install("#include_ai_assessment")};OpenAssessment.EditExampleBasedAssessmentView.prototype={description:function(){return{examples:this.exampleDefinitions()}},isEnabled:function(isEnabled){var sel=$("#include_ai_assessment",this.element);return OpenAssessment.Fields.booleanField(sel,isEnabled)},exampleDefinitions:function(xml){var sel=$("#ai_training_examples",this.element);return OpenAssessment.Fields.stringField(sel,xml)},getID:function(){return $(this.element).attr("id")}};OpenAssessment.Fields={stringField:function(sel,value){if(typeof value!=="undefined"){sel.val(value)}return sel.val()},datetimeField:function(sel,value){if(typeof value!=="undefined"){sel.val(value)}var fieldValue=sel.val();return fieldValue!==""?fieldValue:null},intField:function(sel,value){if(typeof value!=="undefined"){sel.val(value)}return parseInt(sel.val(),10)},booleanField:function(sel,value){if(typeof value!=="undefined"){sel.prop("checked",value)}return sel.prop("checked")}};OpenAssessment.EditPromptView=function(element){this.element=element};OpenAssessment.EditPromptView.prototype={promptText:function(text){var sel=$("#openassessment_prompt_editor",this.element);return OpenAssessment.Fields.stringField(sel,text)}};OpenAssessment.EditRubricView=function(element){this.element=element;this.criteriaContainer=new OpenAssessment.Container(OpenAssessment.RubricCriterion,{containerElement:$("#openassessment_criterion_list",this.element).get(0),templateElement:$("#openassessment_criterion_template",this.element).get(0),addButtonElement:$("#openassessment_rubric_add_criterion",this.element).get(0),removeButtonClass:"openassessment_rubric_remove_button",containerItemClass:"openassessment_criterion"})};OpenAssessment.EditRubricView.prototype={criteriaDefinition:function(){var criteria=this.criteriaContainer.getItemValues();for(var criterion_idx=0;criterion_idx<criteria.length;criterion_idx++){var criterion=criteria[criterion_idx];criterion.order_num=criterion_idx;for(var option_idx=0;option_idx<criterion.options.length;option_idx++){var option=criterion.options[option_idx];option.order_num=option_idx}}return criteria},feedbackPrompt:function(text){var sel=$("#openassessment_rubric_feedback",this.element);return OpenAssessment.Fields.stringField(sel,text)}};OpenAssessment.EditSettingsView=function(element,assessmentViews){this.settingsElement=element;this.assessmentsElement=$(element).siblings("#openassessment_assessment_module_settings_editors").get(0);this.assessmentViews=assessmentViews};OpenAssessment.EditSettingsView.prototype={displayName:function(name){var sel=$("#openassessment_title_editor",this.settingsElement);return OpenAssessment.Fields.stringField(sel,name)},submissionStart:function(datetime){var sel=$("#openassessment_submission_start_editor",this.settingsElement);return OpenAssessment.Fields.datetimeField(sel,datetime)},submissionDue:function(datetime){var sel=$("#openassessment_submission_start_editor",this.settingsElement);return OpenAssessment.Fields.datetimeField(sel,datetime)},imageSubmissionEnabled:function(isEnabled){var sel=$("#openassessment_submission_image_editor",this.settingsElement);if(typeof isEnabled!=="undefined"){if(isEnabled){sel.val(1)}else{sel.val(0)}}return sel.val()==1},assessmentsDescription:function(){var assessmentDescList=[];var view=this;$(".openassessment_assessment_module_settings_editor",this.assessmentsElement).each(function(){var asmntView=view.assessmentViews[$(this).attr("id")];if(asmntView.isEnabled()){var description=asmntView.description();description["name"]=asmntView.name;assessmentDescList.push(description)}});return assessmentDescList}};
OpenAssessment = {}; \ No newline at end of file
}
if (typeof window.gettext === "undefined") {
window.gettext = function(text) {
return text;
};
}
OpenAssessment.StudioView = function(runtime, element, server) {
this.element = element;
this.runtime = runtime;
this.server = server;
this.fixModalHeight();
$(".openassessment_editor_content_and_tabs", this.element).tabs();
this.promptView = new OpenAssessment.EditPromptView($("#oa_prompt_editor_wrapper", this.element).get(0));
var studentTrainingView = new OpenAssessment.EditStudentTrainingView($("#oa_student_training_editor", this.element).get(0));
var peerAssessmentView = new OpenAssessment.EditPeerAssessmentView($("#oa_peer_assessment_editor", this.element).get(0));
var selfAssessmentView = new OpenAssessment.EditSelfAssessmentView($("#oa_self_assessment_editor", this.element).get(0));
var exampleBasedAssessmentView = new OpenAssessment.EditExampleBasedAssessmentView($("#oa_ai_assessment_editor", this.element).get(0));
var assessmentLookupDictionary = {};
assessmentLookupDictionary[studentTrainingView.getID()] = studentTrainingView;
assessmentLookupDictionary[peerAssessmentView.getID()] = peerAssessmentView;
assessmentLookupDictionary[selfAssessmentView.getID()] = selfAssessmentView;
assessmentLookupDictionary[exampleBasedAssessmentView.getID()] = exampleBasedAssessmentView;
this.settingsView = new OpenAssessment.EditSettingsView($("#oa_basic_settings_editor", this.element).get(0), assessmentLookupDictionary);
this.rubricView = new OpenAssessment.EditRubricView($("#oa_rubric_editor_wrapper", this.element).get(0));
$(".openassessment_save_button", this.element).click($.proxy(this.save, this));
$(".openassessment_cancel_button", this.element).click($.proxy(this.cancel, this));
this.initializeSortableAssessments();
};
OpenAssessment.StudioView.prototype = {
fixModalHeight: function() {
$(this.element).addClass("openassessment_full_height").parentsUntil(".modal-window").addClass("openassessment_full_height");
$(this.element).closest(".modal-window").addClass("openassessment_modal_window");
},
initializeSortableAssessments: function() {
var liveElement = this.liveElement;
$("#openassessment_assessment_module_settings_editors", liveElement).sortable({
start: function(event, ui) {
$(".openassessment_assessment_module_editor", liveElement).hide();
var targetHeight = "auto";
ui.placeholder.height(targetHeight);
ui.helper.height(targetHeight);
$("#openassessment_assessment_module_settings_editors", liveElement).sortable("refresh").sortable("refreshPositions");
},
stop: function(event, ui) {
$(".openassessment_assessment_module_editor", liveElement).show();
},
snap: true,
axis: "y",
handle: ".drag-handle",
cursorAt: {
top: 20
}
});
$("#openassessment_assessment_module_settings_editors", liveElement).disableSelection();
},
save: function() {
var view = this;
this.server.checkReleased().done(function(isReleased) {
if (isReleased) {
view.confirmPostReleaseUpdate($.proxy(view.updateEditorContext, view));
} else {
view.updateEditorContext();
}
}).fail(function(errMsg) {
view.showError(errMsg);
});
},
confirmPostReleaseUpdate: function(onConfirm) {
var msg = gettext("This problem has already been released. Any changes will apply only to future assessments.");
if (confirm(msg)) {
onConfirm();
}
},
updateEditorContext: function() {
this.runtime.notify("save", {
state: "start"
});
var view = this;
this.server.updateEditorContext({
prompt: view.promptView.promptText(),
feedbackPrompt: view.rubricView.feedbackPrompt(),
criteria: view.rubricView.criteriaDefinition(),
title: view.settingsView.displayName(),
submissionStart: view.settingsView.submissionStart(),
submissionDue: view.settingsView.submissionDue(),
assessments: view.settingsView.assessmentsDescription()
}).done(function() {
view.runtime.notify("save", {
state: "end"
});
}).fail(function(msg) {
view.showError(msg);
});
},
cancel: function() {
this.runtime.notify("cancel", {});
},
showError: function(errorMsg) {
this.runtime.notify("error", {
msg: errorMsg
});
}
};
function OpenAssessmentEditor(runtime, element) {
var server = new OpenAssessment.Server(runtime, element);
var view = new OpenAssessment.StudioView(runtime, element, server);
}
OpenAssessment.ToggleControl = function(element, hiddenSelector, shownSelector) {
this.element = element;
this.hiddenSelector = hiddenSelector;
this.shownSelector = shownSelector;
};
OpenAssessment.ToggleControl.prototype = {
install: function(checkboxSelector) {
$(checkboxSelector, this.element).change(this, function(event) {
var control = event.data;
if (this.checked) {
control.show();
} else {
control.hide();
}
});
return this;
},
show: function() {
$(this.hiddenSelector, this.element).fadeOut("fast");
$(this.shownSelector, this.element).fadeIn();
},
hide: function() {
$(this.hiddenSelector, this.element).fadeIn();
$(this.shownSelector, this.element).fadeOut();
}
};
OpenAssessment.EditPeerAssessmentView = function(element) {
this.element = element;
this.name = "peer-assessment";
new OpenAssessment.ToggleControl(this.element, "#peer_assessment_description_closed", "#peer_assessment_settings_editor").install("#include_peer_assessment");
};
OpenAssessment.EditPeerAssessmentView.prototype = {
description: function() {
return {
must_grade: this.mustGradeNum(),
must_be_graded_by: this.mustBeGradedByNum(),
start: this.startDatetime(),
due: this.dueDatetime()
};
},
isEnabled: function(isEnabled) {
var sel = $("#include_peer_assessment", this.element);
return OpenAssessment.Fields.booleanField(sel, isEnabled);
},
mustGradeNum: function(num) {
var sel = $("#peer_assessment_must_grade", this.element);
return OpenAssessment.Fields.intField(sel, num);
},
mustBeGradedByNum: function(num) {
var sel = $("#peer_assessment_graded_by", this.element);
return OpenAssessment.Fields.intField(sel, num);
},
startDatetime: function(datetime) {
var sel = $("#peer_assessment_start_date", this.element);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
dueDatetime: function(datetime) {
var sel = $("#peer_assessment_due_date", this.element);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
getID: function() {
return $(this.element).attr("id");
}
};
OpenAssessment.EditSelfAssessmentView = function(element) {
this.element = element;
this.name = "self-assessment";
new OpenAssessment.ToggleControl(this.element, "#self_assessment_description_closed", "#self_assessment_settings_editor").install("#include_self_assessment");
};
OpenAssessment.EditSelfAssessmentView.prototype = {
description: function() {
return {
start: this.startDatetime(),
due: this.dueDatetime()
};
},
isEnabled: function(isEnabled) {
var sel = $("#include_self_assessment", this.element);
return OpenAssessment.Fields.booleanField(sel, isEnabled);
},
startDatetime: function(datetime) {
var sel = $("#self_assessment_start_date", this.element);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
dueDatetime: function(datetime) {
var sel = $("#self_assessment_due_date", this.element);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
getID: function() {
return $(this.element).attr("id");
}
};
OpenAssessment.EditStudentTrainingView = function(element) {
this.element = element;
this.name = "student-training";
new OpenAssessment.ToggleControl(this.element, "#student_training_description_closed", "#student_training_settings_editor").install("#include_student_training");
};
OpenAssessment.EditStudentTrainingView.prototype = {
description: function() {
return {
examples: this.exampleDefinitions()
};
},
isEnabled: function(isEnabled) {
var sel = $("#include_student_training", this.element);
return OpenAssessment.Fields.booleanField(sel, isEnabled);
},
exampleDefinitions: function(xml) {
var sel = $("#student_training_examples", this.element);
return OpenAssessment.Fields.stringField(sel, xml);
},
getID: function() {
return $(this.element).attr("id");
}
};
OpenAssessment.EditExampleBasedAssessmentView = function(element) {
this.element = element;
this.name = "example-based-assessment";
new OpenAssessment.ToggleControl(this.element, "#ai_assessment_description_closed", "#ai_assessment_settings_editor").install("#include_ai_assessment");
};
OpenAssessment.EditExampleBasedAssessmentView.prototype = {
description: function() {
return {
examples: this.exampleDefinitions()
};
},
isEnabled: function(isEnabled) {
var sel = $("#include_ai_assessment", this.element);
return OpenAssessment.Fields.booleanField(sel, isEnabled);
},
exampleDefinitions: function(xml) {
var sel = $("#ai_training_examples", this.element);
return OpenAssessment.Fields.stringField(sel, xml);
},
getID: function() {
return $(this.element).attr("id");
}
};
OpenAssessment.Fields = {
stringField: function(sel, value) {
if (typeof value !== "undefined") {
sel.val(value);
}
return sel.val();
},
datetimeField: function(sel, value) {
if (typeof value !== "undefined") {
sel.val(value);
}
var fieldValue = sel.val();
return fieldValue !== "" ? fieldValue : null;
},
intField: function(sel, value) {
if (typeof value !== "undefined") {
sel.val(value);
}
return parseInt(sel.val(), 10);
},
booleanField: function(sel, value) {
if (typeof value !== "undefined") {
sel.prop("checked", value);
}
return sel.prop("checked");
}
};
OpenAssessment.EditPromptView = function(element) {
this.element = element;
};
OpenAssessment.EditPromptView.prototype = {
promptText: function(text) {
var sel = $("#openassessment_prompt_editor", this.element);
return OpenAssessment.Fields.stringField(sel, text);
}
};
OpenAssessment.EditRubricView = function(element) {
this.element = element;
this.criteriaContainer = new OpenAssessment.Container(OpenAssessment.RubricCriterion, {
containerElement: $("#openassessment_criterion_list", this.element).get(0),
templateElement: $("#openassessment_criterion_template", this.element).get(0),
addButtonElement: $("#openassessment_rubric_add_criterion", this.element).get(0),
removeButtonClass: "openassessment_rubric_remove_button",
containerItemClass: "openassessment_criterion"
});
};
OpenAssessment.EditRubricView.prototype = {
criteriaDefinition: function() {
var criteria = this.criteriaContainer.getItemValues();
for (var criterion_idx = 0; criterion_idx < criteria.length; criterion_idx++) {
var criterion = criteria[criterion_idx];
criterion.order_num = criterion_idx;
for (var option_idx = 0; option_idx < criterion.options.length; option_idx++) {
var option = criterion.options[option_idx];
option.order_num = option_idx;
}
}
return criteria;
},
feedbackPrompt: function(text) {
var sel = $("#openassessment_rubric_feedback", this.element);
return OpenAssessment.Fields.stringField(sel, text);
}
};
OpenAssessment.EditSettingsView = function(element, assessmentViews) {
this.settingsElement = element;
this.assessmentsElement = $("#openassessment_assessment_module_settings_editors", $(element).closest("#oa_settings_editor_wrapper"));
this.assessmentViews = assessmentViews;
};
OpenAssessment.EditSettingsView.prototype = {
displayName: function(name) {
var sel = $("#openassessment_title_editor", this.settingsElement);
return OpenAssessment.Fields.stringField(sel, name);
},
submissionStart: function(datetime) {
var sel = $("#openassessment_submission_start_editor", this.settingsElement);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
submissionDue: function(datetime) {
var sel = $("#openassessment_submission_start_editor", this.settingsElement);
return OpenAssessment.Fields.datetimeField(sel, datetime);
},
imageSubmissionEnabled: function(isEnabled) {
var sel = $("#openassessment_submission_image_editor", this.settingsElement);
if (typeof isEnabled !== "undefined") {
if (isEnabled) {
sel.val(1);
} else {
sel.val(0);
}
}
return sel.val() == 1;
},
assessmentsDescription: function() {
var assessmentDescList = [];
var view = this;
$(".openassessment_assessment_module_settings_editor", this.assessmentsElement).each(function() {
var asmntView = view.assessmentViews[$(this).attr("id")];
if (asmntView.isEnabled()) {
var description = asmntView.description();
description["name"] = asmntView.name;
assessmentDescList.push(description);
}
});
return assessmentDescList;
}
};
\ No newline at end of file
...@@ -68,6 +68,11 @@ describe("OpenAssessment.EditSettingsView", function() { ...@@ -68,6 +68,11 @@ describe("OpenAssessment.EditSettingsView", function() {
}); });
it("builds a description of enabled assessments", function() { it("builds a description of enabled assessments", function() {
// In this test we also verify that the mechansim that reads off of the DOM is correct, in that it gets
// the right order of assessments, in addition to performing the correct calls. Note that this test's
// success depends on our Template having the original order (as it does in an unconfigured ORA problem)
// of TRAINING -> PEER -> SELF -> AI
// The Peer and Self Editor ID's // The Peer and Self Editor ID's
var peerID = "oa_peer_assessment_editor"; var peerID = "oa_peer_assessment_editor";
var selfID = "oa_self_assessment_editor"; var selfID = "oa_self_assessment_editor";
......
/** /**
Interface for server-side XBlock handlers. Encapsulate interactions with OpenAssessment XBlock handlers.
**/
// Since the server is included by both LMS and Studio views,
// skip loading it the second time.
if (typeof OpenAssessment.Server == "undefined" || !OpenAssessment.Server) {
/**
Interface for server-side XBlock handlers.
Args: Args:
runtime (Runtime): An XBlock runtime instance. runtime (Runtime): An XBlock runtime instance.
element (DOM element): The DOM element representing this XBlock. element (DOM element): The DOM element representing this XBlock.
Returns: Returns:
OpenAssessment.Server OpenAssessment.Server
**/ **/
OpenAssessment.Server = function(runtime, element) { OpenAssessment.Server = function(runtime, element) {
this.runtime = runtime; this.runtime = runtime;
this.element = element; this.element = element;
}; };
OpenAssessment.Server.prototype = { OpenAssessment.Server.prototype = {
/** /**
Construct the URL for the handler, specific to one instance of the XBlock on the page. Construct the URL for the handler, specific to one instance of the XBlock on the page.
...@@ -463,4 +471,5 @@ OpenAssessment.Server.prototype = { ...@@ -463,4 +471,5 @@ OpenAssessment.Server.prototype = {
}); });
}).promise(); }).promise();
} }
}; };
}
\ No newline at end of file
...@@ -85,33 +85,38 @@ OpenAssessment.StudioView.prototype = { ...@@ -85,33 +85,38 @@ OpenAssessment.StudioView.prototype = {
Installs click listeners which initialize drag and drop functionality for assessment modules. Installs click listeners which initialize drag and drop functionality for assessment modules.
**/ **/
initializeSortableAssessments: function () { initializeSortableAssessments: function () {
var liveElement = this.liveElement; var view = this;
// Initialize Drag and Drop of Assessment Modules // Initialize Drag and Drop of Assessment Modules
$('#openassessment_assessment_module_settings_editors', liveElement).sortable({ $('#openassessment_assessment_module_settings_editors', view.element).sortable({
// On Start, we want to collapse all draggable items so that dragging is visually simple (no scrolling) // On Start, we want to collapse all draggable items so that dragging is visually simple (no scrolling)
start: function(event, ui) { start: function(event, ui) {
// Hide all of the contents (not the headers) of the divs, to collapse during dragging. // Hide all of the contents (not the headers) of the divs, to collapse during dragging.
$('.openassessment_assessment_module_editor', liveElement).hide(); $('.openassessment_assessment_module_editor', view.element).hide();
// Because of the way that JQuery actively resizes elements during dragging (directly setting
// the style property), the only way to over come it is to use an important tag ( :( ), or
// to tell JQuery to set the height to be Automatic (i.e. resize to the minimum nescesary size.)
// Because all of the information we don't want displayed is now hidden, an auto height will
// perform the apparent "collapse" that we are looking for in the Placeholder and Helper.
var targetHeight = 'auto'; var targetHeight = 'auto';
// Shrink the blank area behind the dragged item. // Shrink the blank area behind the dragged item.
ui.placeholder.height(targetHeight); ui.placeholder.height(targetHeight);
// Shrink the dragged item itself. // Shrink the dragged item itself.
ui.helper.height(targetHeight); ui.helper.height(targetHeight);
// Update the sortable // Update the sortable to reflect these changes.
$('#openassessment_assessment_module_settings_editors', liveElement) $('#openassessment_assessment_module_settings_editors', view.element)
.sortable('refresh').sortable('refreshPositions'); .sortable('refresh').sortable('refreshPositions');
}, },
// On stop, we redisplay the divs to their original state // On stop, we redisplay the divs to their original state
stop: function(event, ui){ stop: function(event, ui){
$('.openassessment_assessment_module_editor', liveElement).show(); $('.openassessment_assessment_module_editor', view.element).show();
}, },
snap: true, snap: true,
axis: "y", axis: "y",
handle: ".drag-handle", handle: ".drag-handle",
cursorAt: {top: 20} cursorAt: {top: 20}
}); });
$('#openassessment_assessment_module_settings_editors', liveElement).disableSelection(); $('#openassessment_assessment_module_settings_editors', view.element).disableSelection();
}, },
/** /**
......
...@@ -11,8 +11,7 @@ Returns: ...@@ -11,8 +11,7 @@ Returns:
**/ **/
OpenAssessment.EditSettingsView = function(element, assessmentViews) { OpenAssessment.EditSettingsView = function(element, assessmentViews) {
this.settingsElement = element; this.settingsElement = element;
this.assessmentsElement = $('#openassessment_assessment_module_settings_editors', this.assessmentsElement = $(element).siblings('#openassessment_assessment_module_settings_editors').get(0);
$(element).closest('#oa_settings_editor_wrapper'));
this.assessmentViews = assessmentViews; this.assessmentViews = assessmentViews;
}; };
......
...@@ -19,5 +19,5 @@ if [[ -n "$DEBUG_JS" ]]; then ...@@ -19,5 +19,5 @@ if [[ -n "$DEBUG_JS" ]]; then
UGLIFY_EXTRA_ARGS="--beautify" UGLIFY_EXTRA_ARGS="--beautify"
fi fi
node_modules/.bin/uglifyjs $STATIC_JS/src/oa_shared.js $STATIC_JS/src/lms/*.js $UGLIFY_EXTRA_ARGS > "$STATIC_JS/openassessment-lms.min.js" node_modules/.bin/uglifyjs $STATIC_JS/src/oa_shared.js $STATIC_JS/src/*.js $STATIC_JS/src/lms/*.js $UGLIFY_EXTRA_ARGS > "$STATIC_JS/openassessment-lms.min.js"
node_modules/.bin/uglifyjs $STATIC_JS/src/oa_shared.js $STATIC_JS/src/studio/*.js $UGLIFY_EXTRA_ARGS > "$STATIC_JS/openassessment-studio.min.js" node_modules/.bin/uglifyjs $STATIC_JS/src/oa_shared.js $STATIC_JS/src/*.js $STATIC_JS/src/studio/*.js $UGLIFY_EXTRA_ARGS > "$STATIC_JS/openassessment-studio.min.js"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment