Fixed #31522 -- Made admin's SelectBox preserve scroll position.

This commit is contained in:
tapan gujjar 2020-05-05 15:40:46 -04:00 committed by Mariusz Felisiak
parent 1e3ceb485e
commit 2d67222472
2 changed files with 26 additions and 0 deletions

View File

@ -13,6 +13,7 @@
redisplay: function(id) { redisplay: function(id) {
// Repopulate HTML select box from cache // Repopulate HTML select box from cache
const box = document.getElementById(id); const box = document.getElementById(id);
const scroll_value_from_top = box.scrollTop;
box.innerHTML = ''; box.innerHTML = '';
for (const node of SelectBox.cache[id]) { for (const node of SelectBox.cache[id]) {
if (node.displayed) { if (node.displayed) {
@ -22,6 +23,7 @@
box.appendChild(new_option); box.appendChild(new_option);
} }
} }
box.scrollTop = scroll_value_from_top;
}, },
filter: function(id, text) { filter: function(id, text) {
// Redisplay the HTML select box, displaying only the choices containing ALL // Redisplay the HTML select box, displaying only the choices containing ALL

View File

@ -21,3 +21,27 @@ QUnit.test('filter', function(assert) {
assert.equal($('#id option').length, 1); assert.equal($('#id option').length, 1);
assert.equal($('#id option').text(), "A"); assert.equal($('#id option').text(), "A");
}); });
QUnit.test('preserve scroll position', function(assert) {
const $ = django.jQuery;
const optionsCount = 100;
$('<select id="from_id" multiple></select>').appendTo('#qunit-fixture');
$('<select id="to_id" multiple></select>').appendTo('#qunit-fixture');
const fromSelectBox = document.getElementById('from_id');
const toSelectBox = document.getElementById('to_id');
for (let i = 0; i < optionsCount; i++) {
fromSelectBox.appendChild(new Option());
}
SelectBox.init('from_id');
SelectBox.init('to_id');
const selectedOptions = [97, 98, 99];
for (const index of selectedOptions) {
fromSelectBox.options[index].selected = true;
fromSelectBox.options[index].scrollIntoView();
}
assert.equal(fromSelectBox.options.length, optionsCount);
SelectBox.move('from_id', 'to_id');
assert.equal(fromSelectBox.options.length, optionsCount - selectedOptions.length);
assert.equal(toSelectBox.options.length, selectedOptions.length);
assert.notEqual(fromSelectBox.scrollTop, 0);
});