Skip to content

Commit b3e5c3f

Browse files
authored
resolves #104 add shortcut to restore previous search (PR #105)
1 parent 2dfc017 commit b3e5c3f

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

src/js/vendor/docsearch.bundle.js

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
'use strict'
33

44
var CTRL_KEY_CODE = 17
5+
var LT_KEY_CODE = 188
56
var S_KEY_CODE = 83
67
var SOLIDUS_KEY_CODE = 191
78
var SEARCH_FILTER_ACTIVE_KEY = 'docs:search-filter-active'
9+
var SAVED_SEARCH_STATE_KEY = 'docs:saved-search-state'
810

911
activateSearch(require('docsearch.js/dist/cdn/docsearch.js'), document.getElementById('search-script').dataset)
1012

@@ -38,6 +40,7 @@
3840
var menu = dropdown.$menu
3941
typeahead.setVal() // clear value on page reload
4042
input.on('autocomplete:closed', clearSearch.bind(typeahead))
43+
input.on('autocomplete:cursorchanged autocomplete:cursorremoved', saveSearchState.bind(typeahead))
4144
input.on('autocomplete:selected', disableClose)
4245
input.on('autocomplete:updated', onResultsUpdated.bind(typeahead))
4346
dropdown._ensureVisible = ensureVisible
@@ -63,8 +66,18 @@
6366
}
6467

6568
function onResultsUpdated () {
69+
var dropdown = this.dropdown
70+
var restoring = dropdown.restoring
71+
delete dropdown.restoring
6672
if (isClosed(this)) return
67-
this.dropdown.datasets[0].$el.scrollTop(0)
73+
var dataset = dropdown.datasets[0]
74+
dataset.$el.scrollTop(0)
75+
if (restoring && restoring.query === this.getVal() && restoring.filter === this.$facetFilterInput.prop('checked')) {
76+
var cursor = restoring.cursor
77+
if (cursor) dropdown._moveCursor(cursor)
78+
} else {
79+
saveSearchState.call(this)
80+
}
6881
}
6982

7083
function toggleFilter (e) {
@@ -101,6 +114,10 @@
101114

102115
function handleShortcuts (e) {
103116
var target = e.target || {}
117+
if (e.ctrlKey && e.keyCode === LT_KEY_CODE && target === this.$input[0]) {
118+
restoreSearch.call(this)
119+
return
120+
}
104121
if (e.altKey || e.shiftKey || target.isContentEditable || 'disabled' in target) return
105122
if (e.ctrlKey ? e.keyCode === SOLIDUS_KEY_CODE : e.keyCode === S_KEY_CODE) {
106123
this.$input.focus()
@@ -168,4 +185,36 @@
168185
return hit
169186
})
170187
}
188+
189+
function readSavedSearchState () {
190+
try {
191+
var state = window.localStorage.getItem(SAVED_SEARCH_STATE_KEY)
192+
if (state) return JSON.parse(state)
193+
} catch (e) {
194+
window.localStorage.removeItem(SAVED_SEARCH_STATE_KEY)
195+
}
196+
}
197+
198+
function restoreSearch () {
199+
var searchState = readSavedSearchState()
200+
if (!searchState) return
201+
this.setVal()
202+
this.$facetFilterInput.prop('checked', searchState.filter)
203+
var dropdown = this.dropdown
204+
dropdown.datasets[0].clearCachedSuggestions()
205+
dropdown.restoring = searchState
206+
this.setVal(searchState.query) // cursor is restored by onResultsUpdated =>
207+
}
208+
209+
function saveSearchState () {
210+
if (isClosed(this)) return
211+
window.localStorage.setItem(
212+
SAVED_SEARCH_STATE_KEY,
213+
JSON.stringify({
214+
query: this.getVal(),
215+
filter: this.$facetFilterInput.prop('checked'),
216+
cursor: this.dropdown.getCurrentCursor().index() + 1,
217+
})
218+
)
219+
}
171220
})()

0 commit comments

Comments
 (0)