| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- class app.views.DocPicker extends app.View
- @className: '_list _list-picker'
- @events:
- mousedown: 'onMouseDown'
- mouseup: 'onMouseUp'
- init: ->
- @addSubview @listFold = new app.views.ListFold(@el)
- return
- activate: ->
- if super
- @render()
- $.on @el, 'focus', @onDOMFocus, true
- return
- deactivate: ->
- if super
- @empty()
- $.off @el, 'focus', @onDOMFocus, true
- @focusEl = null
- return
- render: ->
- html = @tmpl('docPickerHeader')
- docs = app.docs.all().concat(app.disabledDocs.all()...)
- while doc = docs.shift()
- if doc.version?
- [docs, versions] = @extractVersions(docs, doc)
- html += @tmpl('sidebarVersionedDoc', doc, @renderVersions(versions), open: app.docs.contains(doc))
- else
- html += @tmpl('sidebarLabel', doc, checked: app.docs.contains(doc))
- @html html + @tmpl('docPickerNote')
- $.requestAnimationFrame => @findByTag('input')?.focus()
- return
- renderVersions: (docs) ->
- html = ''
- html += @tmpl('sidebarLabel', doc, checked: app.docs.contains(doc)) for doc in docs
- html
- extractVersions: (originalDocs, version) ->
- docs = []
- versions = [version]
- for doc in originalDocs
- (if doc.name is version.name then versions else docs).push(doc)
- [docs, versions]
- empty: ->
- @resetClass()
- super
- return
- getSelectedDocs: ->
- for input in @findAllByTag 'input' when input?.checked
- input.name
- onMouseDown: =>
- @mouseDown = Date.now()
- return
- onMouseUp: =>
- @mouseUp = Date.now()
- return
- onDOMFocus: (event) =>
- target = event.target
- if target.tagName is 'INPUT'
- unless (@mouseDown and Date.now() < @mouseDown + 100) or (@mouseUp and Date.now() < @mouseUp + 100)
- $.scrollTo target.parentNode, null, 'continuous'
- else if target.classList.contains(app.views.ListFold.targetClass)
- target.blur()
- unless @mouseDown and Date.now() < @mouseDown + 100
- if @focusEl is $('input', target.nextElementSibling)
- @listFold.close(target) if target.classList.contains(app.views.ListFold.activeClass)
- prev = target.previousElementSibling
- prev = prev.previousElementSibling until prev.tagName is 'LABEL' or prev.classList.contains(app.views.ListFold.targetClass)
- prev = $.makeArray($$('input', prev.nextElementSibling)).pop() if prev.classList.contains(app.views.ListFold.activeClass)
- @delay -> prev.focus()
- else
- @listFold.open(target) unless target.classList.contains(app.views.ListFold.activeClass)
- @delay -> $('input', target.nextElementSibling).focus()
- @focusEl = target
- return
|