doc_picker.coffee 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. class app.views.DocPicker extends app.View
  2. @className: '_list _list-picker'
  3. @events:
  4. mousedown: 'onMouseDown'
  5. init: ->
  6. @addSubview @listFold = new app.views.ListFold(@el)
  7. return
  8. activate: ->
  9. if super
  10. @render()
  11. $.on @el, 'focus', @onDOMFocus, true
  12. return
  13. deactivate: ->
  14. if super
  15. @empty()
  16. $.off @el, 'focus', @onDOMFocus, true
  17. @focusEl = null
  18. return
  19. render: ->
  20. html = ''
  21. docs = app.docs.all().concat(app.disabledDocs.all()...)
  22. while doc = docs.shift()
  23. if doc.version?
  24. [docs, versions] = @extractVersions(docs, doc)
  25. html += @tmpl('sidebarVersionedDoc', doc, @renderVersions(versions), open: app.docs.contains(doc))
  26. else
  27. html += @tmpl('sidebarLabel', doc, checked: app.docs.contains(doc))
  28. @html html + @tmpl('docPickerNote')
  29. $.requestAnimationFrame =>
  30. @addClass '_in'
  31. @findByTag('input')?.focus()
  32. return
  33. renderVersions: (docs) ->
  34. html = ''
  35. html += @tmpl('sidebarLabel', doc, checked: app.docs.contains(doc)) for doc in docs
  36. html
  37. extractVersions: (originalDocs, version) ->
  38. docs = []
  39. versions = [version]
  40. for doc in originalDocs
  41. (if doc.name is version.name then versions else docs).push(doc)
  42. [docs, versions]
  43. empty: ->
  44. @resetClass()
  45. super
  46. return
  47. getSelectedDocs: ->
  48. for input in @findAllByTag 'input' when input?.checked
  49. input.name
  50. onMouseDown: =>
  51. @mouseDown = Date.now()
  52. return
  53. onDOMFocus: (event) =>
  54. target = event.target
  55. if target.tagName is 'INPUT'
  56. $.scrollTo target.parentNode, null, 'continuous', bottomGap: 2
  57. else if target.classList.contains(app.views.ListFold.targetClass)
  58. target.blur()
  59. unless @mouseDown and @mouseDown > Date.now() - 100
  60. if @focusEl is $('input', target.nextElementSibling)
  61. @listFold.close(target) if target.classList.contains(app.views.ListFold.activeClass)
  62. prev = target.previousElementSibling
  63. prev = prev.previousElementSibling until prev.tagName is 'LABEL' or prev.classList.contains(app.views.ListFold.targetClass)
  64. prev = $.makeArray($$('input', prev.nextElementSibling)).pop() if prev.classList.contains(app.views.ListFold.activeClass)
  65. @delay -> prev.focus()
  66. else
  67. @listFold.open(target) unless target.classList.contains(app.views.ListFold.activeClass)
  68. @delay -> $('input', target.nextElementSibling).focus()
  69. @focusEl = target
  70. return