Skip to content

Commit 2d78de1

Browse files
committed
client: save & restore search results scroll offset
1 parent bd852b8 commit 2d78de1

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/static/js/client.js

+43
Original file line numberDiff line numberDiff line change
@@ -3800,6 +3800,7 @@ const sidebarSearchInfo = initInfo('sidebarSearchInfo', {
38003800
searchStage: null,
38013801

38023802
stoppedTypingTimeout: null,
3803+
stoppedScrollingTimeout: null,
38033804

38043805
indexDownloadStatuses: Object.create(null),
38053806
},
@@ -3818,10 +3819,15 @@ const sidebarSearchInfo = initInfo('sidebarSearchInfo', {
38183819
type: 'boolean',
38193820
default: false,
38203821
},
3822+
3823+
resultsScrollOffset: {
3824+
type: 'number',
3825+
},
38213826
},
38223827

38233828
settings: {
38243829
stoppedTypingDelay: 800,
3830+
stoppedScrollingDelay: 200,
38253831

38263832
maxActiveResultsStorage: 100000,
38273833
},
@@ -4056,6 +4062,19 @@ function addSidebarSearchListeners() {
40564062
possiblyHideSearchSidebarColumn();
40574063
restoreSidebarSearchColumn();
40584064
});
4065+
4066+
info.resultsContainer.addEventListener('scroll', () => {
4067+
const {settings, state} = info;
4068+
4069+
if (state.stoppedScrollingTimeout) {
4070+
clearTimeout(state.stoppedScrollingTimeout);
4071+
}
4072+
4073+
state.stoppedScrollingTimeout =
4074+
setTimeout(() => {
4075+
saveSidebarSearchResultsScrollOffset();
4076+
}, settings.stoppedScrollingDelay);
4077+
});
40594078
}
40604079

40614080
function initializeSidebarSearchState() {
@@ -4155,6 +4174,7 @@ async function activateSidebarSearch(query) {
41554174

41564175
session.activeQuery = query;
41574176
session.activeQueryResults = results;
4177+
session.resultsScrollOffset = 0;
41584178

41594179
showSidebarSearchResults(results);
41604180
}
@@ -4177,6 +4197,7 @@ function clearSidebarSearch() {
41774197

41784198
session.activeQuery = null;
41794199
session.activeQueryResults = null;
4200+
session.resultsScrollOffset = null;
41804201

41814202
hideSidebarSearchResults();
41824203
}
@@ -4320,6 +4341,8 @@ function showSidebarSearchResults(results) {
43204341

43214342
tidySidebarSearchColumn();
43224343
}
4344+
4345+
restoreSidebarSearchResultsScrollOffset();
43234346
}
43244347

43254348
function generateSidebarSearchResult(result) {
@@ -4475,6 +4498,10 @@ function generateSidebarSearchResultTemplate(slots) {
44754498

44764499
link.appendChild(text);
44774500

4501+
link.addEventListener('click', () => {
4502+
saveSidebarSearchResultsScrollOffset();
4503+
});
4504+
44784505
return link;
44794506
}
44804507

@@ -4492,6 +4519,22 @@ function hideSidebarSearchResults() {
44924519
cssProp(info.endSearchLine, 'display', 'none');
44934520
}
44944521

4522+
function saveSidebarSearchResultsScrollOffset() {
4523+
const info = sidebarSearchInfo;
4524+
const {session} = info;
4525+
4526+
session.resultsScrollOffset = info.resultsContainer.scrollTop;
4527+
}
4528+
4529+
function restoreSidebarSearchResultsScrollOffset() {
4530+
const info = sidebarSearchInfo;
4531+
const {session} = info;
4532+
4533+
if (session.resultsScrollOffset) {
4534+
info.resultsContainer.scrollTop = session.resultsScrollOffset;
4535+
}
4536+
}
4537+
44954538
function showSearchSidebarColumn() {
44964539
const info = sidebarSearchInfo;
44974540
const {state} = info;

0 commit comments

Comments
 (0)