Commit 260cfe7a by Will Daly Committed by gradyward

Add feedback to JS server selfAssess()

Move overall feedback method from the peer assessment JS view to the rubric

Self assessment JS sends feedback to the server
parent 188fdfde
......@@ -77,7 +77,7 @@ describe("OpenAssessment.PeerView", function() {
// Provide overall feedback
var overallFeedback = "Good job!";
view.overallFeedback(overallFeedback);
view.rubric.overallFeedback(overallFeedback);
// Submit the peer assessment
view.peerAssess();
......
......@@ -56,8 +56,28 @@ describe("OpenAssessment.SelfView", function() {
it("Sends a self assessment to the server", function() {
spyOn(server, 'selfAssess').andCallThrough();
// Select options in the rubric
var optionsSelected = {};
optionsSelected['Criterion 1'] = 'Poor';
optionsSelected['Criterion 2'] = 'Fair';
optionsSelected['Criterion 3'] = 'Good';
view.rubric.optionsSelected(optionsSelected);
// Provide per-criterion feedback
var criterionFeedback = {};
criterionFeedback['Criterion 1'] = "You did a fair job";
criterionFeedback['Criterion 3'] = "You did a good job";
view.rubric.criterionFeedback(criterionFeedback);
// Provide overall feedback
var overallFeedback = "Good job!";
view.rubric.overallFeedback(overallFeedback);
view.selfAssess();
expect(server.selfAssess).toHaveBeenCalled();
expect(server.selfAssess).toHaveBeenCalledWith(
optionsSelected, criterionFeedback, overallFeedback
);
});
it("Re-enables the self assess button on error", function() {
......
......@@ -107,6 +107,29 @@ describe("OpenAssessment.Server", function() {
});
});
it("sends a self-assessment to the XBlock", function() {
stubAjax(true, {success: true, msg: ''});
var success = false;
var options = {clarity: "Very clear", precision: "Somewhat precise"};
var criterionFeedback = {clarity: "This essay was very clear."};
server.selfAssess(options, criterionFeedback, "Excellent job!").done(
function() { success = true; }
);
expect(success).toBe(true);
expect($.ajax).toHaveBeenCalledWith({
url: '/self_assess',
type: "POST",
data: JSON.stringify({
options_selected: options,
criterion_feedback: criterionFeedback,
overall_feedback: "Excellent job!"
})
});
});
it("sends a training assessment to the XBlock", function() {
stubAjax(true, {success: true, msg: '', correct: true});
var success = false;
......@@ -241,7 +264,7 @@ describe("OpenAssessment.Server", function() {
it("informs the caller of an AJAX error when sending a self assessment", function() {
stubAjax(false, null);
var receivedMsg = null;
server.selfAssess("Test").fail(function(errorMsg) { receivedMsg = errorMsg; });
server.selfAssess("Test", {}, "Excellent job!").fail(function(errorMsg) { receivedMsg = errorMsg; });
expect(receivedMsg).toContain('This assessment could not be submitted');
});
......
......@@ -197,7 +197,7 @@ OpenAssessment.PeerView.prototype = {
this.server.peerAssess(
this.rubric.optionsSelected(),
this.rubric.criterionFeedback(),
this.overallFeedback()
this.rubric.overallFeedback()
).done(
successFunction
).fail(function(errMsg) {
......@@ -206,28 +206,5 @@ OpenAssessment.PeerView.prototype = {
});
},
/**
Get or set overall feedback on the submission.
Args:
overallFeedback (string or undefined): The overall feedback text (optional).
Returns:
string or undefined
Example usage:
>>> view.overallFeedback('Good job!'); // Set the feedback text
>>> view.overallFeedback(); // Retrieve the feedback text
'Good job!'
**/
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);
}
}
};
......@@ -47,6 +47,31 @@ OpenAssessment.Rubric.prototype = {
},
/**
Get or set overall feedback on the submission.
Args:
overallFeedback (string or undefined): The overall feedback text (optional).
Returns:
string or undefined
Example usage:
>>> view.overallFeedback('Good job!'); // Set the feedback text
>>> view.overallFeedback(); // Retrieve the feedback text
'Good job!'
**/
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);
}
},
/**
Get or set the options selected in the rubric.
Args:
......
......@@ -103,8 +103,11 @@ OpenAssessment.SelfView.prototype = {
baseView.toggleActionError('self', null);
view.selfSubmitEnabled(false);
var options = this.rubric.optionsSelected();
this.server.selfAssess(options).done(
this.server.selfAssess(
this.rubric.optionsSelected(),
this.rubric.criterionFeedback(),
this.rubric.overallFeedback()
).done(
function() {
baseView.loadAssessmentModules();
baseView.scrollToTop();
......
/**
Interface for server-side XBlock handlers.
Args:
......@@ -261,6 +262,8 @@ OpenAssessment.Server.prototype = {
Args:
optionsSelected (object literal): Keys are criteria names,
values are the option text the user selected for the criterion.
var criterionFeedback = { clarity: "The essay was very clear." };
var overallFeedback = "Good job!";
Returns:
A JQuery promise, which resolves with no args if successful
......@@ -274,10 +277,12 @@ OpenAssessment.Server.prototype = {
function(errorMsg) { console.log(errorMsg); }
);
**/
selfAssess: function(optionsSelected) {
selfAssess: function(optionsSelected, criterionFeedback, overallFeedback) {
var url = this.url('self_assess');
var payload = JSON.stringify({
options_selected: optionsSelected
options_selected: optionsSelected,
criterion_feedback: criterionFeedback,
overall_feedback: overallFeedback
});
return $.Deferred(function(defer) {
$.ajax({ type: "POST", url: url, data: payload }).done(
......
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