mirror of https://github.com/freeCodeCamp/devdocs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
85 lines
1.9 KiB
11 years ago
|
class app.views.SearchScope extends app.View
|
||
|
SEARCH_PARAM = app.config.search_param
|
||
|
|
||
|
@elements:
|
||
|
input: '._search-input'
|
||
|
tag: '._search-tag'
|
||
|
|
||
|
@events:
|
||
|
keydown: 'onKeydown'
|
||
|
|
||
|
@shortcuts:
|
||
|
escape: 'reset'
|
||
|
|
||
|
constructor: (@el) -> super
|
||
|
|
||
|
init: ->
|
||
|
@placeholder = @input.getAttribute 'placeholder'
|
||
|
|
||
|
@searcher = new app.SynchronousSearcher
|
||
|
fuzzy_min_length: 2
|
||
|
max_results: 1
|
||
|
@searcher.on 'results', @onResults
|
||
|
|
||
|
return
|
||
|
|
||
|
getScope: ->
|
||
|
@doc or app
|
||
|
|
||
|
search: (value) ->
|
||
|
unless @doc
|
||
|
@searcher.find app.docs.all(), 'slug', value
|
||
|
return
|
||
|
|
||
|
searchUrl: ->
|
||
|
if value = @extractHashValue()
|
||
|
@search value
|
||
|
return
|
||
|
|
||
|
onResults: (results) =>
|
||
|
if results.length
|
||
|
@selectDoc results[0]
|
||
|
return
|
||
|
|
||
|
selectDoc: (doc) ->
|
||
|
@doc = doc
|
||
|
|
||
|
@tag.textContent = doc.name
|
||
|
@tag.style.display = 'block'
|
||
|
|
||
|
@input.removeAttribute 'placeholder'
|
||
|
@input.value = @input.value[@input.selectionStart..]
|
||
|
@input.style.paddingLeft = @tag.offsetWidth + 6 + 'px'
|
||
|
$.trigger @input, 'input'
|
||
|
|
||
|
reset: =>
|
||
|
@doc = null
|
||
|
|
||
|
@tag.textContent = ''
|
||
|
@tag.style.display = 'none'
|
||
|
|
||
|
@input.setAttribute 'placeholder', @placeholder
|
||
|
@input.style.paddingLeft = ''
|
||
|
|
||
|
onKeydown: (event) =>
|
||
|
return if event.ctrlKey or event.metaKey or event.altKey or event.shiftKey
|
||
|
|
||
|
if event.which is 8 # backspace
|
||
|
if @doc and not @input.value
|
||
|
$.stopEvent(event)
|
||
|
@reset()
|
||
|
else if event.which is 9 or # tab
|
||
|
event.which is 32 and (app.isMobile() or $.isTouchScreen()) # space
|
||
|
$.stopEvent(event)
|
||
|
@search @input.value[0...@input.selectionStart]
|
||
|
return
|
||
|
|
||
|
extractHashValue: ->
|
||
|
if value = @getHashValue()
|
||
|
newHash = decodeURIComponent(location.hash).replace "##{SEARCH_PARAM}=#{value} ", "##{SEARCH_PARAM}="
|
||
|
app.router.replaceHash(newHash)
|
||
|
value
|
||
|
|
||
|
getHashValue: ->
|
||
|
try (new RegExp "^##{SEARCH_PARAM}=(.+?) .").exec(decodeURIComponent location.hash)?[1] catch
|