Fish Trophy

yyoud88 got a fish trophy!

Fish Trophy

Make regionCommentBlock movable.

Review Request #6886 — Created Feb. 1, 2015 and discarded

Information

Review Board
master

Reviewers

Made draft RegionCommentBlock movable, by drag-and-drop.

Currently, a RegionCommentBlock is not movable, even if it is a draft. This change makes draft RegionCommentBlocks movable by drag-and-drop. Users finish moving it by mouse-up action, and the draft RegionCommentBlock's new position is saved on server.

Passed all tests in "/js-test/".

Browser test done:
1. Go to file attachment review page, for example, http://localhost:8080/r/7/file/4/
2. Make draft comment
3. Try moving
4. Refresh the page
5. See if the bounds are updated

Edge cases tested:
1. Open file attachment review page, make move "once" and refresh. => Working well. Confirmed the location is updated.
2. Try click-and-drag non-draft commentBlocks. => Non-draft commentBlcoks are not movable. Working as expected.

Description From Last Updated

Blank line between these.

chipx86chipx86

What happens when this is fired the very first time for a new comment? Do we save that comment?

chipx86chipx86

Since this will also need to be used to decide whether a resize can be performed, I'd suggest calling this …

chipx86chipx86

These will all need doc comments in the form used in parse() above.

chipx86chipx86

Blank line between these.

chipx86chipx86

Blank line between these.

chipx86chipx86

notify is both pretty generic (in terms of option names) and yet too specific (in terms of the action that …

chipx86chipx86

Generally-speaking, you'd want to remove this and change the below code to: if (options.notify !== false) { ... } However, …

chipx86chipx86

Blank lines on either side of the conditional, like: this._updateTooltip(); if (options.notify) { ... } RB.DraftReview....

chipx86chipx86

Style nitpick: blank line between a statement and a block

brenniebrennie

You can use _.bind, .e.g commentBlockView.setSelectionRegionSize( _.bind(function() { ... }, this);

brenniebrennie

Blank line between these.

chipx86chipx86

Blank line between these.

chipx86chipx86

JavaScript doesn't allow a final trailing comma. It'll break IE.

chipx86chipx86

Blank line here. Both these statements are doing very different things, and much like paragraphs covering different topics, they should …

chipx86chipx86

Hmmm, there's probably an easier way to do this. I think you want: events: _.defaults({ 'mousedown .selection-flag': '...', ..., }, …

chipx86chipx86

Instead of these, you can do: _.bindAll(this, '_onDrag', '_onWindowMouseUp'); It'll replace those functions with bound versions.

chipx86chipx86

This doesn't need to be indented.

chipx86chipx86

Not sure these are necessary. I'd just put the logic in the calling functions.

chipx86chipx86

When possible, single quotes are preferred over double quotes in both Python and JavaScript.

chipx86chipx86

No indentation like this. Make sure to follow the doc conventions throughout the codebase. One line summary, multi-line description. This …

chipx86chipx86

Unindent the comment relative to the *. Same below

brenniebrennie

Blank line here.

chipx86chipx86

Blank line before this. You can set multiple attributes at once by passing a dictionary.

chipx86chipx86

Our max line length is 79 so take full advantage of it for comments. Same elsewhere.

brenniebrennie

This doesn't describe what the function does.

chipx86chipx86

Make sure the blank line in the comment is removed.

chipx86chipx86

Blank line here.

chipx86chipx86

And here.

chipx86chipx86

The second line should line up with the open quote on the first line, i.e. this.model.on('foo...', this._bar, ...)

brenniebrennie

You should use this.listenTo(...) instead of this.model.on(...) when listening to events. This helps with managing circular references in signal handlers.

chipx86chipx86

Blank line between a statement and a block

brenniebrennie

All the same comments here as above.

chipx86chipx86

Blank line here.

chipx86chipx86

These lines look too long (wrap to 80 columns).

daviddavid
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
  2. 
      
brennie
  1. 
      
  2. Show all issues

    Style nitpick: blank line between a statement and a block

  3. reviewboard/static/rb/js/views/imageReviewableView.js (Diff revision 1)
     
     
     
     
     
     
     
     
     
    Show all issues

    You can use _.bind, .e.g

    commentBlockView.setSelectionRegionSize(
        _.bind(function() {
            ...
       }, this);
    
  4. Show all issues

    Unindent the comment relative to the *. Same below

  5. Show all issues

    Our max line length is 79 so take full advantage of it for comments. Same elsewhere.

  6. Show all issues

    The second line should line up with the open quote on the first line, i.e.

    this.model.on('foo...',
                  this._bar, ...)
    
  7. Show all issues

    Blank line between a statement and a block

  8. 
      
YY
reviewbot
  1. Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
    
    Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
  2. 
      
YY
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
  2. 
      
chipx86
  1. 
      
  2. In case you were wondering, this is only available to views, and only works for DOM events.

  3. Show all issues

    Blank line between these.

  4. Show all issues

    What happens when this is fired the very first time for a new comment? Do we save that comment?

    1. No we don't. Event handler is going to update the underlying comment model, but doesn't save the model. End of dragging calls save.

  5. Show all issues

    Since this will also need to be used to decide whether a resize can be performed, I'd suggest calling this canUpdateBounds.

  6. reviewboard/static/rb/js/models/regionCommentBlockModel.js (Diff revision 1)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    Show all issues

    These will all need doc comments in the form used in parse() above.

  7. Show all issues

    Blank line between these.

  8. Show all issues

    Blank line between these.

  9. Show all issues

    notify is both pretty generic (in terms of option names) and yet too specific (in terms of the action that the model is trying to block). Models should never have a concept of UI, and signal emitters should not assume how a signal will be used.

    Instead of an option name suggesting behavior, it should instead suggest what happened. So, I'd go with boundsUpdated: true. Then the view (or any future code) could make smart decisions based on the knowledge that the bounds have been updated.

  10. Show all issues

    Generally-speaking, you'd want to remove this and change the below code to:

    if (options.notify !== false) {
        ...
    }
    

    However, with the change I suggested to the name, which also flips the value, you won't need either.

  11. Show all issues

    Blank lines on either side of the conditional, like:

    this._updateTooltip();
    
    if (options.notify) {
        ...
    }
    
    RB.DraftReview....
    
  12. Show all issues

    Blank line between these.

  13. Show all issues

    Blank line between these.

  14. Show all issues

    JavaScript doesn't allow a final trailing comma. It'll break IE.

  15. Show all issues

    Blank line here. Both these statements are doing very different things, and much like paragraphs covering different topics, they should not be grouped together.

  16. reviewboard/static/rb/js/views/regionCommentBlockView.js (Diff revision 1)
     
     
     
     
     
     
     
    Show all issues

    Hmmm, there's probably an easier way to do this. I think you want:

    events: _.defaults({
        'mousedown .selection-flag': '...',
        ...,
    }, _super(this).events)
    
    1. No. _super(this).events can be a function which returns an object.

  17. Show all issues

    Instead of these, you can do:

    _.bindAll(this, '_onDrag', '_onWindowMouseUp');
    

    It'll replace those functions with bound versions.

  18. Show all issues

    This doesn't need to be indented.

  19. reviewboard/static/rb/js/views/regionCommentBlockView.js (Diff revision 1)
     
     
     
     
     
     
     
     
     
     
    Show all issues

    Not sure these are necessary. I'd just put the logic in the calling functions.

  20. Show all issues

    When possible, single quotes are preferred over double quotes in both Python and JavaScript.

  21. Show all issues

    No indentation like this.

    Make sure to follow the doc conventions throughout the codebase. One line summary, multi-line description.

    This applies to all comments in your change.

  22. Show all issues

    Blank line here.

  23. Show all issues

    Blank line before this.

    You can set multiple attributes at once by passing a dictionary.

  24. Show all issues

    This doesn't describe what the function does.

  25. Show all issues

    Make sure the blank line in the comment is removed.

  26. Show all issues

    Blank line here.

  27. Show all issues

    And here.

  28. Show all issues

    You should use this.listenTo(...) instead of this.model.on(...) when listening to events. This helps with managing circular references in signal handlers.

  29. reviewboard/static/rb/js/views/regionCommentBlockView.js (Diff revision 1)
     
     
     
     
     
     
     
     
    Show all issues

    All the same comments here as above.

  30. Show all issues

    Blank line here.

  31. 
      
YY
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
  2. 
      
mike_conley
  1. Hey Stanley, could you please update the Description and Testing Done fields based on https://www.reviewboard.org/docs/codebase/dev/writing-good-descriptions/ ?

    1. will do. thanks.

  2. 
      
YY
YY
david
  1. Is this change an obsolete version of /r/6919?

    1. no. 6919 is to make it resizable. 6886 is to make it movable. 6919 depends on 6886

    2. It looks like 6919 actually contains many of the same changes as this. Can you re-post and pass in the specific revisions so that it only gets the resize changes?

  2. 
      
david
  1. Please be specific about exactly what manual tests you executed in your browser. What test cases did you try? What were the results of each test? In particular, this sort of interaction often has some edge cases--which edge cases have you identified, and are they handled correctly?

  2. Show all issues

    These lines look too long (wrap to 80 columns).

  3. 
      
YY
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/views/abstractCommentBlockView.js
        reviewboard/static/rb/js/resources/models/tests/baseResourceModelTests.js
        reviewboard/static/rb/js/models/regionCommentBlockModel.js
        reviewboard/static/rb/js/views/regionCommentBlockView.js
        reviewboard/static/rb/js/views/imageReviewableView.js
        reviewboard/static/rb/js/resources/models/baseResourceModel.js
    
    
  2. 
      
david
  1. Still waiting on detailed testing information for this change.

  2. 
      
YY
david
  1. I just applied this patch and played with it a bit, and it seems pretty easy to get things in a state where clicking on the number (not click+drag) doesn't open the comment dialog to edit the existing comment. I think there's some state (hasMoved) that's not being reset correctly.

  2. 
      
YY
Review request changed
Status:
Discarded