salk31 / RedQueryBuilder

SQL Query Builder UI JavaScript component
http://redquerybuilder.appspot.com/
Eclipse Public License 1.0
96 stars 22 forks source link

Lazy loading of values does not work second time around #44

Open scottdear opened 8 years ago

scottdear commented 8 years ago

This is a bug on the Tardis branch to reproduce use the following steps:

  1. Set up a suggest callback for the values column that returns more than the dropdown will hold, so that scrolling to the bottom will trigger a lazy load of values.
  2. Pick a value from the drop down without scrolling, i.e. do not trigger the lazy load.
  3. Click on the value box, and remove the value, then click again to get the suggest dropdown.
  4. Scroll to the bottom of the list and it will not fire the suggest callback and trigger the lazy load.

If you do not first enter a value then click on the value box you get the suggest list, then scrolling to the bottom triggers the lazy load.

scottdear commented 8 years ago

Hold off on looking at this. I just came in this morning to do a bit more research on this, and I can no longer reproduce it. I'll follow up with some more information shortly.

scottdear commented 8 years ago

So what I am seeing is that after I use the suggest box a second time, the first request calls the suggest callback with a page parameter of 1, but the second request is whatever the maximum page was the last time around. So for example, if I click then scroll down and get page=1, then page=2 passed to the callback, then mouse out, and back in and click on the values box again, then start scrolling down, the second time, I get page=1 passed to the suggest callback, but then the next call to suggest has page=3. Also if I keep scrolling to the end, it keeps incrementing the page even though zero records have been returned.

Question: Is there something else I need to pass besides an empty array to the callback to tell it there are no more rows for this suggest?

scottdear commented 8 years ago

I did some more testing and here is a walk-through of what I am seeing passed into my suggest callback from RQB.

My suggest handler is something like:

suggest(args,callback) { /* ajax call and other stuff when ajax is returned, I call callback(a) where a is an array of strings to populate the dropdown with */ }

The behavior I am seeing is as follows:

I select a field/column, then I click on the values box. I get the dropdown and I get a call to my suggest function with the following being passed in from RQB:

columnName:"Contact_City_Output" columnTypeName:"CHAR" limit:20 page:0 query:null tableName:"upl_2613"

Inside my suggest function, my ajax call returns and on success calls the "callback" function passed in and passes an array of string (20 items).

I then scroll down until I get to the bottom of the dropdown so it fires suggest again. I then get the same as above passed into args, except page:1

I then scroll down some more until I hit the bottom of the dropdown and it fires my suggest again, I get the same as above, except page:2

One more scroll give me page:3

I then click outside of the suggest box/defocus and the dropdown goes away. I click back in the suggest box and I get the same as the above with page:0

I then scroll down some more until I hit the bottom of the dropdown and it fires the suggest but this time it passes page:4.

So it appears that what is happening is it works fine, until you defocus, then click back in the suggest box. When you click back in the suggest box, after a de-focus, it first fires with page:0, then when you scroll down, the second and subsequent calls to suggest set the page to the highest page that was previously accessed +1 and increments from there. In the above example if I keep scrolling, I get page:4, page:5, etc and it skips 1, 2 and 3, so I get passed pages 0,1,2,3,4 the first time, then after the defocus then focus and scroll I get pages 0,5,6,7 and it keeps going up. If I got up to page 7, then defocus/focus, next time I get pages 0,8,9,10

scottdear commented 8 years ago

OK I think I have a fix for this one.

It may not be elegant, but it seems to fix the problem. I reset the page variable when we get a blur even on the suggestbox. The patch is to add a line to the file:

./redquerybuilder-core/src/main/java/com/redspr/redquerybuilder/core/client/expression/SuggestEditorWidget.java

After line 306 after the line:

 active = false;

The full function before:

        suggestBox.getValueBox().addBlurHandler(new BlurHandler() {
            @Override
            public void onBlur(BlurEvent event) {
                active = false;
            }
        });

The full function after:

       suggestBox.getValueBox().addBlurHandler(new BlurHandler() {
            @Override
            public void onBlur(BlurEvent event) {
                active = false;
                scrollDisplay.page = 0;
            }
        });