Prevent duplicate infobox fetches

Review Request #8568 — Created Dec. 12, 2016 and submitted

Information

Review Board
release-3.0.x
009ec7b...

Reviewers

Previously, datagrids would attach additional event handler for
infoboxes on top of the initial event handler. This would result in two
fetches for all infoboxes in the datagrid until the first refresh. Now
we set an attribute on elements which can have infoboxes attached them
when the infobox handler has been added so that it will not be added
again.

Verified infoboxes in datagrids are no longer requested twice.

Description From Last Updated

Can we make this data-has-${id}-infobox? As-is it'll make attributes like data-has-user which isn't immediately obvious.

daviddavid

Early returns increase complexity. Given that the code that would be skipped by it is only three statements, how about …

daviddavid

This needs to be $target now, because fat-arrow functions have lexical this binding.

daviddavid

We should use .data() instead for storing this, rather than using an attribute. We actually can attach the view as …

chipx86chipx86
reviewbot
  1. Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
    
    Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
  2. 
      
david
  1. 
      
  2. reviewboard/static/rb/js/common.es6.js (Diff revision 1)
     
     
    Show all issues

    Can we make this data-has-${id}-infobox? As-is it'll make attributes like data-has-user which isn't immediately obvious.

    1. No it will make data-has-user_infobox etc.

  3. reviewboard/static/rb/js/common.es6.js (Diff revision 1)
     
     
    Show all issues

    Early returns increase complexity. Given that the code that would be skipped by it is only three statements, how about we instead do:

    if (!$target.attr(infoboxAttr)) {
        const view = new RB.InfoboxView({
            $target: $target,
            el: $el,
        });
    
        view.render();
        $target.attr(infoboxAttr, true);
    }
    
  4. reviewboard/static/rb/js/common.es6.js (Diff revision 1)
     
     
    Show all issues

    This needs to be $target now, because fat-arrow functions have lexical this binding.

    1. Good catch; totally meant to do this.

  5. 
      
brennie
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
  2. 
      
david
  1. Ship It!
  2. 
      
chipx86
  1. 
      
  2. reviewboard/static/rb/js/common.es6.js (Diff revision 2)
     
     
     
     
    Show all issues

    We should use .data() instead for storing this, rather than using an attribute.

    We actually can attach the view as the data. This is what jQuery widgets do. This allows for fetching the view for a given element as well.

    (.data() doesn't simply wrap .attr('data-...'))

  3. 
      
brennie
reviewbot
  1. Tool: PEP8 Style Checker
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
    
    Tool: Pyflakes
    Ignored Files:
        reviewboard/static/rb/js/common.es6.js
    
    
  2. 
      
david
  1. Ship It!
  2. 
      
brennie
Review request changed
Status:
Completed
Change Summary:
Pushed to release-3.0.x (d2fdef8)