diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 2a9371378..304bbe59b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -36,6 +36,7 @@ Changelog * Fix: Added verbose_name_plural for form submission model (Janneke Janssen) * Fix: Prevent `update_index` failures and incorrect front-end rendering on blank `TableBlock` (Carlo Ascani) * Fix: Dropdown initialisation on the search page after AJAX call (Eric Sherman) + * Fix: Make sure all modal chooser search results correspond to the latest search by canceling previous requests (Esper Kuijs) 2.7.1 (08.01.2020) diff --git a/docs/releases/2.8.rst b/docs/releases/2.8.rst index c8a0e064c..ad625e51e 100644 --- a/docs/releases/2.8.rst +++ b/docs/releases/2.8.rst @@ -61,6 +61,7 @@ Bug fixes * Added verbose_name_plural for form submission model (Janneke Janssen) * Prevent ``update_index`` failures and incorrect front-end rendering on blank ``TableBlock`` (Carlo Ascani) * Dropdown initialisation on the search page after AJAX call (Eric Sherman) + * Make sure all modal chooser search results correspond to the latest search by canceling previous requests (Esper Kuijs) Upgrade considerations diff --git a/wagtail/documents/static_src/wagtaildocs/js/document-chooser-modal.js b/wagtail/documents/static_src/wagtaildocs/js/document-chooser-modal.js index d61f50cfa..e23beacc2 100644 --- a/wagtail/documents/static_src/wagtaildocs/js/document-chooser-modal.js +++ b/wagtail/documents/static_src/wagtaildocs/js/document-chooser-modal.js @@ -26,16 +26,21 @@ DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS = { }; var searchUrl = $('form.document-search', modal.body).attr('action'); + var request; function search() { - $.ajax({ + request = $.ajax({ url: searchUrl, data: { q: $('#id_q').val(), collection_id: $('#collection_chooser_collection_id').val() }, success: function(data, status) { + request = null; $('#search-results').html(data); ajaxifyLinks($('#search-results')); + }, + error: function() { + request = null; } }); return false; @@ -48,12 +53,16 @@ DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS = { dataObj = {p: page}; } - $.ajax({ + request = $.ajax({ url: searchUrl, data: dataObj, success: function(data, status) { + request = null; $('#search-results').html(data); ajaxifyLinks($('#search-results')); + }, + error: function() { + request = null; } }); return false; @@ -86,6 +95,9 @@ DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS = { $('form.document-search', modal.body).on('submit', search); $('#id_q').on('input', function() { + if (request) { + request.abort(); + } clearTimeout($.data(this, 'timer')); var wait = setTimeout(search, 50); $(this).data('timer', wait); diff --git a/wagtail/images/static_src/wagtailimages/js/image-chooser-modal.js b/wagtail/images/static_src/wagtailimages/js/image-chooser-modal.js index 7495e5845..e50703af0 100644 --- a/wagtail/images/static_src/wagtailimages/js/image-chooser-modal.js +++ b/wagtail/images/static_src/wagtailimages/js/image-chooser-modal.js @@ -18,14 +18,19 @@ IMAGE_CHOOSER_MODAL_ONLOAD_HANDLERS = { return false; }); } + var request; function fetchResults(requestData) { - $.ajax({ + request = $.ajax({ url: searchUrl, data: requestData, success: function(data, status) { + request = null; $('#image-results').html(data); ajaxifyLinks($('#image-results')); + }, + error: function() { + request = null; } }); } @@ -90,6 +95,9 @@ IMAGE_CHOOSER_MODAL_ONLOAD_HANDLERS = { $('form.image-search', modal.body).on('submit', search); $('#id_q').on('input', function() { + if (request) { + request.abort(); + } clearTimeout($.data(this, 'timer')); var wait = setTimeout(search, 200); $(this).data('timer', wait); diff --git a/wagtail/search/static_src/wagtailsearch/js/query-chooser-modal.js b/wagtail/search/static_src/wagtailsearch/js/query-chooser-modal.js index 39f51024d..7340ce9cd 100644 --- a/wagtail/search/static_src/wagtailsearch/js/query-chooser-modal.js +++ b/wagtail/search/static_src/wagtailsearch/js/query-chooser-modal.js @@ -12,13 +12,19 @@ QUERY_CHOOSER_MODAL_ONLOAD_HANDLERS = { } var searchUrl = $('form.query-search', modal.body).attr('action'); + var request; + function search() { - $.ajax({ + request = $.ajax({ url: searchUrl, data: {q: $('#id_q').val()}, success: function(data, status) { + request = null; $('#query-results').html(data); ajaxifyLinks($('#query-results')); + }, + error: function() { + request = null; } }); return false; @@ -31,12 +37,16 @@ QUERY_CHOOSER_MODAL_ONLOAD_HANDLERS = { dataObj = {p: page}; } - $.ajax({ + request = $.ajax({ url: searchUrl, data: dataObj, success: function(data, status) { + request = null; $('#query-results').html(data); ajaxifyLinks($('#query-results')); + }, + error: function() { + request = null; } }); return false; @@ -53,6 +63,9 @@ QUERY_CHOOSER_MODAL_ONLOAD_HANDLERS = { $('form.query-search', modal.body).on('submit', search); $('#id_q').on('input', function() { + if (request) { + request.abort(); + } clearTimeout($.data(this, 'timer')); var wait = setTimeout(search, 200); $(this).data('timer', wait); diff --git a/wagtail/snippets/static_src/wagtailsnippets/js/snippet-chooser-modal.js b/wagtail/snippets/static_src/wagtailsnippets/js/snippet-chooser-modal.js index 9e6828f0b..417354a2f 100644 --- a/wagtail/snippets/static_src/wagtailsnippets/js/snippet-chooser-modal.js +++ b/wagtail/snippets/static_src/wagtailsnippets/js/snippet-chooser-modal.js @@ -14,14 +14,19 @@ SNIPPET_CHOOSER_MODAL_ONLOAD_HANDLERS = { } var searchUrl = $('form.snippet-search', modal.body).attr('action'); + var request; function search() { - $.ajax({ + request = $.ajax({ url: searchUrl, data: {q: $('#id_q').val(), results: 'true'}, success: function(data, status) { + request = null; $('#search-results').html(data); ajaxifyLinks($('#search-results')); + }, + error: function() { + request = null; } }); return false; @@ -34,12 +39,16 @@ SNIPPET_CHOOSER_MODAL_ONLOAD_HANDLERS = { dataObj.q = $('#id_q').val(); } - $.ajax({ + request = $.ajax({ url: searchUrl, data: dataObj, success: function(data, status) { + request = null; $('#search-results').html(data); ajaxifyLinks($('#search-results')); + }, + error: function() { + request = null; } }); return false; @@ -48,6 +57,9 @@ SNIPPET_CHOOSER_MODAL_ONLOAD_HANDLERS = { $('form.snippet-search', modal.body).on('submit', search); $('#id_q').on('input', function() { + if (request) { + request.abort(); + } clearTimeout($.data(this, 'timer')); var wait = setTimeout(search, 200); $(this).data('timer', wait);