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