Commit 4dfa423b by Albert (AJ) St. Aubin Committed by GitHub

Merge pull request #962 from edx/aj/TNL-6243_announce_feedback

Added the SR feedback announcement and the describedby region for stu…
parents ea256307 70a563d8
......@@ -89,43 +89,41 @@
</button>
</div>
<div class="ui-slidable__content" aria-labelledby="oa_training_{{ xblock_id }}_criterion--{{ criterion.order_num }}" id="oa_training_{{ xblock_id }}_content_criterion--{{ criterion.order_num }}">
<div class="step__message message message--correct is--hidden">
<div id="training__assessment__rubric__correct__message--{{ criterion.order_num }}__{{ xblock_id }}" class="step__message message message--correct is--hidden">
<h5 class="message__title">{% trans "Selected Options Agree" %}</h5>
<div class="message__content">
<p>{% trans "The option you selected is the option that the instructor selected." %}</p>
</div>
</div>
<div class="step__message message message--incorrect is--hidden">
<div id="training__assessment__rubric__incorrect__message--{{ criterion.order_num }}__{{ xblock_id }}" class="step__message message message--incorrect is--hidden">
<h5 class="message__title">{% trans "Selected Options Differ" %}</h5>
<div class="message__content">
<p>{% trans "The option you selected is not the option that the instructor selected." %}</p>
</div>
</div>
<div class="question__answers">
<div role="group" aria-labelledby="training__assessment__rubric__prompt--{{ criterion.order_num }}__{{ xblock_id }}">
{% for option in criterion.options %}
<div class="answer">
<div class="wrapper--input">
<input type="radio"
data-criterion-name="{{ criterion.name }}"
id="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"
class="answer__value rubric_{{ criterion.order_num }}_{{ option.order_num }}"
value="{{ option.name }}"
name="training__assessment__rubric__question--{{ criterion.order_num }}"
aria-describedby="training__assessment__rubric__meta--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"/>
<label for="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"
class="answer__label">{{ option.label }}</label>
</div>
<div class="wrapper--metadata"
id="training__assessment__rubric__meta--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}">
<span class="answer__tip">{{ option.explanation }}</span>
<span class="answer__points">{{option.points}} <span class="answer__points__label">{% trans "points" %}</span></span>
</div>
<div class="question__answers" role="group" aria-labelledby="training__assessment__rubric__prompt--{{ criterion.order_num }}__{{ xblock_id }}">
{% for option in criterion.options %}
<div class="answer">
<div class="wrapper--input">
<input type="radio"
data-criterion-name="{{ criterion.name }}"
id="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"
class="answer__value rubric_{{ criterion.order_num }}_{{ option.order_num }}"
value="{{ option.name }}"
name="training__assessment__rubric__question--{{ criterion.order_num }}"
aria-describedby="training__assessment__rubric__meta--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"/>
<label for="training__assessment__rubric__question--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}"
class="answer__label">{{ option.label }}</label>
</div>
<div class="wrapper--metadata"
id="training__assessment__rubric__meta--{{ criterion.order_num }}__{{ option.order_num }}__{{ xblock_id }}">
<span class="answer__tip">{{ option.explanation }}</span>
<span class="answer__points">{{option.points}} <span class="answer__points__label">{% trans "points" %}</span></span>
</div>
{% endfor %}
</div>
{% endfor %}
</div>
</div>
</li>
......
if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}if(typeof window.ngetgext==="undefined"){window.ngettext=function(singularText,pluralText,n){if(n>1){return pluralText}else{return singularText}}}if(typeof window.Logger==="undefined"){window.Logger={log:function(){}}}if(typeof window.MathJax==="undefined"){window.MathJax={Hub:{Typeset:function(){},Queue:function(){}}}}if(typeof OpenAssessment.Server==="undefined"||!OpenAssessment.Server){OpenAssessment.Server=function(runtime,element){this.runtime=runtime;this.element=element};var jsonContentType="application/json; charset=utf-8";OpenAssessment.Server.prototype={url:function(handler){return this.runtime.handlerUrl(this.element,handler)},render:function(component){var view=this;var url=this.url("render_"+component);return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html"}).done(function(data){defer.resolveWith(view,[data])}).fail(function(){defer.rejectWith(view,[gettext("This section could not be loaded.")])})}).promise()},renderLatex:function(element){element.filter(".allow--latex").each(function(){MathJax.Hub.Queue(["Typeset",MathJax.Hub,this])})},renderContinuedPeer:function(){var view=this;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(view,[data])}).fail(function(){defer.rejectWith(view,[gettext("This section could not be loaded.")])})}).promise()},studentInfo:function(studentUsername,options){var url=this.url("render_student_info");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html",data:_.extend({student_username:studentUsername},options)}).done(function(data){defer.resolveWith(this,[data])}).fail(function(){defer.rejectWith(this,[gettext("This section could not be loaded.")])})}).promise()},staffGradeForm:function(){var url=this.url("render_staff_grade_form");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html"}).done(function(data){defer.resolveWith(this,[data])}).fail(function(){defer.rejectWith(this,[gettext("The staff assessment form could not be loaded.")])})}).promise()},staffGradeCounts:function(){var url=this.url("render_staff_grade_counts");return $.Deferred(function(defer){$.ajax({url:url,type:"POST",dataType:"html"}).done(function(data){defer.resolveWith(this,[data])}).fail(function(){defer.rejectWith(this,[gettext("The display of ungraded and checked out responses 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}),contentType:jsonContentType}).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(){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}),contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(){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,contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("This feedback could not be submitted.")])})}).promise()},submitAssessment:function(assessmentType,payload){var url=this.url(assessmentType);return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify(payload),contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("This assessment could not be submitted.")])})}).promise()},peerAssess:function(optionsSelected,criterionFeedback,overallFeedback,submissionID){return this.submitAssessment("peer_assess",{options_selected:optionsSelected,criterion_feedback:criterionFeedback,overall_feedback:overallFeedback,submission_uuid:submissionID})},selfAssess:function(optionsSelected,criterionFeedback,overallFeedback){return this.submitAssessment("self_assess",{options_selected:optionsSelected,criterion_feedback:criterionFeedback,overall_feedback:overallFeedback})},staffAssess:function(optionsSelected,criterionFeedback,overallFeedback,submissionID,assessType){return this.submitAssessment("staff_assess",{options_selected:optionsSelected,criterion_feedback:criterionFeedback,overall_feedback:overallFeedback,submission_uuid:submissionID,assess_type:assessType})},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,contentType:jsonContentType}).done(function(data){if(data.success){defer.resolveWith(this,[data.corrections])}else{defer.rejectWith(this,[data.msg])}}).fail(function(){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:'""',contentType:jsonContentType}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(){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:'""',contentType:jsonContentType}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("One or more rescheduling tasks failed.")])})})},updateEditorContext:function(options){var url=this.url("update_editor_context");var payload=JSON.stringify({prompts:options.prompts,feedback_prompt:options.feedbackPrompt,feedback_default_text:options.feedback_default_text,title:options.title,submission_start:options.submissionStart,submission_due:options.submissionDue,criteria:options.criteria,assessments:options.assessments,editor_assessments_order:options.editorAssessmentsOrder,file_upload_type:options.fileUploadType,white_listed_file_types:options.fileTypeWhiteList,allow_latex:options.latexEnabled,leaderboard_show:options.leaderboardNum});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload,contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve()}else{defer.rejectWith(this,[data.msg])}}).fail(function(){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,contentType:jsonContentType}).done(function(data){if(data.success){defer.resolveWith(this,[data.is_released])}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("The server could not be contacted.")])})}).promise()},getUploadUrl:function(contentType,filename){var url=this.url("upload_url");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({contentType:contentType,filename:filename}),contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve(data.url)}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("Could not retrieve upload url.")])})}).promise()},getDownloadUrl:function(){var url=this.url("download_url");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:JSON.stringify({}),contentType:jsonContentType}).done(function(data){if(data.success){defer.resolve(data.url)}else{defer.rejectWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("Could not retrieve download url.")])})}).promise()},cancelSubmission:function(submissionID,comments){var url=this.url("cancel_submission");var payload=JSON.stringify({submission_uuid:submissionID,comments:comments});return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:payload,contentType:jsonContentType}).done(function(data){if(data.success){defer.resolveWith(this,[data.msg])}}).fail(function(){defer.rejectWith(this,[gettext("The submission could not be removed from the grading pool.")])})}).promise()},publishEvent:function(eventName,eventData){eventData.event_name=eventName;var url=this.url("publish_event");var payload=JSON.stringify(eventData);$.ajax({type:"POST",url:url,data:payload,contentType:jsonContentType})}}}if(typeof OpenAssessment=="undefined"||!OpenAssessment){OpenAssessment={}}if(typeof window.gettext==="undefined"){window.gettext=function(text){return text}}if(typeof window.ngetgext==="undefined"){window.ngettext=function(singularText,pluralText,n){if(n>1){return pluralText}else{return singularText}}}if(typeof window.Logger==="undefined"){window.Logger={log:function(){}}}if(typeof window.MathJax==="undefined"){window.MathJax={Hub:{Typeset:function(){},Queue:function(){}}}}OpenAssessment.BaseView=function(runtime,element,server,data){this.runtime=runtime;this.element=element;this.server=server;this.fileUploader=new OpenAssessment.FileUploader;this.responseView=new OpenAssessment.ResponseView(this.element,this.server,this.fileUploader,this,data);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.staffView=new OpenAssessment.StaffView(this.element,this.server,this);this.gradeView=new OpenAssessment.GradeView(this.element,this.server,this);this.leaderboardView=new OpenAssessment.LeaderboardView(this.element,this.server,this);this.messageView=new OpenAssessment.MessageView(this.element,this.server,this);this.staffAreaView=new OpenAssessment.StaffAreaView(this.element,this.server,this);this.usageID="";this.srStatusUpdates=[]};if(typeof OpenAssessment.unsavedChanges==="undefined"||!OpenAssessment.unsavedChanges){OpenAssessment.unsavedChanges={}}OpenAssessment.clearUnsavedChanges=function(){OpenAssessment.unsavedChanges={};window.onbeforeunload=null};OpenAssessment.BaseView.prototype={IS_SHOWING_CLASS:"is--showing",SLIDABLE_CLASS:"ui-slidable",SLIDABLE_CONTENT_CLASS:"ui-slidable__content",SLIDABLE_CONTROLS_CLASS:"ui-slidable__control",SLIDABLE_CONTAINER_CLASS:"ui-slidable__container",scrollToTop:function(selector){if(!selector){selector=".openassessment__steps"}if($.scrollTo instanceof Function){$(window).scrollTo($(selector,this.element),800,{offset:-50});$(selector+" > header ."+this.SLIDABLE_CLASS,this.element).focus()}},srReadTexts:function(texts){var readerFeedbackID=".sr.reader-feedback",$readerFeedbackSelector=$(readerFeedbackID),htmlFeedback="";$.each(texts,function(ids,value){htmlFeedback=htmlFeedback+"<p>"+value+"</p>\n"});$readerFeedbackSelector.html(htmlFeedback)},areSRStepsLoading:function(){return this.responseView.isRendering||this.peerView.isRendering||this.selfView.isRendering||this.gradeView.isRendering||this.trainingView.isRendering||this.staffView.isRendering},announceStatusChangeToSRandFocus:function(stepID,usageID,gradeStatus,currentView,focusID){var text=this.getStatus(stepID,currentView,gradeStatus);if(typeof usageID!=="undefined"&&$(stepID,currentView.element).hasClass("is--showing")&&typeof focusID!=="undefined"){$(focusID,currentView.element).focus();this.srStatusUpdates.push(text)}else if(currentView.announceStatus){this.srStatusUpdates.push(text)}if(!this.areSRStepsLoading()&&this.srStatusUpdates.length>0){this.srReadTexts(this.srStatusUpdates);this.srStatusUpdates=[]}currentView.announceStatus=false},getStatus:function(stepID,currentView,gradeStatus){var cssBase=stepID+" .step__header .step__title ";var cssStringTitle=cssBase+".step__label";var cssStringStatus=cssBase+".step__status";if(gradeStatus){cssStringStatus=cssBase+".grade__value"}return $(cssStringTitle,currentView.element).text().trim()+" "+$(cssStringStatus,currentView.element).text().trim()},setUpCollapseExpand:function(parentElement){var view=this;$("."+view.SLIDABLE_CONTROLS_CLASS,parentElement).each(function(){$(this).on("click",function(event){event.preventDefault();var $slidableControl=$(event.target).closest("."+view.SLIDABLE_CONTROLS_CLASS);var $container=$slidableControl.closest("."+view.SLIDABLE_CONTAINER_CLASS);var $toggleButton=$slidableControl.find("."+view.SLIDABLE_CLASS);var $panel=$slidableControl.next("."+view.SLIDABLE_CONTENT_CLASS);if($container.hasClass("is--showing")){$panel.slideUp();$toggleButton.attr("aria-expanded","false");$container.removeClass("is--showing")}else if(!$container.hasClass("has--error")&&!$container.hasClass("is--empty")&&!$container.hasClass("is--unavailable")){$panel.slideDown();$toggleButton.attr("aria-expanded","true");$container.addClass("is--showing")}$container.removeClass("is--initially--collapsed ")})})},getUsageID:function(){if(!this.usageID){this.usageID=$(this.element).data("usage-id")}return this.usageID},load:function(){this.responseView.load();this.loadAssessmentModules();this.staffAreaView.load()},loadAssessmentModules:function(usageID){this.trainingView.load(usageID);this.peerView.load(usageID);this.staffView.load(usageID);this.selfView.load(usageID);this.gradeView.load(usageID);this.leaderboardView.load(usageID)},loadMessageView:function(){this.messageView.load()},toggleActionError:function(type,message){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"}else if(type==="upload"){container=".upload__error"}if(container===null){if(message!==null){console.log(message)}}else{$(container+" .message__content",element).html("<p>"+(message?_.escape(message):"")+"</p>");$(container,element).toggleClass("has--error",message!==null);$(container+" > .message",element).focus()}if(message!==null){var contentTitle=$(container+" .message__title").text();this.srReadTexts([contentTitle,message])}},showLoadError:function(stepName,errorMessage){if(!errorMessage){errorMessage=gettext("Unable to load")}var $container=$(".step--"+stepName);$container.toggleClass("has--error",true);$container.removeClass("is--showing");$container.find(".ui-slidable").attr("aria-expanded","false");$container.find(".step__status__value i").removeClass().addClass("icon fa fa-exclamation-triangle");$container.find(".step__status__value .copy").html(_.escape(errorMessage))},unsavedWarningEnabled:function(enabled,key,message){if(typeof enabled==="undefined"){return window.onbeforeunload!==null}else{var usageID=$(this.element).data("usage-id");if(enabled){if(typeof OpenAssessment.unsavedChanges[usageID]==="undefined"||!OpenAssessment.unsavedChanges[usageID]){OpenAssessment.unsavedChanges[usageID]={}}OpenAssessment.unsavedChanges[usageID][key]=message;window.onbeforeunload=function(){for(var xblockUsageID in OpenAssessment.unsavedChanges){if(OpenAssessment.unsavedChanges.hasOwnProperty(xblockUsageID)){for(var key in OpenAssessment.unsavedChanges[xblockUsageID]){if(OpenAssessment.unsavedChanges[xblockUsageID].hasOwnProperty(key)){return OpenAssessment.unsavedChanges[xblockUsageID][key]}}}}}}else{if(typeof OpenAssessment.unsavedChanges[usageID]!=="undefined"){delete OpenAssessment.unsavedChanges[usageID][key];if($.isEmptyObject(OpenAssessment.unsavedChanges[usageID])){delete OpenAssessment.unsavedChanges[usageID]}if($.isEmptyObject(OpenAssessment.unsavedChanges)){window.onbeforeunload=null}}}}},buttonEnabled:function(className,enabled){var $element=$(className,this.element);if(typeof enabled==="undefined"){return!$element.prop("disabled")}else{$element.prop("disabled",!enabled);return enabled}}};function OpenAssessmentBlock(runtime,element,data){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.BaseView(runtime,element,server,data);view.load()}OpenAssessment.FileUploader=function(){this.upload=function(url,file){return $.Deferred(function(defer){$.ajax({url:url,type:"PUT",data:file,async:false,processData:false,contentType:file.type}).done(function(){Logger.log("openassessment.upload_file",{fileName:file.name,fileSize:file.size,fileType:file.type});defer.resolve()}).fail(function(data,textStatus){defer.rejectWith(this,[textStatus])})}).promise()}};OpenAssessment.GradeView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.announceStatus=false;this.isRendering=false};OpenAssessment.GradeView.prototype={load:function(usageID){var view=this;var baseView=this.baseView;var stepID=".step--grade";var focusID="[id='oa_grade_"+usageID+"']";view.isRendering=true;this.server.render("grade").done(function(html){$(stepID,view.element).replaceWith(html);view.server.renderLatex($(stepID,view.element));view.isRendering=false;view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,true,view,focusID)}).fail(function(errMsg){baseView.showLoadError("grade",errMsg)})},installHandlers:function(){var sel=$(".step--grade",this.element);this.baseView.setUpCollapseExpand(sel);var view=this;sel.find(".feedback__submit").click(function(eventObject){eventObject.preventDefault();view.submitFeedbackOnAssessment()})},feedbackText:function(text){var usageID=this.baseView.getUsageID()||"";if(typeof text==="undefined"){return $("[id='feedback__remarks__value__"+usageID+"']",this.element).val()}else{$("[id='feedback__remarks__value__"+usageID+"']",this.element).val(text)}},feedbackOptions:function(options){var view=this;var usageID=this.baseView.getUsageID()||"";if(typeof options==="undefined"){return $.map($(".feedback__overall__value:checked",view.element),function(element){return $(element).val()})}else{$(".feedback__overall__value",this.element).prop("checked",false);$.each(options,function(index,opt){$("[id='feedback__overall__value--"+opt+"__"+usageID+"']",view.element).prop("checked",true)})}},setHidden:function(selector,hidden){selector.toggleClass("is--hidden",hidden);selector.attr("aria-hidden",hidden?"true":"false")},isHidden:function(selector){return selector.hasClass("is--hidden")&&selector.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).prop("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.LeaderboardView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.LeaderboardView.prototype={load:function(usageID){var view=this;var baseView=this.baseView;var stepID=".step--leaderboard";this.server.render("leaderboard").done(function(html){$(stepID,view.element).replaceWith(html);view.server.renderLatex($(stepID,view.element));view.installHandlers();if(typeof usageID!=="undefined"&&$(stepID,view.element).hasClass("is--showing")){$("[id='oa_leaderboard_"+usageID+"']",view.element).focus()}}).fail(function(errMsg){baseView.showLoadError("leaderboard",errMsg)})},installHandlers:function(){this.baseView.setUpCollapseExpand($(".step--leaderboard",this.element))}};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);view.server.renderLatex($(".openassessment__message",view.element))}).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;this.isRendering=false;this.announceStatus=false};OpenAssessment.PeerView.prototype={UNSAVED_WARNING_KEY:"peer-assessment",load:function(usageID){var view=this;var stepID=".step--peer-assessment";var focusID="[id='oa_peer_"+usageID+"']";view.isRendering=true;this.server.render("peer_assessment").done(function(html){$(stepID,view.element).replaceWith(html);view.isRendering=false;view.server.renderLatex($(stepID,view.element));view.installHandlers(false);view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID);view.announceStatus=false}).fail(function(){view.baseView.showLoadError("peer-assessment")});view.baseView.loadMessageView()},loadContinuedAssessment:function(usageID){var view=this;var stepID=".step--peer-assessment";var focusID="[id='oa_peer_"+usageID+"']";view.continueAssessmentEnabled(false);view.isRendering=true;this.server.renderContinuedPeer().done(function(html){$(".step--peer-assessment",view.element).replaceWith(html);view.server.renderLatex($(".step--peer-assessment",view.element));view.isRendering=false;view.installHandlers(true);view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID)}).fail(function(){view.baseView.showLoadError("peer-assessment");view.continueAssessmentEnabled(true)})},continueAssessmentEnabled:function(enabled){return this.baseView.buttonEnabled(".action--continue--grading",enabled)},installHandlers:function(isContinuedAssessment){var sel=$(".step--peer-assessment",this.element);var view=this;this.baseView.setUpCollapseExpand(sel);var rubricSelector=$(".peer-assessment--001__assessment",this.element);if(rubricSelector.size()>0){var rubricElement=rubricSelector.get(0);this.rubric=new OpenAssessment.Rubric(rubricElement)}else{this.rubric=null}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(view.peerSubmitEnabled,view));this.rubric.changesExistCallback($.proxy(view.assessmentRubricChanges,view))}sel.find(".peer-assessment--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();view.announceStatus=true;if(!isContinuedAssessment){view.peerAssess()}else{view.continuedPeerAssess()}});sel.find(".action--continue--grading").click(function(eventObject){eventObject.preventDefault();view.loadContinuedAssessment(view.baseView.getUsageID())})},peerSubmitEnabled:function(enabled){return this.baseView.buttonEnabled(".peer-assessment--001__assessment__submit",enabled)},assessmentRubricChanges:function(changesExist){if(changesExist){this.baseView.unsavedWarningEnabled(true,this.UNSAVED_WARNING_KEY,gettext("If you leave this page without submitting your peer assessment, you will lose any work you have done."))}},peerAssess:function(){var view=this;var baseView=view.baseView;var usageID=baseView.getUsageID();this.peerAssessRequest(function(){baseView.unsavedWarningEnabled(false,view.UNSAVED_WARNING_KEY);baseView.loadAssessmentModules(usageID);baseView.scrollToTop(".step--peer-assessment")})},continuedPeerAssess:function(){var view=this;var gradeView=this.baseView.gradeView;var baseView=view.baseView;var usageID=baseView.getUsageID();view.peerAssessRequest(function(){baseView.unsavedWarningEnabled(false,view.UNSAVED_WARNING_KEY);view.loadContinuedAssessment(usageID);gradeView.load();baseView.scrollToTop(".step--peer-assessment")})},peerAssessRequest:function(successFunction){var view=this;var uuid=this.getUUID();view.baseView.toggleActionError("peer",null);view.peerSubmitEnabled(false);this.server.peerAssess(this.rubric.optionsSelected(),this.rubric.criterionFeedback(),this.rubric.overallFeedback(),uuid).done(successFunction).fail(function(errMsg){view.baseView.toggleActionError("peer",errMsg);view.peerSubmitEnabled(true)})},getUUID:function(){var xBlockElement=$("div[data-usage-id='"+this.baseView.getUsageID()+"']");return xBlockElement.find(".step--peer-assessment").data("submission-uuid")}};OpenAssessment.ResponseView=function(element,server,fileUploader,baseView,data){this.element=element;this.server=server;this.fileUploader=fileUploader;this.baseView=baseView;this.savedResponse=[];this.files=null;this.fileType=null;this.lastChangeTime=Date.now();this.errorOnLastSave=false;this.autoSaveTimerId=null;this.data=data;this.fileUploaded=false;this.announceStatus=false;this.isRendering=false};OpenAssessment.ResponseView.prototype={AUTO_SAVE_POLL_INTERVAL:2e3,AUTO_SAVE_WAIT:3e4,MAX_FILE_SIZE:5242880,UNSAVED_WARNING_KEY:"learner-response",load:function(usageID){var view=this;var stepID=".step--response";var focusID="[id='oa_response_"+usageID+"']";view.isRendering=true;this.server.render("submission").done(function(html){$(stepID,view.element).replaceWith(html);view.server.renderLatex($(stepID,view.element));view.installHandlers();view.setAutoSaveEnabled(true);view.isRendering=false;view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID);view.announceStatus=false}).fail(function(){view.baseView.showLoadError("response")})},installHandlers:function(){var sel=$(".step--response",this.element);var view=this;var uploadType="";if(sel.find(".submission__answer__display__file").length){uploadType=sel.find(".submission__answer__display__file").data("upload-type")}this.baseView.setUpCollapseExpand(sel);this.savedResponse=this.response();var handleChange=function(){view.handleResponseChanged()};sel.find(".submission__answer__part__text__value").on("change keyup drop paste",handleChange);var handlePrepareUpload=function(eventData){view.prepareUpload(eventData.target.files,uploadType)};sel.find("input[type=file]").on("change",handlePrepareUpload);sel.find(".submission__preview__item").hide();sel.find(".step--response__submit").click(function(eventObject){eventObject.preventDefault();view.submit()});sel.find(".submission__save").click(function(eventObject){eventObject.preventDefault();view.save()});sel.find(".submission__preview").click(function(eventObject){eventObject.preventDefault();var previewText=sel.find(".submission__answer__part__text__value").val();var previewContainer=sel.find(".preview_content");previewContainer.html(previewText.replace(/\r\n|\r|\n/g,"<br />"));sel.find(".submission__preview__item").show();MathJax.Hub.Queue(["Typeset",MathJax.Hub,previewContainer[0]])});sel.find(".file__upload").click(function(eventObject){eventObject.preventDefault();$(".submission__answer__display__file",view.element).removeClass("is--hidden");view.fileUpload()})},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){return this.baseView.buttonEnabled(".step--response__submit",enabled)},saveEnabled:function(enabled){return this.baseView.buttonEnabled(".submission__save",enabled)},previewEnabled:function(enabled){return this.baseView.buttonEnabled(".submission__preview",enabled)},saveStatus:function(msg){var sel=$(".save__submission__label",this.element);if(typeof msg==="undefined"){return sel.text()}else{var label=gettext("Status of Your Response");sel.html('<span class="sr">'+_.escape(label)+":"+"</span>\n"+msg)}},response:function(texts){var sel=$(".response__submission .submission__answer__part__text__value",this.element);if(typeof texts==="undefined"){return sel.map(function(){return $.trim($(this).val())}).get()}else{sel.map(function(index){$(this).val(texts[index])})}},responseChanged:function(){var savedResponse=this.savedResponse;return this.response().some(function(element,index){return element!==savedResponse[index]})},autoSave:function(){var timeSinceLastChange=Date.now()-this.lastChangeTime;if(this.responseChanged()&&timeSinceLastChange>this.AUTO_SAVE_WAIT&&!this.errorOnLastSave){this.save()}},handleResponseChanged:function(){var isNotBlank=!this.response().every(function(element){return $.trim(element)===""});this.submitEnabled(isNotBlank);if(this.responseChanged()){this.saveEnabled(isNotBlank);this.previewEnabled(isNotBlank);this.saveStatus(gettext("This response has not been saved."));this.baseView.unsavedWarningEnabled(true,this.UNSAVED_WARNING_KEY,gettext("If you leave this page without saving or submitting your response, you will lose any work you have done on the response."))}this.lastChangeTime=Date.now()},save:function(){this.errorOnLastSave=false;this.saveStatus(gettext("Saving..."));this.baseView.toggleActionError("save",null);this.baseView.unsavedWarningEnabled(false,this.UNSAVED_WARNING_KEY);var view=this;var savedResponse=this.response();this.server.save(savedResponse).done(function(){view.savedResponse=savedResponse;var currentResponse=view.response();var currentResponseIsEmpty=currentResponse.every(function(element){return element===""});view.submitEnabled(!currentResponseIsEmpty);var currentResponseEqualsSaved=currentResponse.every(function(element,index){
return element===savedResponse[index]});if(currentResponseEqualsSaved){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;var fileDefer=$.Deferred();if(view.files!==null&&!view.fileUploaded){var msg=gettext("Do you want to upload your file before submitting?");if(confirm(msg)){fileDefer=view.fileUpload()}else{view.submitEnabled(true);return}}else{fileDefer.resolve()}fileDefer.pipe(function(){return view.confirmSubmission().pipe(function(){var submission=view.response();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(){var baseView=this.baseView;var usageID=baseView.getUsageID();var view=this;this.load(usageID);baseView.loadAssessmentModules(usageID);view.announceStatus=true;baseView.unsavedWarningEnabled(false,this.UNSAVED_WARNING_KEY)},confirmSubmission:function(){var msg=gettext("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()}})},prepareUpload:function(files,uploadType){this.files=null;this.fileType=files[0].type;var ext=files[0].name.split(".").pop().toLowerCase();if(files[0].size>this.MAX_FILE_SIZE){this.baseView.toggleActionError("upload",gettext("File size must be 5MB or less."))}else if(uploadType==="image"&&this.data.ALLOWED_IMAGE_MIME_TYPES.indexOf(this.fileType)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG or GIF")}else if(uploadType==="pdf-and-image"&&this.data.ALLOWED_FILE_MIME_TYPES.indexOf(this.fileType)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG, GIF or PDF")}else if(uploadType==="custom"&&this.data.FILE_TYPE_WHITE_LIST.indexOf(ext)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+this.data.FILE_TYPE_WHITE_LIST.join(", "))}else if(this.data.FILE_EXT_BLACK_LIST.indexOf(ext)!==-1){this.baseView.toggleActionError("upload",gettext("File type is not allowed."))}else{this.baseView.toggleActionError("upload",null);this.files=files}$(".file__upload").prop("disabled",this.files===null)},fileUpload:function(){var view=this;var fileUpload=$(".file__upload");fileUpload.prop("disabled",true);var handleError=function(errMsg){view.baseView.toggleActionError("upload",errMsg);fileUpload.prop("disabled",false)};return this.server.getUploadUrl(view.fileType,view.files[0].name).done(function(url){var file=view.files[0];view.fileUploader.upload(url,file).done(function(){view.fileUrl();view.baseView.toggleActionError("upload",null);view.fileUploaded=true}).fail(handleError)}).fail(handleError)},fileUrl:function(){var view=this;var file=$(".submission__answer__file",view.element);view.server.getDownloadUrl().done(function(url){if(file.prop("tagName")==="IMG"){file.attr("src",url)}else{file.attr("href",url)}return url})}};OpenAssessment.Rubric=function(element){this.element=element};OpenAssessment.Rubric.prototype={criterionFeedback:function(criterionFeedback){var selector="textarea.answer__value";var feedback={};var rubric=this;$(selector,this.element).each(function(index,sel){var criterionName=rubric.getCriterionName(sel);if(typeof criterionFeedback!=="undefined"){$(sel).val(criterionFeedback[criterionName]);feedback[criterionName]=criterionFeedback[criterionName]}else{feedback[criterionName]=$(sel).val()}});return feedback},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)}},optionsSelected:function(optionsSelected){var selector="input[type=radio]";var rubric=this;if(typeof optionsSelected==="undefined"){var options={};$(selector+":checked",this.element).each(function(index,sel){options[rubric.getCriterionName(sel)]=sel.value});return options}else{$(selector,this.element).prop("checked",false);$(selector,this.element).each(function(index,sel){var criterionName=rubric.getCriterionName(sel);if(optionsSelected.hasOwnProperty(criterionName)){if(sel.value===optionsSelected[criterionName]){$(sel).prop("checked",true)}}})}},canSubmitCallback:function(callback){var rubric=this;callback(rubric.canSubmit());$(this.element).on("change keyup drop paste",function(){callback(rubric.canSubmit())})},canSubmit:function(){var numChecked=$("input[type=radio]:checked",this.element).length;var numAvailable=$(".field--radio.assessment__rubric__question.has--options",this.element).length;var completedRequiredComments=true;$("textarea[required]",this.element).each(function(){var trimmedText=$.trim($(this).val());if(trimmedText===""){completedRequiredComments=false}});return numChecked===numAvailable&&completedRequiredComments},changesExistCallback:function(callback){var rubric=this;callback(rubric.changesExist());$(this.element).on("change keyup drop paste",function(){callback(rubric.changesExist())})},changesExist:function(){var numChecked=$("input[type=radio]:checked",this.element).length;var textExists=false;$("textarea",this.element).each(function(){var trimmedText=$.trim($(this).val());if(trimmedText!==""){textExists=true}});return numChecked>0||textExists},showCorrections:function(corrections){var selector="input[type=radio]";var hasErrors=false;var rubric=this;$(selector,this.element).each(function(index,sel){var listItem=$(sel).parents(".assessment__rubric__question");if(corrections.hasOwnProperty(rubric.getCriterionName(sel))){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},getCriterionName:function(element){return $(element).data("criterion-name")}};OpenAssessment.SelfView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null;this.isRendering=false;this.announceStatus=false};OpenAssessment.SelfView.prototype={UNSAVED_WARNING_KEY:"self-assessment",load:function(usageID){var view=this;var stepID=".step--self-assessment";var focusID="[id='oa_self_"+usageID+"']";view.isRendering=true;this.server.render("self_assessment").done(function(html){$(stepID,view.element).replaceWith(html);view.isRendering=false;view.server.renderLatex($(stepID,view.element));view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID)}).fail(function(){view.showLoadError("self-assessment")})},installHandlers:function(){var view=this;var sel=$(".step--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)}else{this.rubric=null}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(this.selfSubmitEnabled,this));this.rubric.changesExistCallback($.proxy(this.assessmentRubricChanges,this))}sel.find(".self-assessment--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();view.selfAssess()})},selfSubmitEnabled:function(enabled){return this.baseView.buttonEnabled(".self-assessment--001__assessment__submit",enabled)},assessmentRubricChanges:function(changesExist){if(changesExist){this.baseView.unsavedWarningEnabled(true,this.UNSAVED_WARNING_KEY,gettext("If you leave this page without submitting your self assessment, you will lose any work you have done."))}},selfAssess:function(){var view=this;var baseView=this.baseView;var usageID=baseView.getUsageID();baseView.toggleActionError("self",null);view.selfSubmitEnabled(false);this.server.selfAssess(this.rubric.optionsSelected(),this.rubric.criterionFeedback(),this.rubric.overallFeedback()).done(function(){baseView.unsavedWarningEnabled(false,view.UNSAVED_WARNING_KEY);view.announceStatus=true;baseView.loadAssessmentModules(usageID)}).fail(function(errMsg){baseView.toggleActionError("self",errMsg);view.selfSubmitEnabled(true)})}};OpenAssessment.StaffView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.isRendering=false;this.announceStatus=false};OpenAssessment.StaffView.prototype={load:function(usageID){var view=this;var stepID=".step--staff-assessment";var focusID="[id='oa_staff_grade_"+usageID+"']";view.isRendering=true;this.server.render("staff_assessment").done(function(html){$(".step--staff-assessment",view.element).replaceWith(html);view.isRendering=false;view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID)}).fail(function(){view.baseView.showLoadError("staff-assessment")})},installHandlers:function(){this.baseView.setUpCollapseExpand($(".step--staff-assessment",this.element))}};(function(OpenAssessment){"use strict";OpenAssessment.StaffAreaView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.StaffAreaView.prototype={FULL_GRADE_UNSAVED_WARNING_KEY:"staff-grade",OVERRIDE_UNSAVED_WARNING_KEY:"staff-override",load:function(){var view=this;if($(".openassessment__staff-area",view.element).length>0){this.server.render("staff_area").done(function(html){$(".openassessment__staff-area",view.element).replaceWith(html);view.server.renderLatex($(".openassessment__staff-area",view.element));view.installHandlers()}).fail(function(){view.baseView.showLoadError("staff_area")})}},loadStudentInfo:function(classToExpand){var view=this;var $manageLearnersTab=$(".openassessment__staff-tools",this.element);var $form=$manageLearnersTab.find(".openassessment_student_info_form");var studentUsername=$manageLearnersTab.find(".openassessment__student_username").val();var showFormError=function(errorMessage){$form.find(".form--error").text(errorMessage).focus()};var deferred=$.Deferred();$(".openassessment__student-info",view.element).text("");if(studentUsername.trim()){this.server.studentInfo(studentUsername).done(function(html){showFormError("");$(".openassessment__student-info",view.element).replaceWith(html);$manageLearnersTab.on("click",".action--submit-cancel-submission",function(eventObject){eventObject.preventDefault();view.cancelSubmission($(this).data("submission-uuid"))});var handleChange=function(eventData){view.handleCommentChanged(eventData)};$manageLearnersTab.find(".cancel_submission_comments").on("change keyup drop paste",handleChange);var $rubric=$manageLearnersTab.find(".staff-assessment__assessment");if($rubric.size()>0){var rubricElement=$rubric.get(0);var rubric=new OpenAssessment.Rubric(rubricElement);rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled,view,$manageLearnersTab));rubric.changesExistCallback($.proxy(view.assessmentRubricChanges,view,view.OVERRIDE_UNSAVED_WARNING_KEY));$manageLearnersTab.find(".wrapper--staff-assessment .action--submit",view.element).click(function(eventObject){var target=$(eventObject.currentTarget),rootElement=target.closest(".openassessment__student-info"),submissionID=rootElement.data("submission-uuid");eventObject.preventDefault();view.submitStaffOverride(submissionID,rubric,$manageLearnersTab)})}view.baseView.setUpCollapseExpand($manageLearnersTab);$manageLearnersTab.find(".staff-info__student__report__summary").focus();if(classToExpand){$manageLearnersTab.find("."+classToExpand+" ."+view.baseView.SLIDABLE_CONTENT_CLASS).slideDown();$manageLearnersTab.find("."+classToExpand+" ."+view.baseView.SLIDABLE_CLASS).addClass(view.baseView.IS_SHOWING_CLASS).attr("aria-expanded","true").focus()}deferred.resolve()}).fail(function(){showFormError(gettext("Unexpected server error."));deferred.reject()})}else{showFormError(gettext("You must provide a learner name."));deferred.reject()}return deferred.promise()},loadStaffGradeForm:function(){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",this.element);var $staffGradeControl=$staffGradeTab.find("."+view.baseView.SLIDABLE_CLASS);var $staffGradeContent=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTENT_CLASS);var $staffGradeContainer=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTAINER_CLASS);var deferred=$.Deferred();var showFormError=function(errorMessage){$staffGradeTab.find(".staff__grade__form--error").text(errorMessage).focus()};$staffGradeControl.attr("aria-expanded","true");if(this.staffGradeFormLoaded){$staffGradeContent.slideDown();$staffGradeContainer.addClass(view.baseView.IS_SHOWING_CLASS);deferred.resolve()}else{this.staffGradeFormLoaded=true;this.server.staffGradeForm().done(function(html){showFormError("");$staffGradeTab.find(".staff__grade__form").replaceWith(html);view.updateStaffGradeCounts();var $rubric=$staffGradeTab.find(".staff-assessment__assessment");if($rubric.size()>0){var rubricElement=$rubric.get(0);var rubric=new OpenAssessment.Rubric(rubricElement);rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled,view,$staffGradeTab));rubric.changesExistCallback($.proxy(view.assessmentRubricChanges,view,view.FULL_GRADE_UNSAVED_WARNING_KEY));$staffGradeTab.find(".wrapper--staff-assessment .action--submit").click(function(eventObject){var submissionID=$staffGradeTab.find(".staff__grade__form").data("submission-uuid");eventObject.preventDefault();view.submitStaffGrade(submissionID,rubric,$staffGradeTab,$(eventObject.currentTarget).hasClass("continue_grading--action"))})}$staffGradeContent.slideDown(function(){$staffGradeControl.focus();view.baseView.setUpCollapseExpand($(".staff__grade__form",view.element))});$staffGradeContainer.addClass(view.baseView.IS_SHOWING_CLASS);deferred.resolve()}).fail(function(){showFormError(gettext("Unexpected server error."));view.staffGradeFormLoaded=false;deferred.reject()})}return deferred.promise()},closeStaffGradeForm:function(clear){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",view.element);var $staffGradeControl=$staffGradeTab.find("."+view.baseView.SLIDABLE_CLASS).first();var $staffGradeContent=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTENT_CLASS);var $staffGradeContainer=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTAINER_CLASS);$staffGradeControl.attr("aria-expanded","false");if(clear){$staffGradeTab.find(".staff__grade__form").replaceWith('<div class="staff__grade__form"></div>');this.updateStaffGradeCounts()}else{$staffGradeContent.slideUp()}$staffGradeContainer.removeClass(view.baseView.IS_SHOWING_CLASS);$staffGradeControl.focus()},updateStaffGradeCounts:function(){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",this.element);view.server.staffGradeCounts().done(function(html){$staffGradeTab.find(".staff__grade__status").replaceWith(html)}).fail(function(){$staffGradeTab.find(".staff__grade__status").replaceWith('<span class="staff__grade__status"><span class="staff__grade__value"><span class="copy">'+gettext("Error getting the number of ungraded responses")+"</span></span></span>")})},installHandlers:function(){var view=this;var $staffArea=$(".openassessment__staff-area",this.element);var $manageLearnersTab=$(".openassessment__staff-tools",$staffArea);var $staffGradeTool=$(".openassessment__staff-grading",$staffArea);if($staffArea.length<=0){return}$staffArea.find(".ui-staff__button").click(function(eventObject){$staffArea.find(".ui-staff__button").each(function(index,button){if(button!==eventObject.currentTarget){var $panel=$staffArea.find("."+$(button).data("panel")).first();$panel.slideUp(0)}});var $button=$(eventObject.currentTarget),$panel=$staffArea.find("."+$button.data("panel")).first();if($button.hasClass("is--active")){$button.removeClass("is--active").attr("aria-expanded","false");$panel.slideUp()}else{$staffArea.find(".ui-staff__button").removeClass("is--active").attr("aria-expanded","false");$button.addClass("is--active").attr("aria-expanded","true");$panel.slideDown()}$panel.find(".ui-staff_close_button").focus()});$staffArea.find(".ui-staff_close_button").click(function(eventObject){var $button=$(eventObject.currentTarget),$panel=$button.closest(".wrapper--ui-staff");$staffArea.find(".ui-staff__button").removeClass("is--active").attr("aria-expanded","false");$panel.slideUp();$staffArea.find(".ui-staff__button").each(function(index,button){var $staffPanel=$staffArea.find("."+$(button).data("panel")).first();if($staffPanel[0]===$panel[0]){$(button).focus()}})});$manageLearnersTab.find(".openassessment_student_info_form").submit(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});$manageLearnersTab.find(".action--submit-username").click(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});$manageLearnersTab.find(".action--submit-training").click(function(eventObject){eventObject.preventDefault();view.scheduleTraining()});$manageLearnersTab.find(".action--submit-unfinished-tasks").click(function(eventObject){eventObject.preventDefault();view.rescheduleUnfinishedTasks()});$staffGradeTool.find(".staff__grade__show-form").click(function(event){var $container=$(event.currentTarget).closest("."+view.baseView.SLIDABLE_CONTAINER_CLASS);var wasShowing=$container.hasClass(view.baseView.IS_SHOWING_CLASS);if(wasShowing){view.closeStaffGradeForm(false)}else{view.loadStaffGradeForm()}})},scheduleTraining:function(){var view=this;this.server.scheduleTraining().done(function(msg){$(".schedule_training_message",view.element).text(msg)}).fail(function(errMsg){$(".schedule_training_message",view.element).text(errMsg)})},rescheduleUnfinishedTasks:function(){var view=this;this.server.rescheduleUnfinishedTasks().done(function(msg){$(".reschedule_unfinished_tasks_message",view.element).text(msg)}).fail(function(errMsg){$(".reschedule_unfinished_tasks_message",view.element).text(errMsg)})},cancelSubmission:function(submissionUUID){this.cancelSubmissionEnabled(false);var view=this;var comments=$(".cancel_submission_comments",this.element).val();this.server.cancelSubmission(submissionUUID,comments).done(function(){view.loadStudentInfo("staff-info__student__grade")}).fail(function(errorMessage){$(".cancel-submission-error").html(_.escape(errorMessage))})},cancelSubmissionEnabled:function(enabled){return this.baseView.buttonEnabled(".action--submit-cancel-submission",enabled)},comment:function(text){var $submissionComments=$(".cancel_submission_comments",this.element);if(typeof text==="undefined"){return $submissionComments.val()}else{$submissionComments.val(text)}},handleCommentChanged:function(){var isBlank=$.trim(this.comment())!=="";this.cancelSubmissionEnabled(isBlank)},staffSubmitEnabled:function(scope,enabled){return this.baseView.buttonEnabled(".wrapper--staff-assessment .action--submit",enabled)},assessmentRubricChanges:function(key,changesExist){if(changesExist){this.baseView.unsavedWarningEnabled(true,key,gettext("If you leave this page without submitting your staff assessment, you will lose any work you have done."))}},submitStaffOverride:function(submissionID,rubric,scope){var view=this;var successCallback=function(){view.baseView.unsavedWarningEnabled(false,view.OVERRIDE_UNSAVED_WARNING_KEY);view.loadStudentInfo("staff-info__student__grade")};this.callStaffAssess(submissionID,rubric,scope,successCallback,".staff-override-error","regrade")},submitStaffGrade:function(submissionID,rubric,scope,continueGrading){var view=this;var successCallback=function(){view.baseView.unsavedWarningEnabled(false,view.FULL_GRADE_UNSAVED_WARNING_KEY);view.staffGradeFormLoaded=false;if(continueGrading){view.loadStaffGradeForm();view.baseView.scrollToTop(".openassessment__staff-area")}else{view.closeStaffGradeForm(true)}};this.callStaffAssess(submissionID,rubric,scope,successCallback,".staff-grade-error","full-grade")},callStaffAssess:function(submissionID,rubric,scope,successCallback,errorSelector,assessType){var view=this;view.staffSubmitEnabled(scope,false);this.server.staffAssess(rubric.optionsSelected(),rubric.criterionFeedback(),rubric.overallFeedback(),submissionID,assessType).done(successCallback).fail(function(errorMessage){scope.find(errorSelector).html(_.escape(errorMessage));view.staffSubmitEnabled(scope,true)})}}})(OpenAssessment);OpenAssessment.StudentTrainingView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null;this.isRendering=false;this.announceStatus=false};OpenAssessment.StudentTrainingView.prototype={load:function(usageID){var view=this;var stepID=".step--student-training";var focusID="[id='oa_training_"+usageID+"']";view.isRendering=true;this.server.render("student_training").done(function(html){$(stepID,view.element).replaceWith(html);view.isRendering=false;view.server.renderLatex($(stepID,view.element));view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID);view.announceStatus=false}).fail(function(){view.baseView.showLoadError("student-training")})},installHandlers:function(){var sel=$(".step--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();view.announceStatus=true})},assess:function(){this.assessButtonEnabled(false);var options={};if(this.rubric!==null){options=this.rubric.optionsSelected()}var view=this;var baseView=this.baseView;var usageID=baseView.getUsageID();this.server.trainingAssess(options).done(function(corrections){var incorrect=$(".openassessment__student-training--incorrect",view.element);var instructions=$(".openassessment__student-training--instructions",view.element);if(!view.rubric.showCorrections(corrections)){view.load(usageID);baseView.loadAssessmentModules(usageID);incorrect.addClass("is--hidden");instructions.removeClass("is--hidden")}else{instructions.addClass("is--hidden");incorrect.removeClass("is--hidden")}baseView.scrollToTop(".step--student-training")}).fail(function(errMsg){baseView.toggleActionError("student-training",errMsg);view.assessButtonEnabled(true)})},assessButtonEnabled:function(isEnabled){return this.baseView.buttonEnabled(".student-training--001__assessment__submit",isEnabled)}};
return element===savedResponse[index]});if(currentResponseEqualsSaved){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;var fileDefer=$.Deferred();if(view.files!==null&&!view.fileUploaded){var msg=gettext("Do you want to upload your file before submitting?");if(confirm(msg)){fileDefer=view.fileUpload()}else{view.submitEnabled(true);return}}else{fileDefer.resolve()}fileDefer.pipe(function(){return view.confirmSubmission().pipe(function(){var submission=view.response();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(){var baseView=this.baseView;var usageID=baseView.getUsageID();var view=this;this.load(usageID);baseView.loadAssessmentModules(usageID);view.announceStatus=true;baseView.unsavedWarningEnabled(false,this.UNSAVED_WARNING_KEY)},confirmSubmission:function(){var msg=gettext("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()}})},prepareUpload:function(files,uploadType){this.files=null;this.fileType=files[0].type;var ext=files[0].name.split(".").pop().toLowerCase();if(files[0].size>this.MAX_FILE_SIZE){this.baseView.toggleActionError("upload",gettext("File size must be 5MB or less."))}else if(uploadType==="image"&&this.data.ALLOWED_IMAGE_MIME_TYPES.indexOf(this.fileType)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG or GIF")}else if(uploadType==="pdf-and-image"&&this.data.ALLOWED_FILE_MIME_TYPES.indexOf(this.fileType)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+"JPG, PNG, GIF or PDF")}else if(uploadType==="custom"&&this.data.FILE_TYPE_WHITE_LIST.indexOf(ext)===-1){this.baseView.toggleActionError("upload",gettext("You can upload files with these file types: ")+this.data.FILE_TYPE_WHITE_LIST.join(", "))}else if(this.data.FILE_EXT_BLACK_LIST.indexOf(ext)!==-1){this.baseView.toggleActionError("upload",gettext("File type is not allowed."))}else{this.baseView.toggleActionError("upload",null);this.files=files}$(".file__upload").prop("disabled",this.files===null)},fileUpload:function(){var view=this;var fileUpload=$(".file__upload");fileUpload.prop("disabled",true);var handleError=function(errMsg){view.baseView.toggleActionError("upload",errMsg);fileUpload.prop("disabled",false)};return this.server.getUploadUrl(view.fileType,view.files[0].name).done(function(url){var file=view.files[0];view.fileUploader.upload(url,file).done(function(){view.fileUrl();view.baseView.toggleActionError("upload",null);view.fileUploaded=true}).fail(handleError)}).fail(handleError)},fileUrl:function(){var view=this;var file=$(".submission__answer__file",view.element);view.server.getDownloadUrl().done(function(url){if(file.prop("tagName")==="IMG"){file.attr("src",url)}else{file.attr("href",url)}return url})}};OpenAssessment.Rubric=function(element){this.element=element};OpenAssessment.Rubric.prototype={criterionFeedback:function(criterionFeedback){var selector="textarea.answer__value";var feedback={};var rubric=this;$(selector,this.element).each(function(index,sel){var criterionName=rubric.getCriterionName(sel);if(typeof criterionFeedback!=="undefined"){$(sel).val(criterionFeedback[criterionName]);feedback[criterionName]=criterionFeedback[criterionName]}else{feedback[criterionName]=$(sel).val()}});return feedback},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)}},optionsSelected:function(optionsSelected){var selector="input[type=radio]";var rubric=this;if(typeof optionsSelected==="undefined"){var options={};$(selector+":checked",this.element).each(function(index,sel){options[rubric.getCriterionName(sel)]=sel.value});return options}else{$(selector,this.element).prop("checked",false);$(selector,this.element).each(function(index,sel){var criterionName=rubric.getCriterionName(sel);if(optionsSelected.hasOwnProperty(criterionName)){if(sel.value===optionsSelected[criterionName]){$(sel).prop("checked",true)}}})}},canSubmitCallback:function(callback){var rubric=this;callback(rubric.canSubmit());$(this.element).on("change keyup drop paste",function(){callback(rubric.canSubmit())})},canSubmit:function(){var numChecked=$("input[type=radio]:checked",this.element).length;var numAvailable=$(".field--radio.assessment__rubric__question.has--options",this.element).length;var completedRequiredComments=true;$("textarea[required]",this.element).each(function(){var trimmedText=$.trim($(this).val());if(trimmedText===""){completedRequiredComments=false}});return numChecked===numAvailable&&completedRequiredComments},changesExistCallback:function(callback){var rubric=this;callback(rubric.changesExist());$(this.element).on("change keyup drop paste",function(){callback(rubric.changesExist())})},changesExist:function(){var numChecked=$("input[type=radio]:checked",this.element).length;var textExists=false;$("textarea",this.element).each(function(){var trimmedText=$.trim($(this).val());if(trimmedText!==""){textExists=true}});return numChecked>0||textExists},showCorrections:function(corrections){var selector="input[type=radio]";var hasErrors=false;var rubric=this;$(selector,this.element).each(function(index,sel){var listItem=$(sel).parents(".assessment__rubric__question");if(corrections.hasOwnProperty(rubric.getCriterionName(sel))){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},getCriterionName:function(element){return $(element).data("criterion-name")}};OpenAssessment.SelfView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null;this.isRendering=false;this.announceStatus=false};OpenAssessment.SelfView.prototype={UNSAVED_WARNING_KEY:"self-assessment",load:function(usageID){var view=this;var stepID=".step--self-assessment";var focusID="[id='oa_self_"+usageID+"']";view.isRendering=true;this.server.render("self_assessment").done(function(html){$(stepID,view.element).replaceWith(html);view.isRendering=false;view.server.renderLatex($(stepID,view.element));view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID)}).fail(function(){view.showLoadError("self-assessment")})},installHandlers:function(){var view=this;var sel=$(".step--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)}else{this.rubric=null}if(this.rubric!==null){this.rubric.canSubmitCallback($.proxy(this.selfSubmitEnabled,this));this.rubric.changesExistCallback($.proxy(this.assessmentRubricChanges,this))}sel.find(".self-assessment--001__assessment__submit").click(function(eventObject){eventObject.preventDefault();view.selfAssess()})},selfSubmitEnabled:function(enabled){return this.baseView.buttonEnabled(".self-assessment--001__assessment__submit",enabled)},assessmentRubricChanges:function(changesExist){if(changesExist){this.baseView.unsavedWarningEnabled(true,this.UNSAVED_WARNING_KEY,gettext("If you leave this page without submitting your self assessment, you will lose any work you have done."))}},selfAssess:function(){var view=this;var baseView=this.baseView;var usageID=baseView.getUsageID();baseView.toggleActionError("self",null);view.selfSubmitEnabled(false);this.server.selfAssess(this.rubric.optionsSelected(),this.rubric.criterionFeedback(),this.rubric.overallFeedback()).done(function(){baseView.unsavedWarningEnabled(false,view.UNSAVED_WARNING_KEY);view.announceStatus=true;baseView.loadAssessmentModules(usageID)}).fail(function(errMsg){baseView.toggleActionError("self",errMsg);view.selfSubmitEnabled(true)})}};OpenAssessment.StaffView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.isRendering=false;this.announceStatus=false};OpenAssessment.StaffView.prototype={load:function(usageID){var view=this;var stepID=".step--staff-assessment";var focusID="[id='oa_staff_grade_"+usageID+"']";view.isRendering=true;this.server.render("staff_assessment").done(function(html){$(".step--staff-assessment",view.element).replaceWith(html);view.isRendering=false;view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID)}).fail(function(){view.baseView.showLoadError("staff-assessment")})},installHandlers:function(){this.baseView.setUpCollapseExpand($(".step--staff-assessment",this.element))}};(function(OpenAssessment){"use strict";OpenAssessment.StaffAreaView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.StaffAreaView.prototype={FULL_GRADE_UNSAVED_WARNING_KEY:"staff-grade",OVERRIDE_UNSAVED_WARNING_KEY:"staff-override",load:function(){var view=this;if($(".openassessment__staff-area",view.element).length>0){this.server.render("staff_area").done(function(html){$(".openassessment__staff-area",view.element).replaceWith(html);view.server.renderLatex($(".openassessment__staff-area",view.element));view.installHandlers()}).fail(function(){view.baseView.showLoadError("staff_area")})}},loadStudentInfo:function(classToExpand){var view=this;var $manageLearnersTab=$(".openassessment__staff-tools",this.element);var $form=$manageLearnersTab.find(".openassessment_student_info_form");var studentUsername=$manageLearnersTab.find(".openassessment__student_username").val();var showFormError=function(errorMessage){$form.find(".form--error").text(errorMessage).focus()};var deferred=$.Deferred();$(".openassessment__student-info",view.element).text("");if(studentUsername.trim()){this.server.studentInfo(studentUsername).done(function(html){showFormError("");$(".openassessment__student-info",view.element).replaceWith(html);$manageLearnersTab.on("click",".action--submit-cancel-submission",function(eventObject){eventObject.preventDefault();view.cancelSubmission($(this).data("submission-uuid"))});var handleChange=function(eventData){view.handleCommentChanged(eventData)};$manageLearnersTab.find(".cancel_submission_comments").on("change keyup drop paste",handleChange);var $rubric=$manageLearnersTab.find(".staff-assessment__assessment");if($rubric.size()>0){var rubricElement=$rubric.get(0);var rubric=new OpenAssessment.Rubric(rubricElement);rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled,view,$manageLearnersTab));rubric.changesExistCallback($.proxy(view.assessmentRubricChanges,view,view.OVERRIDE_UNSAVED_WARNING_KEY));$manageLearnersTab.find(".wrapper--staff-assessment .action--submit",view.element).click(function(eventObject){var target=$(eventObject.currentTarget),rootElement=target.closest(".openassessment__student-info"),submissionID=rootElement.data("submission-uuid");eventObject.preventDefault();view.submitStaffOverride(submissionID,rubric,$manageLearnersTab)})}view.baseView.setUpCollapseExpand($manageLearnersTab);$manageLearnersTab.find(".staff-info__student__report__summary").focus();if(classToExpand){$manageLearnersTab.find("."+classToExpand+" ."+view.baseView.SLIDABLE_CONTENT_CLASS).slideDown();$manageLearnersTab.find("."+classToExpand+" ."+view.baseView.SLIDABLE_CLASS).addClass(view.baseView.IS_SHOWING_CLASS).attr("aria-expanded","true").focus()}deferred.resolve()}).fail(function(){showFormError(gettext("Unexpected server error."));deferred.reject()})}else{showFormError(gettext("You must provide a learner name."));deferred.reject()}return deferred.promise()},loadStaffGradeForm:function(){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",this.element);var $staffGradeControl=$staffGradeTab.find("."+view.baseView.SLIDABLE_CLASS);var $staffGradeContent=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTENT_CLASS);var $staffGradeContainer=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTAINER_CLASS);var deferred=$.Deferred();var showFormError=function(errorMessage){$staffGradeTab.find(".staff__grade__form--error").text(errorMessage).focus()};$staffGradeControl.attr("aria-expanded","true");if(this.staffGradeFormLoaded){$staffGradeContent.slideDown();$staffGradeContainer.addClass(view.baseView.IS_SHOWING_CLASS);deferred.resolve()}else{this.staffGradeFormLoaded=true;this.server.staffGradeForm().done(function(html){showFormError("");$staffGradeTab.find(".staff__grade__form").replaceWith(html);view.updateStaffGradeCounts();var $rubric=$staffGradeTab.find(".staff-assessment__assessment");if($rubric.size()>0){var rubricElement=$rubric.get(0);var rubric=new OpenAssessment.Rubric(rubricElement);rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled,view,$staffGradeTab));rubric.changesExistCallback($.proxy(view.assessmentRubricChanges,view,view.FULL_GRADE_UNSAVED_WARNING_KEY));$staffGradeTab.find(".wrapper--staff-assessment .action--submit").click(function(eventObject){var submissionID=$staffGradeTab.find(".staff__grade__form").data("submission-uuid");eventObject.preventDefault();view.submitStaffGrade(submissionID,rubric,$staffGradeTab,$(eventObject.currentTarget).hasClass("continue_grading--action"))})}$staffGradeContent.slideDown(function(){$staffGradeControl.focus();view.baseView.setUpCollapseExpand($(".staff__grade__form",view.element))});$staffGradeContainer.addClass(view.baseView.IS_SHOWING_CLASS);deferred.resolve()}).fail(function(){showFormError(gettext("Unexpected server error."));view.staffGradeFormLoaded=false;deferred.reject()})}return deferred.promise()},closeStaffGradeForm:function(clear){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",view.element);var $staffGradeControl=$staffGradeTab.find("."+view.baseView.SLIDABLE_CLASS).first();var $staffGradeContent=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTENT_CLASS);var $staffGradeContainer=$staffGradeTab.find("."+view.baseView.SLIDABLE_CONTAINER_CLASS);$staffGradeControl.attr("aria-expanded","false");if(clear){$staffGradeTab.find(".staff__grade__form").replaceWith('<div class="staff__grade__form"></div>');this.updateStaffGradeCounts()}else{$staffGradeContent.slideUp()}$staffGradeContainer.removeClass(view.baseView.IS_SHOWING_CLASS);$staffGradeControl.focus()},updateStaffGradeCounts:function(){var view=this;var $staffGradeTab=$(".openassessment__staff-grading",this.element);view.server.staffGradeCounts().done(function(html){$staffGradeTab.find(".staff__grade__status").replaceWith(html)}).fail(function(){$staffGradeTab.find(".staff__grade__status").replaceWith('<span class="staff__grade__status"><span class="staff__grade__value"><span class="copy">'+gettext("Error getting the number of ungraded responses")+"</span></span></span>")})},installHandlers:function(){var view=this;var $staffArea=$(".openassessment__staff-area",this.element);var $manageLearnersTab=$(".openassessment__staff-tools",$staffArea);var $staffGradeTool=$(".openassessment__staff-grading",$staffArea);if($staffArea.length<=0){return}$staffArea.find(".ui-staff__button").click(function(eventObject){$staffArea.find(".ui-staff__button").each(function(index,button){if(button!==eventObject.currentTarget){var $panel=$staffArea.find("."+$(button).data("panel")).first();$panel.slideUp(0)}});var $button=$(eventObject.currentTarget),$panel=$staffArea.find("."+$button.data("panel")).first();if($button.hasClass("is--active")){$button.removeClass("is--active").attr("aria-expanded","false");$panel.slideUp()}else{$staffArea.find(".ui-staff__button").removeClass("is--active").attr("aria-expanded","false");$button.addClass("is--active").attr("aria-expanded","true");$panel.slideDown()}$panel.find(".ui-staff_close_button").focus()});$staffArea.find(".ui-staff_close_button").click(function(eventObject){var $button=$(eventObject.currentTarget),$panel=$button.closest(".wrapper--ui-staff");$staffArea.find(".ui-staff__button").removeClass("is--active").attr("aria-expanded","false");$panel.slideUp();$staffArea.find(".ui-staff__button").each(function(index,button){var $staffPanel=$staffArea.find("."+$(button).data("panel")).first();if($staffPanel[0]===$panel[0]){$(button).focus()}})});$manageLearnersTab.find(".openassessment_student_info_form").submit(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});$manageLearnersTab.find(".action--submit-username").click(function(eventObject){eventObject.preventDefault();view.loadStudentInfo()});$manageLearnersTab.find(".action--submit-training").click(function(eventObject){eventObject.preventDefault();view.scheduleTraining()});$manageLearnersTab.find(".action--submit-unfinished-tasks").click(function(eventObject){eventObject.preventDefault();view.rescheduleUnfinishedTasks()});$staffGradeTool.find(".staff__grade__show-form").click(function(event){var $container=$(event.currentTarget).closest("."+view.baseView.SLIDABLE_CONTAINER_CLASS);var wasShowing=$container.hasClass(view.baseView.IS_SHOWING_CLASS);if(wasShowing){view.closeStaffGradeForm(false)}else{view.loadStaffGradeForm()}})},scheduleTraining:function(){var view=this;this.server.scheduleTraining().done(function(msg){$(".schedule_training_message",view.element).text(msg)}).fail(function(errMsg){$(".schedule_training_message",view.element).text(errMsg)})},rescheduleUnfinishedTasks:function(){var view=this;this.server.rescheduleUnfinishedTasks().done(function(msg){$(".reschedule_unfinished_tasks_message",view.element).text(msg)}).fail(function(errMsg){$(".reschedule_unfinished_tasks_message",view.element).text(errMsg)})},cancelSubmission:function(submissionUUID){this.cancelSubmissionEnabled(false);var view=this;var comments=$(".cancel_submission_comments",this.element).val();this.server.cancelSubmission(submissionUUID,comments).done(function(){view.loadStudentInfo("staff-info__student__grade")}).fail(function(errorMessage){$(".cancel-submission-error").html(_.escape(errorMessage))})},cancelSubmissionEnabled:function(enabled){return this.baseView.buttonEnabled(".action--submit-cancel-submission",enabled)},comment:function(text){var $submissionComments=$(".cancel_submission_comments",this.element);if(typeof text==="undefined"){return $submissionComments.val()}else{$submissionComments.val(text)}},handleCommentChanged:function(){var isBlank=$.trim(this.comment())!=="";this.cancelSubmissionEnabled(isBlank)},staffSubmitEnabled:function(scope,enabled){return this.baseView.buttonEnabled(".wrapper--staff-assessment .action--submit",enabled)},assessmentRubricChanges:function(key,changesExist){if(changesExist){this.baseView.unsavedWarningEnabled(true,key,gettext("If you leave this page without submitting your staff assessment, you will lose any work you have done."))}},submitStaffOverride:function(submissionID,rubric,scope){var view=this;var successCallback=function(){view.baseView.unsavedWarningEnabled(false,view.OVERRIDE_UNSAVED_WARNING_KEY);view.loadStudentInfo("staff-info__student__grade")};this.callStaffAssess(submissionID,rubric,scope,successCallback,".staff-override-error","regrade")},submitStaffGrade:function(submissionID,rubric,scope,continueGrading){var view=this;var successCallback=function(){view.baseView.unsavedWarningEnabled(false,view.FULL_GRADE_UNSAVED_WARNING_KEY);view.staffGradeFormLoaded=false;if(continueGrading){view.loadStaffGradeForm();view.baseView.scrollToTop(".openassessment__staff-area")}else{view.closeStaffGradeForm(true)}};this.callStaffAssess(submissionID,rubric,scope,successCallback,".staff-grade-error","full-grade")},callStaffAssess:function(submissionID,rubric,scope,successCallback,errorSelector,assessType){var view=this;view.staffSubmitEnabled(scope,false);this.server.staffAssess(rubric.optionsSelected(),rubric.criterionFeedback(),rubric.overallFeedback(),submissionID,assessType).done(successCallback).fail(function(errorMessage){scope.find(errorSelector).html(_.escape(errorMessage));view.staffSubmitEnabled(scope,true)})}}})(OpenAssessment);OpenAssessment.StudentTrainingView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView;this.rubric=null;this.isRendering=false;this.announceStatus=false};OpenAssessment.StudentTrainingView.prototype={load:function(usageID){var view=this;var stepID=".step--student-training";var focusID="[id='oa_training_"+usageID+"']";view.isRendering=true;this.server.render("student_training").done(function(html){$(stepID,view.element).replaceWith(html);view.isRendering=false;view.server.renderLatex($(stepID,view.element));view.installHandlers();view.baseView.announceStatusChangeToSRandFocus(stepID,usageID,false,view,focusID);view.announceStatus=false}).fail(function(){view.baseView.showLoadError("student-training")})},installHandlers:function(){var sel=$(".step--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();view.announceStatus=true})},assess:function(){this.assessButtonEnabled(false);var options={};if(this.rubric!==null){options=this.rubric.optionsSelected()}var view=this;var baseView=this.baseView;var usageID=baseView.getUsageID();this.server.trainingAssess(options).done(function(corrections){var incorrect=$(".openassessment__student-training--incorrect",view.element);var instructions=$(".openassessment__student-training--instructions",view.element);var $questionAnswers=$(".question__answers",view.rubric.element);if(!view.rubric.showCorrections(corrections)){view.load(usageID);baseView.loadAssessmentModules(usageID);incorrect.addClass("is--hidden");instructions.removeClass("is--hidden")}else{instructions.addClass("is--hidden");incorrect.removeClass("is--hidden");$questionAnswers.each(function(index,answer){var $notification=$(".step__message.message",view.rubric.element).not(".is--hidden");$(answer).attr("aria-describedby",$($notification[index]).attr("id"))});baseView.srReadTexts([gettext("Feedback available for selection.")])}baseView.scrollToTop(".step--student-training")}).fail(function(errMsg){baseView.toggleActionError("student-training",errMsg);view.assessButtonEnabled(true)})},assessButtonEnabled:function(isEnabled){return this.baseView.buttonEnabled(".student-training--001__assessment__submit",isEnabled)}};
......@@ -98,6 +98,7 @@ OpenAssessment.StudentTrainingView.prototype = {
function(corrections) {
var incorrect = $(".openassessment__student-training--incorrect", view.element);
var instructions = $(".openassessment__student-training--instructions", view.element);
var $questionAnswers = $(".question__answers", view.rubric.element);
if (!view.rubric.showCorrections(corrections)) {
view.load(usageID);
......@@ -107,6 +108,11 @@ OpenAssessment.StudentTrainingView.prototype = {
} else {
instructions.addClass("is--hidden");
incorrect.removeClass("is--hidden");
$questionAnswers.each(function (index, answer) {
var $notification = $(".step__message.message", view.rubric.element).not(".is--hidden");
$(answer).attr('aria-describedby', $($notification[index]).attr('id'));
});
baseView.srReadTexts([gettext('Feedback available for selection.')])
}
baseView.scrollToTop(".step--student-training");
}
......
......@@ -41,6 +41,12 @@ class BaseAssessmentPage(PageObject):
def get_sr_html(self):
return self.q(css='.sr.reader-feedback').html
def confirm_feedback_text(self, text):
def is_text_in_feedback():
return text in self.get_sr_html()[0]
self.wait_for(is_text_in_feedback, 'Waiting for %s, in %s' % (text, self.q(css='.sr.reader-feedback').html[0]))
class MultipleAssessmentPage(BaseAssessmentPage):
"""
......
......@@ -790,25 +790,22 @@ class FullWorkflowMixin(object):
(str, str): the username and password of the newly created user
"""
username, email = self.do_submission()
actual = self.submission_page.get_sr_html()
EmptyPromise(self.submission_page.button(".step--student-training").is_focused(),
"Student training button should be focused")
self.assertIn('Your Response Complete', actual[0])
self.assertIn('Learn to Assess Responses In Progress (1 of 2)', actual[0])
self.submission_page.confirm_feedback_text('Your Response Complete')
self.submission_page.confirm_feedback_text('Learn to Assess Responses In Progress (1 of 2)')
self.do_training()
actual = self.submission_page.get_sr_html()
EmptyPromise(self.submission_page.button(".step--self-assessment").is_focused(),
"Self assessment button should be focused")
self.assertIn('Learn to Assess Responses Complete', actual[0])
self.assertIn('Assess Your Response In Progress', actual[0])
self.submission_page.confirm_feedback_text('Learn to Assess Responses Complete')
self.submission_page.confirm_feedback_text('Assess Your Response In Progress')
self.submit_self_assessment(self.SELF_ASSESSMENT)
actual = self.submission_page.get_sr_html()
EmptyPromise(self.submission_page.button(".step--grade").is_focused(),
"Grade button should be focused")
self.assertIn('Assess Your Response Complete', actual[0])
self.assertIn('Assess Peers In Progress (1 of 1)', actual[0])
self.submission_page.confirm_feedback_text('Assess Your Response Complete')
self.submission_page.confirm_feedback_text('Assess Peers In Progress (1 of 1)')
return username, email
......
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