Commit 17aeea37 by Jonathan Piacenti

Add instructional message to step blocks.

parent addea00c
...@@ -229,3 +229,17 @@ ...@@ -229,3 +229,17 @@
.pb-clarification span.clarification i:hover { .pb-clarification span.clarification i:hover {
color: rgb(0, 159, 230); color: rgb(0, 159, 230);
} }
.mentoring .sb-step {
position: relative;
}
.mentoring .sb-step .sb-step-message {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 1.5em;
background-color: white;
box-shadow: 0 10px 20px #5C5C5C;
}
\ No newline at end of file
...@@ -22,6 +22,7 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -22,6 +22,7 @@ function MentoringWithStepsBlock(runtime, element) {
var activeStep = $('.mentoring', element).data('active-step'); var activeStep = $('.mentoring', element).data('active-step');
var reviewTipsTemplate = _.template($('#xblock-review-tips-template').html()); // Tips about specific questions the user got wrong var reviewTipsTemplate = _.template($('#xblock-review-tips-template').html()); // Tips about specific questions the user got wrong
var attemptsTemplate = _.template($('#xblock-attempts-template').html()); var attemptsTemplate = _.template($('#xblock-attempts-template').html());
var message = $('.sb-step-message', element);
var checkmark, submitDOM, nextDOM, reviewDOM, tryAgainDOM, var checkmark, submitDOM, nextDOM, reviewDOM, tryAgainDOM,
gradeDOM, attemptsDOM, reviewTipsDOM, reviewLinkDOM, submitXHR; gradeDOM, attemptsDOM, reviewTipsDOM, reviewLinkDOM, submitXHR;
...@@ -183,6 +184,7 @@ function MentoringWithStepsBlock(runtime, element) { ...@@ -183,6 +184,7 @@ function MentoringWithStepsBlock(runtime, element) {
hideReviewStep(); hideReviewStep();
attemptsDOM.html(''); attemptsDOM.html('');
reviewTipsDOM.empty().hide(); reviewTipsDOM.empty().hide();
message.hide();
} }
function updateNextLabel() { function updateNextLabel() {
......
...@@ -10,7 +10,8 @@ function MentoringStepBlock(runtime, element) { ...@@ -10,7 +10,8 @@ function MentoringStepBlock(runtime, element) {
} }
} }
var submitXHR, resultsXHR; var submitXHR, resultsXHR,
message = $(element).find('.sb-step-message');
function callIfExists(obj, fn) { function callIfExists(obj, fn) {
if (typeof obj !== 'undefined' && typeof obj[fn] == 'function') { if (typeof obj !== 'undefined' && typeof obj[fn] == 'function') {
...@@ -59,6 +60,12 @@ function MentoringStepBlock(runtime, element) { ...@@ -59,6 +60,12 @@ function MentoringStepBlock(runtime, element) {
submitXHR = $.post(handlerUrl, JSON.stringify(data)) submitXHR = $.post(handlerUrl, JSON.stringify(data))
.success(function(response) { .success(function(response) {
resultHandler(response); resultHandler(response);
if (message.length) {
message.fadeIn();
$(document).click(function() {
message.fadeOut();
});
}
}); });
}, },
......
...@@ -107,7 +107,12 @@ class MentoringStepBlock( ...@@ -107,7 +107,12 @@ class MentoringStepBlock(
default=_("Next Step") default=_("Next Step")
) )
editable_fields = ('display_name', 'show_title', 'next_button_label') message = String(
display_name=_("Message"),
help=_("Feedback or instructional message which pops up after submitting."),
)
editable_fields = ('display_name', 'show_title', 'next_button_label', 'message')
@lazy @lazy
def siblings(self): def siblings(self):
......
...@@ -14,4 +14,9 @@ ...@@ -14,4 +14,9 @@
{% for child_content in child_contents %} {% for child_content in child_contents %}
{{ child_content|safe }} {{ child_content|safe }}
{% endfor %} {% endfor %}
{% if self.message %}
<div class="sb-step-message" style="display:none;">
<div class="sb-step-message-text">{{ self.message }}</div>
</div>
{% endif %}
</div> </div>
...@@ -81,7 +81,9 @@ class StepBuilderTest(MentoringAssessmentBaseTest): ...@@ -81,7 +81,9 @@ class StepBuilderTest(MentoringAssessmentBaseTest):
runtime_patcher.start() runtime_patcher.start()
self.addCleanup(runtime_patcher.stop) self.addCleanup(runtime_patcher.stop)
def freeform_answer(self, number, step_builder, controls, text_input, result, saved_value="", last=False): def freeform_answer(
self, number, step_builder, controls, text_input, result, saved_value="", hold=False, last=False
):
self.expect_question_visible(number, step_builder) self.expect_question_visible(number, step_builder)
answer = step_builder.find_element_by_css_selector("textarea.answer.editable") answer = step_builder.find_element_by_css_selector("textarea.answer.editable")
...@@ -92,7 +94,11 @@ class StepBuilderTest(MentoringAssessmentBaseTest): ...@@ -92,7 +94,11 @@ class StepBuilderTest(MentoringAssessmentBaseTest):
self.assertEquals(saved_value, answer.get_attribute("value")) self.assertEquals(saved_value, answer.get_attribute("value"))
if not saved_value: if not saved_value:
self.assert_disabled(controls.submit) self.assert_disabled(controls.submit)
self.assert_disabled(controls.next_question)
if last:
self.assert_disabled(controls.review)
else:
self.assert_disabled(controls.next_question)
answer.clear() answer.clear()
answer.send_keys(text_input) answer.send_keys(text_input)
...@@ -100,14 +106,17 @@ class StepBuilderTest(MentoringAssessmentBaseTest): ...@@ -100,14 +106,17 @@ class StepBuilderTest(MentoringAssessmentBaseTest):
self.assert_clickable(controls.submit) self.assert_clickable(controls.submit)
self.ending_controls(controls, last) self.ending_controls(controls, last)
self.assert_hidden(controls.review) if not last:
self.assert_hidden(controls.review)
self.assert_hidden(controls.try_again) self.assert_hidden(controls.try_again)
controls.submit.click() controls.submit.click()
self.do_submit_wait(controls, last) self.do_submit_wait(controls, last)
self._assert_checkmark(step_builder, result) self._assert_checkmark(step_builder, result)
self.do_post(controls, last) if not hold:
self.do_post(controls, last)
def single_choice_question(self, number, step_builder, controls, choice_name, result, last=False): def single_choice_question(self, number, step_builder, controls, choice_name, result, last=False):
question = self.expect_question_visible(number, step_builder) question = self.expect_question_visible(number, step_builder)
...@@ -1121,3 +1130,15 @@ class StepBuilderTest(MentoringAssessmentBaseTest): ...@@ -1121,3 +1130,15 @@ class StepBuilderTest(MentoringAssessmentBaseTest):
visible_overlays=[], visible_overlays=[],
hidden_overlays=[teacher_overlay, researchers_overlay, sheldon_overlay, yoda_overlay] hidden_overlays=[teacher_overlay, researchers_overlay, sheldon_overlay, yoda_overlay]
) )
def test_instruction_message(self):
step_builder, controls = self.load_assessment_scenario("step_builder_instruction.xml", {})
# Step 1
# Submit free-form answer, go to next step
self.freeform_answer(None, step_builder, controls, 'This is the answer', CORRECT, hold=True, last=True)
message = step_builder.find_element_by_css_selector('.sb-step-message')
self.wait_until_visible(message)
self.assertEqual(message.text, 'Hello!')
# Clicking in general should dismiss this message.
self.browser.execute_script("$(document).trigger('click')")
self.wait_until_hidden(message)
<step-builder url_name="step-builder" display_name="Step Builder"
max_attempts="1" extended_feedback="True">
<sb-step display_name="First step" next_button_label="Next Challenge" message="Hello!">
<pb-answer name="goal" question="What is your goal?" />
</sb-step>
<sb-review-step />
</step-builder>
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