Commit 2931e698 by Will Daly Committed by Stephen Sanchez

Add student training JavaScript

parent 9e3192de
{% load i18n %}
{% load tz %}
{% spaceless %}
{% block list_item %}
<li id="openassessment__student-training" class="openassessment__steps__step step--student-training ui-toggle-visibility">
{% endblock %}
{% block list_item %}
<li id="openassessment__student-training" class="openassessment__steps__step step--student-training ui-toggle-visibility">
{% endblock %}
<header class="step__header ui-toggle-visibility__control">
<h2 class="step__title">
<span class="step__counter"></span>
<span class="wrapper--copy">
<span class="step__label">{% trans "Learn to Assess" %}</span>
{% if self_start %}
{% if training_start %}
<span class="step__deadline">{% trans "available" %}
<span class="date">
{{ self_start|utc|date:"N j, Y H:i e" }}
(in {{ self_start|timeuntil }})
{{ training_start|utc|date:"N j, Y H:i e" }}
(in {{ training_start|timeuntil }})
</span>
</span>
{% elif training_due %}
......@@ -44,11 +44,11 @@
<div class="step__content">
<article class="student-training__display" id="student-training">
<header class="student-training__display__header">
<h3 class="student-training__display__title">{% trans "Your Response" %}</h3>
<h3 class="student-training__display__title">{% trans "Training Essay" %}</h3>
</header>
<div class="student-training__display__response">
{{ training_essay.text|linebreaks }}
{{ training_essay|linebreaks }}
</div>
</article>
......@@ -62,7 +62,20 @@
<span class="question__title__copy">{{ criterion.prompt }}</span>
<span class="label--required sr">* ({% trans "Required" %})</span>
</h4>
<div class="step__message message message--correct ui-toggle-visibility is--hidden">
<h3 class="message__title">{% trans "Correct Selection" %}</h3>
<div class="message__content">
<p>{% trans "Your selection matches staff." %}</p>
</div>
</div>
<div class="step__message message message--incorrect ui-toggle-visibility is--hidden">
<h3 class="message__title">{% trans "Incorrect Selection" %}</h3>
<div class="message__content">
<p>{% trans "Your selection does not match staff." %}</p>
</div>
</div>
<div class="ui-toggle-visibility__content">
<ol class="question__answers">
{% for option in criterion.options %}
......
......@@ -343,7 +343,7 @@
.list--options:last-child,
.nav--wizard:last-child,
.list--tips:last-child,
.field--group:last-child, .wrapper--xblock .field--radio .option:last-child, .wrapper--xblock .field--checkbox .option:last-child, .wrapper--xblock .message .message__content p:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:last-child, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:last-child, .wrapper--xblock .ui-staff__content__section:last-child, .openassessment .openassessment__steps__step .step__content__section:last-child, .openassessment .openassessment__prompt__copy > :last-child, .openassessment .submission__peer-evaluations__questions .question:last-child, .openassessment .submission__peer-evaluations__questions .question__answers:last-child, .openassessment .answer--feedback .feedback:last-child {
.field--group:last-child, .wrapper--xblock .field--radio .option:last-child, .wrapper--xblock .field--checkbox .option:last-child, .wrapper--xblock .message .message__content p:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:last-child, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:last-child, .step--student-training .student-training__assessment .assessment__rubric__question:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:last-child, .step--student-training .student-training__assessment .question__answers .answer:last-child, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:last-child, .step--student-training .student-training__assessment .question__answers .answer--feedback:last-child, .wrapper--xblock .ui-staff__content__section:last-child, .openassessment .openassessment__steps__step .step__content__section:last-child, .openassessment .openassessment__prompt__copy > :last-child, .openassessment .submission__peer-evaluations__questions .question:last-child, .openassessment .submission__peer-evaluations__questions .question__answers:last-child, .openassessment .answer--feedback .feedback:last-child {
margin-bottom: 0;
border-bottom: none;
padding-bottom: 0;
......@@ -448,7 +448,7 @@ hr.divider,
.wrapper--xblock strong, .wrapper--xblock .emphasis, .openassessment .openassessment__steps__step .step__actions .action--submit, .openassessment .openassessment__steps__step .step__actions .action--submit .copy, .openassessment .step--response .response__submission__actions .action--save, .openassessment .submission__feedback__actions .action--submit, .staff-info__student .action--submit, .openassessment .step--response .response__submission__actions .action--save .copy, .openassessment .submission__feedback__actions .action--submit .copy, .staff-info__student .action--submit .copy, .wrapper--xblock input[type="text"],
.wrapper--xblock input[type="email"],
.wrapper--xblock input[type="password"],
.wrapper--xblock textarea, .wrapper--xblock .field--textarea .label, .wrapper--xblock .field--textarea label, .wrapper--xblock .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .is--transitioning .transition__status .copy, .openassessment .openassessment__steps__step .step__title .step__label, .openassessment .step--grade .step__title .grade__value__title, .wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .wrapper--xblock .staff-info__title__copy, .wrapper--xblock .staff-info__summary .value, .wrapper--xblock .staff-info__status__table .value, .openassessment .openassessment__steps__step .step__title .step__counter:before, .openassessment .step--peer-assessment .peer-assessment__display__header span, .openassessment .step--grade .step__title .grade__value__title .grade__value__earned, .openassessment .step--grade .step__title .grade__value__title .grade__value__potential, .openassessment .submission__peer-evaluations__questions .question__score__value, .openassessment .submission__peer-evaluations__questions .question__score__potential, .openassessment .submission__peer-evaluations__questions .question__score__potential .unit, .openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .submission__peer-evaluations__questions .answer__value__value, .openassessment .answer--feedback .feedback__source, .openassessment .openassessment__steps .openassessment__steps__step .step__header h2.step__title .step__counter:before {
.wrapper--xblock textarea, .wrapper--xblock .field--textarea .label, .wrapper--xblock .field--textarea label, .wrapper--xblock .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .is--transitioning .transition__status .copy, .openassessment .openassessment__steps__step .step__title .step__label, .openassessment .step--grade .step__title .grade__value__title, .wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .step--student-training .student-training__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .step--student-training .student-training__display__title, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__label, .wrapper--xblock .staff-info__title__copy, .wrapper--xblock .staff-info__summary .value, .wrapper--xblock .staff-info__status__table .value, .openassessment .openassessment__steps__step .step__title .step__counter:before, .openassessment .step--peer-assessment .peer-assessment__display__header span, .openassessment .step--grade .step__title .grade__value__title .grade__value__earned, .openassessment .step--grade .step__title .grade__value__title .grade__value__potential, .openassessment .submission__peer-evaluations__questions .question__score__value, .openassessment .submission__peer-evaluations__questions .question__score__potential, .openassessment .submission__peer-evaluations__questions .question__score__potential .unit, .openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .submission__peer-evaluations__questions .answer__value__value, .openassessment .answer--feedback .feedback__source, .openassessment .openassessment__steps .openassessment__steps__step .step__header h2.step__title .step__counter:before {
font-weight: 600; }
.wrapper--xblock input[type="text"]::-webkit-input-placeholder,
......@@ -466,11 +466,11 @@ hr.divider,
.wrapper--xblock textarea:-ms-input-placeholder, .openassessment .openassessment__title {
font-weight: 400; }
.openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .answer--feedback .feedback__source, .wrapper--xblock .field .tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .ui-hint:after {
.openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .answer--feedback .feedback__source, .wrapper--xblock .field .tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .ui-hint:after {
font-size: 12px;
line-height: 18px; }
.wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .openassessment .openassessment__steps__step .step__title .step__deadline, .wrapper--xblock .field label, .wrapper--xblock .field .label, .wrapper--xblock .field .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .message .message__content, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .wrapper--xblock .staff-info__status__table, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content, .openassessment .answer--feedback .feedback__value, .openassessment .openassessment__steps__step .step__actions .action--submit, .openassessment .step--response .response__submission__actions .action--save, .openassessment .answer--feedback .answer--feedback__title, .openassessment .submission__feedback__actions .action--submit, .staff-info__student .action--submit, .openassessment .openassessment__steps__step .step__status .ico {
.wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .step--student-training .student-training__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .step--student-training .student-training__display__title, .openassessment .openassessment__steps__step .step__title .step__deadline, .wrapper--xblock .field label, .wrapper--xblock .field .label, .wrapper--xblock .field .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .message .message__content, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip, .wrapper--xblock .staff-info__status__table, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content, .openassessment .answer--feedback .feedback__value, .step--student-training .student-training__display__response, .openassessment .openassessment__steps__step .step__actions .action--submit, .openassessment .step--response .response__submission__actions .action--save, .openassessment .answer--feedback .answer--feedback__title, .openassessment .submission__feedback__actions .action--submit, .staff-info__student .action--submit, .openassessment .openassessment__steps__step .step__status .ico {
font-size: 14px;
line-height: 21px; }
......@@ -486,7 +486,7 @@ hr.divider,
font-size: 22px;
line-height: 33px; }
.wrapper--xblock .problem__header, .wrapper--xblock .is--transitioning .transition__status .copy, .wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .answer--feedback .feedback__source {
.wrapper--xblock .problem__header, .wrapper--xblock .is--transitioning .transition__status .copy, .wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .step--student-training .student-training__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .step--student-training .student-training__display__title, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .answer--feedback .feedback__source {
text-transform: uppercase;
letter-spacing: 0.05rem; }
......@@ -496,7 +496,7 @@ hr.divider,
.wrapper--xblock .problem__header {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; }
.wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .openassessment .openassessment__steps__step .step__title .step__deadline {
.wrapper--xblock .message .message__title, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .step--student-training .student-training__assessment .assessment__rubric__question .question__title__copy, .wrapper--xblock .ui-staff__title, .openassessment .step--peer-assessment .peer-assessment__display__header .peer-assessment__display__title, .openassessment .step--self-assessment .self-assessment__display__title, .openassessment .submission__answer__display__title, .openassessment .submission__peer-evaluations__title, .openassessment .submission__peer-evaluations__questions .question__title__copy, .openassessment .submission__feedback__title, .openassessment .submission__feedback__title__copy, .step--student-training .student-training__display__title, .openassessment .openassessment__steps__step .step__title .step__deadline {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; }
.openassessment .submission__peer-evaluations__questions .answer__source, .openassessment .answer--feedback .feedback__source {
......@@ -505,10 +505,10 @@ hr.divider,
.openassessment .openassessment__steps__step .step__instruction, .openassessment .openassessment__prompt__copy, .openassessment .step--grade .grade__value__description, .openassessment .step--grade .grade__summary, .openassessment .submission__feedback__instructions {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; }
.wrapper--xblock .field label, .wrapper--xblock .field .label, .wrapper--xblock .field .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .message .message__content, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .wrapper--xblock .staff-info__status__table, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content, .openassessment .answer--feedback .feedback__value {
.wrapper--xblock .field label, .wrapper--xblock .field .label, .wrapper--xblock .field .field-group__label, .wrapper--xblock .field--radio .option__label, .wrapper--xblock .field--checkbox .option__label, .wrapper--xblock .message .message__content, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip, .wrapper--xblock .staff-info__status__table, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content, .openassessment .answer--feedback .feedback__value, .step--student-training .student-training__display__response {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; }
.wrapper--xblock .field .tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .ui-hint:after {
.wrapper--xblock .field .tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points, .openassessment .openassessment__steps__step .step__status .copy, .openassessment .step--response .response__submission__content .tip, .openassessment .step--response .response__submission__status__title, .openassessment .submission__peer-evaluations__questions .question__score, .openassessment .submission__peer-evaluations__questions .answer__score, .openassessment .submission__peer-evaluations__questions .answer__score__value, .wrapper--xblock .staff-info__status__table th, .openassessment .ui-hint:after {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; }
.openassessment .openassessment__steps__step .step__actions .action--submit, .openassessment .step--response .response__submission__actions .action--save, .openassessment .answer--feedback .answer--feedback__title, .openassessment .submission__feedback__actions .action--submit, .staff-info__student .action--submit {
......@@ -674,14 +674,14 @@ hr.divider,
.wrapper--xblock .message--confirmation .message__title {
color: #2d2e30;
border-bottom-color: #2d2e30; }
.wrapper--xblock .message--complete {
.wrapper--xblock .message--complete, .wrapper--xblock .step--student-training .message--correct, .step--student-training .wrapper--xblock .message--correct {
background: #f7fbf5; }
.wrapper--xblock .message--complete .message__title {
.wrapper--xblock .message--complete .message__title, .wrapper--xblock .step--student-training .message--correct .message__title, .step--student-training .wrapper--xblock .message--correct .message__title {
color: #62c24a;
border-bottom-color: #62c24a; }
.wrapper--xblock .message--incomplete {
.wrapper--xblock .message--incomplete, .wrapper--xblock .step--student-training .message--incorrect, .step--student-training .wrapper--xblock .message--incorrect {
background: #fdfaf4; }
.wrapper--xblock .message--incomplete .message__title {
.wrapper--xblock .message--incomplete .message__title, .wrapper--xblock .step--student-training .message--incorrect .message__title, .step--student-training .wrapper--xblock .message--incorrect .message__title {
color: #e5a635;
border-bottom-color: #e5a635; }
.wrapper--xblock .message--error {
......@@ -1131,7 +1131,7 @@ hr.divider,
.openassessment .is--closed.openassessment__steps__step, .openassessment .is--incomplete.openassessment__steps__step {
border-top-color: #e5a635; }
.openassessment .step--peer-assessment .peer-assessment__display, .openassessment .step--self-assessment .self-assessment__display, .openassessment .submission__peer-evaluations, .openassessment .submission__feedback {
.openassessment .step--peer-assessment .peer-assessment__display, .openassessment .step--self-assessment .self-assessment__display, .openassessment .submission__peer-evaluations, .openassessment .submission__feedback, .step--student-training .student-training__display {
margin-bottom: 20px; }
.openassessment .submission__feedback__title {
......@@ -1139,188 +1139,188 @@ hr.divider,
border-bottom: 2px solid #d7dbdf;
padding-bottom: 10px; }
.openassessment .step--peer-assessment .peer-assessment__display__response p, .openassessment .step--self-assessment .self-assessment__display__response p, .openassessment .submission__answer__display__content p, .openassessment .submission__peer-evaluations__questions p, .openassessment .submission__feeedback__content p, .openassessment .submission__feedback__actions p {
.openassessment .step--peer-assessment .peer-assessment__display__response p, .openassessment .step--self-assessment .self-assessment__display__response p, .openassessment .submission__answer__display__content p, .openassessment .submission__peer-evaluations__questions p, .openassessment .submission__feeedback__content p, .openassessment .submission__feedback__actions p, .step--student-training .student-training__display__response p {
margin-bottom: 20px; }
.openassessment .step--peer-assessment .peer-assessment__display__response p:last-child, .openassessment .step--self-assessment .self-assessment__display__response p:last-child, .openassessment .submission__answer__display__content p:last-child, .openassessment .submission__peer-evaluations__questions p:last-child, .openassessment .submission__feeedback__content p:last-child, .openassessment .submission__feedback__actions p:last-child {
.openassessment .step--peer-assessment .peer-assessment__display__response p:last-child, .openassessment .step--self-assessment .self-assessment__display__response p:last-child, .openassessment .submission__answer__display__content p:last-child, .openassessment .submission__peer-evaluations__questions p:last-child, .openassessment .submission__feeedback__content p:last-child, .openassessment .submission__feedback__actions p:last-child, .step--student-training .student-training__display__response p:last-child {
margin-bottom: 0; }
.openassessment .openassessment__prompt, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content {
.openassessment .openassessment__prompt, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .submission__answer__display__content, .step--student-training .student-training__display__response {
box-shadow: inset 0 1px 2px 1px rgba(2, 2, 3, 0.1);
padding: 20px 20px;
background: #fdfdfd; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--response .response__submission__content textarea, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question--feedback textarea, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question--feedback textarea, .openassessment .submission__answer__display__content, .openassessment .submission__feedback__fields textarea {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__value, .step--student-training .student-training__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--response .response__submission__content textarea, .openassessment .step--peer-assessment .peer-assessment__display__response, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question--feedback textarea, .openassessment .step--self-assessment .self-assessment__display__response, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question--feedback textarea, .openassessment .submission__answer__display__content, .openassessment .submission__feedback__fields textarea, .step--student-training .student-training__display__response, .step--student-training .student-training__assessment .assessment__rubric__question--feedback textarea {
max-height: 300px;
overflow-y: scroll; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question, .step--student-training .student-training__assessment .assessment__rubric__question {
*zoom: 1;
margin-bottom: 40px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:before, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:before, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:after, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:after {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:before, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:before, .step--student-training .student-training__assessment .assessment__rubric__question:before, .openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:after, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:after, .step--student-training .student-training__assessment .assessment__rubric__question:after {
content: " ";
display: table; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:after, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:after {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question:after, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question:after, .step--student-training .student-training__assessment .assessment__rubric__question:after {
clear: both; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title, .step--student-training .student-training__assessment .assessment__rubric__question .question__title {
border-bottom: 2px solid #646464;
padding-bottom: 5px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title .ico, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title .ico {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title .ico, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title .ico, .step--student-training .student-training__assessment .assessment__rubric__question .question__title .ico {
display: inline-block;
vertical-align: middle; }
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy {
.openassessment .step--peer-assessment .peer-assessment__assessment .assessment__rubric__question .question__title__copy, .openassessment .step--self-assessment .self-assessment__assessment .assessment__rubric__question .question__title__copy, .step--student-training .student-training__assessment .assessment__rubric__question .question__title__copy {
margin-left: 10px;
color: #646464; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers, .openassessment .step--self-assessment .self-assessment__assessment .question__answers {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers, .openassessment .step--self-assessment .self-assessment__assessment .question__answers, .step--student-training .student-training__assessment .question__answers {
margin-top: 20px;
margin-bottom: 20px;
margin-left: 20px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer, .step--student-training .student-training__assessment .question__answers .answer, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback, .step--student-training .student-training__assessment .question__answers .answer--feedback {
*zoom: 1;
display: block;
margin-bottom: 10px;
border-bottom: 1px solid #f5f6f7;
padding-bottom: 10px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:before, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:before, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:after, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:before, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:before, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:after {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:before, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:before, .step--student-training .student-training__assessment .question__answers .answer:before, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:after, .step--student-training .student-training__assessment .question__answers .answer:after, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:before, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:before, .step--student-training .student-training__assessment .question__answers .answer--feedback:before, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:after, .step--student-training .student-training__assessment .question__answers .answer--feedback:after {
content: " ";
display: table; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:after, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:after {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer:after, .step--student-training .student-training__assessment .question__answers .answer:after, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback:after, .step--student-training .student-training__assessment .question__answers .answer--feedback:after {
clear: both; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input, .step--student-training .student-training__assessment .question__answers .wrapper--input {
margin-bottom: 5px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__label {
display: inline-block;
vertical-align: middle; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__label {
margin-bottom: 0;
color: #a5a6aa; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__value {
margin-right: 10px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value:checked + .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value:checked + .answer__label {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--input .answer__value:checked + .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--input .answer__value:checked + .answer__label, .step--student-training .student-training__assessment .question__answers .wrapper--input .answer__value:checked + .answer__label {
color: black; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata, .step--student-training .student-training__assessment .question__answers .wrapper--metadata {
display: block; }
@media screen and (min-width: 760px) and (max-width: 924px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata, .step--student-training .student-training__assessment .question__answers .wrapper--metadata {
float: left;
display: block;
margin-right: 2.35765%;
width: 65.88078%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child, .step--student-training .student-training__assessment .question__answers .wrapper--metadata:last-child {
margin-right: 0; } }
@media screen and (min-width: 925px) and (max-width: 1299px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata, .step--student-training .student-training__assessment .question__answers .wrapper--metadata {
float: left;
display: block;
margin-right: 2.35765%;
width: 65.88078%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child, .step--student-training .student-training__assessment .question__answers .wrapper--metadata:last-child {
margin-right: 0; } }
@media screen and (min-width: 1300px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata, .step--student-training .student-training__assessment .question__answers .wrapper--metadata {
float: left;
display: block;
margin-right: 2.35765%;
width: 65.88078%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .wrapper--metadata:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .wrapper--metadata:last-child, .step--student-training .student-training__assessment .question__answers .wrapper--metadata:last-child {
margin-right: 0; } }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip, .openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points {
display: block; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip {
margin-bottom: 10px;
margin-right: 20px;
color: #a5a6aa; }
@media screen and (min-width: 760px) and (max-width: 924px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip {
float: left;
display: block;
margin-right: 3.57866%;
width: 74.10533%;
float: left;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child, .step--student-training .student-training__assessment .question__answers .answer__tip:last-child {
margin-right: 0; } }
@media screen and (min-width: 925px) and (max-width: 1299px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip {
float: left;
display: block;
margin-right: 3.57866%;
width: 74.10533%;
float: left;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child, .step--student-training .student-training__assessment .question__answers .answer__tip:last-child {
margin-right: 0; } }
@media screen and (min-width: 1300px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip, .step--student-training .student-training__assessment .question__answers .answer__tip {
float: left;
display: block;
margin-right: 3.57866%;
width: 74.10533%;
float: left;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:last-child, .step--student-training .student-training__assessment .question__answers .answer__tip:last-child {
margin-right: 0; } }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:after {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__tip:after, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__tip:after, .step--student-training .student-training__assessment .question__answers .answer__tip:after {
content: ""; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points {
color: #a5a6aa; }
@media screen and (min-width: 760px) and (max-width: 924px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points {
float: right;
text-align: right; } }
@media screen and (min-width: 925px) and (max-width: 1299px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points {
float: right;
text-align: right; } }
@media screen and (min-width: 1300px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points, .step--student-training .student-training__assessment .question__answers .answer__points {
float: right;
text-align: right; } }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points__label {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer__points__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer__points__label, .step--student-training .student-training__assessment .question__answers .answer__points__label {
display: inline-block;
margin-left: 5px;
color: #a5a6aa; }
@media screen and (min-width: 530px) and (max-width: 759px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input {
float: left;
display: block;
margin-right: 4.82916%;
width: 100%; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input:last-child {
margin-right: 0; } }
@media screen and (min-width: 760px) and (max-width: 924px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input {
float: left;
display: block;
margin-right: 2.35765%;
width: 31.76157%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input:last-child {
margin-right: 0; } }
@media screen and (min-width: 925px) and (max-width: 1299px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input {
float: left;
display: block;
margin-right: 2.35765%;
width: 31.76157%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input:last-child {
margin-right: 0; } }
@media screen and (min-width: 1300px) {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input {
float: left;
display: block;
margin-right: 2.35765%;
width: 31.76157%;
margin-bottom: 0; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer .wrapper--input:last-child, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer .wrapper--input:last-child, .step--student-training .student-training__assessment .question__answers .answer .wrapper--input:last-child {
margin-right: 0; } }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__label {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__label, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__label, .step--student-training .student-training__assessment .question__answers .answer--feedback .answer__label {
margin-bottom: 5px; }
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__value {
.openassessment .step--peer-assessment .peer-assessment__assessment .question__answers .answer--feedback .answer__value, .openassessment .step--self-assessment .self-assessment__assessment .question__answers .answer--feedback .answer__value, .step--student-training .student-training__assessment .question__answers .answer--feedback .answer__value {
min-height: 100px;
margin-right: 0; }
......@@ -2097,6 +2097,33 @@ hr.divider,
.staff-info__student .student__answer__display__content p {
color: inherit; }
.step--student-training .student-training__display__header {
*zoom: 1; }
.step--student-training .student-training__display__header:before, .step--student-training .student-training__display__header:after {
content: " ";
display: table; }
.step--student-training .student-training__display__header:after {
clear: both; }
.step--student-training .student-training__display__title {
margin-bottom: 10px;
color: #aeafb3; }
.step--student-training .student-training__display__response {
color: #3c3c3c; }
.step--student-training .student-training__assessment .assessment__fields {
margin-bottom: 20px; }
.step--student-training .student-training__assessment .question__answers {
overflow: visible; }
.step--student-training .student-training__assessment .assessment__rubric__question--feedback textarea {
min-height: 100px; }
.step--student-training .is--hidden {
height: 0;
width: 0;
padding: 0 0 0 0; }
.step--student-training .is--hidden .step__header {
padding-bottom: 0;
border-bottom: none;
margin-bottom: 0; }
.openassessment .self-assessment__display__header, .openassessment .peer-assessment__display__header, .openassessment .step__header {
margin-bottom: 0 !important;
border-radius: 0 !important;
......
......@@ -45,6 +45,85 @@
"output": "oa_response.html"
},
{
"template": "openassessmentblock/student_training/student_training.html",
"context": {
"training_essay": "My special essay.",
"training_rubric": {
"criteria": [
{
"name": "Criterion 1",
"prompt": "Prompt 1",
"order_num": 0,
"feedback": "optional",
"options": [
{
"order_num": 0,
"points": 0,
"name": "Poor"
},
{
"order_num": 1,
"points": 1,
"name": "Fair"
},
{
"order_num": 2,
"points": 2,
"name": "Good"
}
]
},
{
"name": "Criterion 2",
"prompt": "Prompt 2",
"order_num": 1,
"options": [
{
"order_num": 0,
"points": 0,
"name": "Poor"
},
{
"order_num": 1,
"points": 1,
"name": "Fair"
},
{
"order_num": 2,
"points": 2,
"name": "Good"
}
]
},
{
"name": "Criterion 3",
"prompt": "Prompt 3",
"order_num": 2,
"feedback": "optional",
"options": [
{
"order_num": 0,
"points": 0,
"name": "Poor"
},
{
"order_num": 1,
"points": 1,
"name": "Fair"
},
{
"order_num": 2,
"points": 2,
"name": "Good"
}
]
}
]
}
},
"output": "oa_student_training.html"
},
{
"template": "openassessmentblock/self/oa_self_assessment.html",
"context": {
"rubric_criteria": [
......
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.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.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.peerView.load();this.selfView.load();this.gradeView.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"){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){$(function($){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.BaseView(runtime,element,server);view.load()})}OpenAssessment.StudioView=function(runtime,element,server){this.runtime=runtime;this.server=server;this.codeBox=CodeMirror.fromTextArea($(element).find(".openassessment-editor").first().get(0),{mode:"xml",lineNumbers:true,lineWrapping:true});var view=this;$(element).find(".openassessment-save-button").click(function(eventData){view.save()});$(element).find(".openassessment-cancel-button").click(function(eventData){view.cancel()})};OpenAssessment.StudioView.prototype={load:function(){var view=this;this.server.loadXml().done(function(xml){view.codeBox.setValue(xml)}).fail(function(msg){view.showError(msg)})},save:function(){var view=this;this.server.checkReleased().done(function(isReleased){if(isReleased){view.confirmPostReleaseUpdate($.proxy(view.updateXml,view))}else{view.updateXml()}}).fail(function(errMsg){view.showError(msg)})},confirmPostReleaseUpdate:function(onConfirm){var msg=gettext("This problem has already been released. Any changes will apply only to future assessments.");if(confirm(msg)){onConfirm()}},updateXml:function(){this.runtime.notify("save",{state:"start"});var xml=this.codeBox.getValue();var view=this;this.server.updateXml(xml).done(function(){view.runtime.notify("save",{state:"end"});view.load()}).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){$(function($){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.StudioView(runtime,element,server);view.load()})}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.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.showLoadError("peer-assessment")})},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.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"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)})}};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.")])})})},loadXml:function(){var url=this.url("xml");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.xml])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This problem could not be loaded.")])})}).promise()},updateXml:function(xml){var url=this.url("update_xml");var payload=JSON.stringify({xml:xml});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.StaffInfoView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.StaffInfoView.prototype={load:function(){var view=this;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()})}};
\ No newline at end of file
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.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()},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"){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){$(function($){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.BaseView(runtime,element,server);view.load()})}OpenAssessment.StudioView=function(runtime,element,server){this.runtime=runtime;this.server=server;this.codeBox=CodeMirror.fromTextArea($(element).find(".openassessment-editor").first().get(0),{mode:"xml",lineNumbers:true,lineWrapping:true});var view=this;$(element).find(".openassessment-save-button").click(function(eventData){view.save()});$(element).find(".openassessment-cancel-button").click(function(eventData){view.cancel()})};OpenAssessment.StudioView.prototype={load:function(){var view=this;this.server.loadXml().done(function(xml){view.codeBox.setValue(xml)}).fail(function(msg){view.showError(msg)})},save:function(){var view=this;this.server.checkReleased().done(function(isReleased){if(isReleased){view.confirmPostReleaseUpdate($.proxy(view.updateXml,view))}else{view.updateXml()}}).fail(function(errMsg){view.showError(msg)})},confirmPostReleaseUpdate:function(onConfirm){var msg=gettext("This problem has already been released. Any changes will apply only to future assessments.");if(confirm(msg)){onConfirm()}},updateXml:function(){this.runtime.notify("save",{state:"start"});var xml=this.codeBox.getValue();var view=this;this.server.updateXml(xml).done(function(){view.runtime.notify("save",{state:"end"});view.load()}).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){$(function($){var server=new OpenAssessment.Server(runtime,element);var view=new OpenAssessment.StudioView(runtime,element,server);view.load()})}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.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")})},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"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)})},updateRubric: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.")])})})},loadXml:function(){var url=this.url("xml");return $.Deferred(function(defer){$.ajax({type:"POST",url:url,data:'""'}).done(function(data){if(data.success){defer.resolveWith(this,[data.xml])}else{defer.rejectWith(this,[data.msg])}}).fail(function(data){defer.rejectWith(this,[gettext("This problem could not be loaded.")])})}).promise()},updateXml:function(xml){var url=this.url("update_xml");var payload=JSON.stringify({xml:xml});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.StaffInfoView=function(element,server,baseView){this.element=element;this.server=server;this.baseView=baseView};OpenAssessment.StaffInfoView.prototype={load:function(){var view=this;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()})}};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){if(!view.rubric.updateRubric(corrections)){baseView.loadAssessmentModules()}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
......@@ -10,6 +10,7 @@ describe("OpenAssessment.BaseView", function() {
// Dummy fragments to return from the render func
this.fragments = {
submission: readFixtures("oa_response.html"),
student_training: readFixtures("oa_student_training.html"),
self_assessment: readFixtures("oa_self_assessment.html"),
peer_assessment: readFixtures("oa_peer_assessment.html"),
grade: readFixtures("oa_grade_complete.html")
......@@ -69,10 +70,10 @@ describe("OpenAssessment.BaseView", function() {
it("Loads each step", function() {
loadSubviews(function() {
expect(server.fragmentsLoaded).toContain("submission");
expect(server.fragmentsLoaded).toContain("student_training");
expect(server.fragmentsLoaded).toContain("self_assessment");
expect(server.fragmentsLoaded).toContain("peer_assessment");
expect(server.fragmentsLoaded).toContain("grade");
});
});
});
......@@ -13,7 +13,7 @@ describe("OpenAssessment.PeerView", function() {
).promise();
this.peerAssess = function(optionsSelected, feedback) {
return $.Deferred(function(defer) { defer.resolve(); }).promise();
return successPromise;
};
this.render = function(step) {
......
......@@ -85,7 +85,7 @@ describe("OpenAssessment.Server", function() {
});
});
it("sends an assessment to the XBlock", function() {
it("sends a peer-assessment to the XBlock", function() {
stubAjax(true, {success: true, msg: ''});
var success = false;
......@@ -107,6 +107,29 @@ describe("OpenAssessment.Server", function() {
});
});
it("sends a training assessment to the XBlock", function() {
stubAjax(true, {success: true, msg: '', correct: true});
var success = false;
var corrections = null;
var options = {clarity: "Very clear", precision: "Somewhat precise"};
server.trainingAssess(options).done(
function(result) {
success = true;
corrections = result;
}
);
expect(success).toBe(true);
expect(corrections).toBeUndefined();
expect($.ajax).toHaveBeenCalledWith({
url: '/training_assess',
type: "POST",
data: JSON.stringify({
options_selected: options
})
});
});
it("Sends feedback on an assessment to the XBlock", function() {
stubAjax(true, {success: true, msg: ''});
......@@ -297,6 +320,28 @@ describe("OpenAssessment.Server", function() {
expect(receivedMsg).toContain("This assessment could not be submitted");
});
it("informs the caller of a server error when sending a training example assessment", function() {
stubAjax(true, {success: false, msg: "Test error!"});
var receivedMsg = null;
var options = {clarity: "Very clear", precision: "Somewhat precise"};
server.trainingAssess(options).fail(function(msg) {
receivedMsg = msg;
});
expect(receivedMsg).toEqual("Test error!");
});
it("informs the caller of an AJAX error when sending a training example assessment", function() {
stubAjax(false, null);
var receivedMsg = null;
var options = {clarity: "Very clear", precision: "Somewhat precise"};
server.trainingAssess(options).fail(function(msg) {
receivedMsg = msg;
});
expect(receivedMsg).toContain("This assessment could not be submitted");
});
it("informs the caller of an AJAX error when checking whether the XBlock has been released", function() {
stubAjax(false, null);
......
/**
Tests for OpenAssessment Student Training view.
**/
describe("OpenAssessment.StudentTrainingView", function() {
// Stub server
var StubServer = function() {
var successPromise = $.Deferred(
function(defer) { defer.resolve(); }
).promise();
this.render = function(step) {
return successPromise;
};
this.trainingAssess = function() {
return successPromise;
};
};
// Stub base view
var StubBaseView = function() {
this.showLoadError = function(msg) {};
this.toggleActionError = function(msg, step) {};
this.setUpCollapseExpand = function(sel) {};
this.scrollToTop = function() {};
this.loadAssessmentModules = function() {};
};
// Stubs
var baseView = null;
var server = null;
// View under test
var view = null;
beforeEach(function() {
// Load the DOM fixture
jasmine.getFixtures().fixturesPath = 'base/fixtures';
loadFixtures('oa_student_training.html');
// Create a new stub server
server = new StubServer();
// Create the stub base view
baseView = new StubBaseView();
// Create the object under test
var el = $("#openassessment-base").get(0);
view = new OpenAssessment.StudentTrainingView(el, server, baseView);
view.installHandlers();
});
it("submits an assessment for a training example", function() {
spyOn(server, 'trainingAssess').andCallFake(function() {
return $.Deferred(function(defer) {
return {
"Criterion 1": "Good",
"Criterion 2": "Poor",
"Criterion 3": "Fair"
};
}).promise();
});
// Select rubric options
var optionsSelected = {};
optionsSelected['Criterion 1'] = 'Poor';
optionsSelected['Criterion 2'] = 'Fair';
optionsSelected['Criterion 3'] = 'Good';
view.rubric.optionsSelected(optionsSelected);
// Submit the assessment
view.assess();
// Expect that the assessment was sent to the server
expect(server.trainingAssess).toHaveBeenCalledWith(optionsSelected);
});
it("disable the assess button when the user submits", function() {
spyOn(server, 'trainingAssess').andCallFake(function() {
return $.Deferred(function(defer) {
return {
"Criterion 1": "Good",
"Criterion 2": "Poor",
"Criterion 3": "Fair"
};
}).promise();
});
// Initially, the button should be disabled
expect(view.assessButtonEnabled()).toBe(false);
// Select options and submit an assessment
var optionsSelected = {};
optionsSelected['Criterion 1'] = 'Poor';
optionsSelected['Criterion 2'] = 'Fair';
optionsSelected['Criterion 3'] = 'Good';
view.rubric.optionsSelected(optionsSelected);
// Enable the button (we do this manually to avoid dealing with async change handlers)
view.assessButtonEnabled(true);
// Submit the assessment
view.assess();
// The button should be disabled after submission
expect(view.assessButtonEnabled()).toBe(false);
});
it("reloads the assessment steps when the user submits an assessment", function() {
spyOn(baseView, 'loadAssessmentModules').andCallThrough();
spyOn(server, 'trainingAssess').andCallFake(function() {
return $.Deferred(function(defer){return {};}).promise();
});
// Select rubric options
var optionsSelected = {};
optionsSelected['Criterion 1'] = 'Poor';
optionsSelected['Criterion 2'] = 'Fair';
optionsSelected['Criterion 3'] = 'Good';
view.rubric.optionsSelected(optionsSelected);
// Submit the assessment
view.assess();
// Expect that the assessment was sent to the server
expect(server.trainingAssess).toHaveBeenCalledWith(optionsSelected);
// Expect that the steps were reloaded
expect(baseView.loadAssessmentModules).toHaveBeenCalled();
});
});
......@@ -15,6 +15,7 @@ OpenAssessment.BaseView = function(runtime, element, server) {
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);
......@@ -75,6 +76,7 @@ OpenAssessment.BaseView.prototype = {
performed by the user.
**/
loadAssessmentModules: function() {
this.trainingView.load();
this.peerView.load();
this.selfView.load();
this.gradeView.load();
......
......@@ -31,7 +31,7 @@ OpenAssessment.PeerView.prototype = {
view.installHandlers(false);
}
).fail(function(errMsg) {
view.showLoadError('peer-assessment');
view.baseView.showLoadError('peer-assessment');
});
},
......@@ -50,7 +50,7 @@ OpenAssessment.PeerView.prototype = {
view.installHandlers(true);
}
).fail(function(errMsg) {
view.showLoadError('peer-assessment');
view.baseView.showLoadError('peer-assessment');
});
},
......
......@@ -106,5 +106,31 @@ OpenAssessment.Rubric.prototype = {
callback(canSubmit);
}
);
},
/**
Updates the rubric to display positive and negative messages on each
criterion. For each correction provided, the associated criterion will have
an appropriate message displayed.
Args: Corrections (list): A list of corrections to the rubric criteria that
did not match the expected selected options.
**/
updateRubric: function(corrections) {
var selector = "input[type=radio]";
var hasErrors = false;
// Display appropriate messages for each selection
$(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;
}
};
......@@ -296,6 +296,46 @@ OpenAssessment.Server.prototype = {
},
/**
Assess an instructor-provided training example.
Args:
optionsSelected (object literal): Keys are criteria names,
values are the option text the user selected for the criterion.
Returns:
A JQuery promise, which resolves with a boolean if successful
and fails with an error message otherwise.
Example:
var options = { clarity: "Very clear", precision: "Somewhat precise" };
server.trainingAssess(options).done(
function(isCorrect) { console.log("Success!"); }
).fail(
function(errorMsg) { console.log(errorMsg); }
);
**/
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.')]);
});
});
},
/**
Load the XBlock's XML definition from the server.
Returns:
......
/**
Interface for student training view.
Args:
element (DOM element): The DOM element representing the XBlock.
server (OpenAssessment.Server): The interface to the XBlock server.
baseView (OpenAssessment.BaseView): Container view.
Returns:
OpenAssessment.StudentTrainingView
**/
OpenAssessment.StudentTrainingView = function(element, server, baseView) {
this.element = element;
this.server = server;
this.baseView = baseView;
this.rubric = null;
};
OpenAssessment.StudentTrainingView.prototype = {
/**
Load the student training view.
**/
load: function() {
var view = this;
this.server.render('student_training').done(
function(html) {
// Load the HTML and install event handlers
$('#openassessment__student-training', view.element).replaceWith(html);
view.installHandlers();
}
).fail(function(errMsg) {
view.baseView.showLoadError('student-training');
});
},
/**
Install event handlers for the view.
**/
installHandlers: function() {
var sel = $("#openassessment__student-training", this.element);
var view = this;
// Install a click handler for collapse/expand
this.baseView.setUpCollapseExpand(sel);
// Initialize the rubric
var rubricSelector = $("#student-training--001__assessment", this.element);
if (rubricSelector.size() > 0) {
var rubricElement = rubricSelector.get(0);
this.rubric = new OpenAssessment.Rubric(rubricElement);
}
// Install a change handler for rubric options to enable/disable the submit button
if (this.rubric !== null) {
this.rubric.canSubmitCallback($.proxy(this.assessButtonEnabled, this));
}
// Install a click handler for submitting the assessment
sel.find('#student-training--001__assessment__submit').click(
function(eventObject) {
// Override default form submission
eventObject.preventDefault();
// Handle the click
view.assess();
}
);
},
/**
Submit an assessment for the training example.
**/
assess: function() {
// Immediately disable the button to prevent resubmission
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) {
if (!view.rubric.updateRubric(corrections)) {
baseView.loadAssessmentModules();
}
baseView.scrollToTop();
}
).fail(function(errMsg) {
// Display the error
baseView.toggleActionError('student-training', errMsg);
// Re-enable the button to allow the user to resubmit
view.assessButtonEnabled(true);
});
},
/**
Enable/disable the submit training assessment button.
Check that whether the assessment button is enabled.
Args:
enabled (bool): If specified, set the state of the button.
Returns:
bool: Whether the button is enabled.
Examples:
>> view.assessButtonEnabled(true); // enable the button
>> view.assessButtonEnabled(); // check whether the button is enabled
>> 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);
}
}
};
......@@ -73,11 +73,12 @@
.student__answer__display__content p {
color: inherit;
}
}
// --------------------
// Developer Styles for Student Training
// --------------------
.step--student-training {
.step--student-training {
// submission
.student-training__display {
......@@ -130,5 +131,26 @@
}
}
}
// TYPE: correct
.message--correct {
@extend .message--complete;
}
// TYPE: incorrect
.message--incorrect {
@extend .message--incomplete;
}
// Stolen from oa_base is--collapsed.
.is--hidden {
height: 0;
width: 0;
padding: 0 0 0 0;
.step__header {
padding-bottom: 0;
border-bottom: none;
margin-bottom: 0;
}
}
}
......@@ -169,5 +169,5 @@ class StudentTrainingMixin(object):
return {
'success': True,
'msg': u'',
'correct': len(corrections) == 0,
'corrections': corrections,
}
......@@ -38,7 +38,7 @@ class StudentTrainingAssessTest(XBlockHandlerTestCase):
# Expect that we were correct
self.assertTrue(resp['success'], msg=resp.get('msg'))
self.assertTrue(resp['correct'])
self.assertFalse(resp['corrections'])
@scenario('data/student_training.xml', user_id="Plato")
@ddt.file_data('data/student_training_mixin.json')
......@@ -58,7 +58,7 @@ class StudentTrainingAssessTest(XBlockHandlerTestCase):
# Expect that we were marked incorrect
self.assertTrue(resp['success'], msg=resp.get('msg'))
self.assertFalse(resp['correct'])
self.assertTrue(resp['corrections'])
@scenario('data/student_training.xml', user_id="Plato")
@ddt.file_data('data/student_training_mixin.json')
......@@ -80,7 +80,7 @@ class StudentTrainingAssessTest(XBlockHandlerTestCase):
# Expect that we were correct
self.assertTrue(resp['success'], msg=resp.get('msg'))
self.assertTrue(resp['correct'])
self.assertFalse(resp['corrections'])
# Agree with the course author's assessment
# (as defined in the scenario XML)
......@@ -98,7 +98,7 @@ class StudentTrainingAssessTest(XBlockHandlerTestCase):
# Expect that we were correct
self.assertTrue(resp['success'], msg=resp.get('msg'))
self.assertTrue(resp['correct'])
self.assertFalse(resp['corrections'])
expected_context = {}
expected_template = "openassessmentblock/student_training/student_training_complete.html"
self._assert_path_and_context(xblock, expected_template, expected_context)
......
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