Commit d857695d by Mat Moore

Vote buttons should be disabled while in use

Clicking quickly on up/down votes in forums generates a race condition
where the votes can continue going up or down (and I can get e.g. large
negative numbers). This is client-side; the server-side is not affected.

This is caused by safeAjax calling code (including updateWithUndo) not
handling the possible undefined return value. This is returned in the case
where the element that triggers the event is already disabled.

Corrected typo in DiscussionThreadView cleanup: @responseRequest -> @responsesRequest

Resolves TNL-1061
parent 55edd327
...@@ -195,3 +195,4 @@ Dino Cikatić <dcikatic@edx.org> ...@@ -195,3 +195,4 @@ Dino Cikatić <dcikatic@edx.org>
Davorin Šego <dsego@edx.org> Davorin Šego <dsego@edx.org>
Marko Jevtić <mjevtic@edx.org> Marko Jevtić <mjevtic@edx.org>
Ahsan Ulhaq <ahsan@edx.org> Ahsan Ulhaq <ahsan@edx.org>
Mat Moore <mat@mooresoftware.co.uk>
...@@ -25,3 +25,24 @@ describe 'DiscussionUtil', -> ...@@ -25,3 +25,24 @@ describe 'DiscussionUtil', ->
# if the ajax call ends in failure, the model state should be reverted # if the ajax call ends in failure, the model state should be reverted
deferred.reject() deferred.reject()
expect(model.attributes).toEqual({hello: false, number: 42}) expect(model.attributes).toEqual({hello: false, number: 42})
it "rolls back the changes if the associated element is disabled", ->
spyOn(DiscussionUtil, "safeAjax").andCallThrough()
model = new Backbone.Model({hello: false, number: 42})
updates = {hello: "world"}
# This is the element that is disabled/enabled while the ajax request is
# in progress
$elem = jasmine.createSpyObj('$elem', ['attr'])
$elem.attr.andReturn(true)
res = DiscussionUtil.updateWithUndo(model, updates, {foo: "bar", $elem:$elem}, "error message")
expect($elem.attr).toHaveBeenCalledWith("disabled")
expect(DiscussionUtil.safeAjax).toHaveBeenCalled()
expect(model.attributes).toEqual({hello: false, number: 42})
failed = false
res.fail(() => failed = true)
expect(failed).toBe(true);
...@@ -134,8 +134,12 @@ class @DiscussionUtil ...@@ -134,8 +134,12 @@ class @DiscussionUtil
@safeAjax: (params) -> @safeAjax: (params) ->
$elem = params.$elem $elem = params.$elem
if $elem and $elem.attr("disabled") if $elem and $elem.attr("disabled")
return deferred = $.Deferred()
deferred.reject()
return deferred.promise()
params["url"] = URI(params["url"]).addSearch ajax: 1 params["url"] = URI(params["url"]).addSearch ajax: 1
params["beforeSend"] = -> params["beforeSend"] = ->
if $elem if $elem
......
...@@ -127,7 +127,7 @@ if Backbone? ...@@ -127,7 +127,7 @@ if Backbone?
$loading: elem $loading: elem
takeFocus: true takeFocus: true
complete: => complete: =>
@responseRequest = null @responsesRequest = null
success: (data, textStatus, xhr) => success: (data, textStatus, xhr) =>
Content.loadContentInfos(data['annotated_content_info']) Content.loadContentInfos(data['annotated_content_info'])
if @isQuestion() if @isQuestion()
......
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