doc_list.coffee 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. class app.views.DocList extends app.View
  2. @className: '_list'
  3. @attributes:
  4. role: 'navigation'
  5. @events:
  6. open: 'onOpen'
  7. close: 'onClose'
  8. click: 'onClick'
  9. @routes:
  10. after: 'afterRoute'
  11. @elements:
  12. disabledTitle: '._list-title'
  13. disabledList: '._disabled-list'
  14. init: ->
  15. @lists = {}
  16. @addSubview @listFocus = new app.views.ListFocus @el unless app.isMobile()
  17. @addSubview @listFold = new app.views.ListFold @el
  18. @addSubview @listSelect = new app.views.ListSelect @el
  19. app.on 'ready', @render
  20. return
  21. activate: ->
  22. if super
  23. list.activate() for slug, list of @lists
  24. @listSelect.selectCurrent()
  25. return
  26. deactivate: ->
  27. if super
  28. list.deactivate() for slug, list of @lists
  29. return
  30. render: =>
  31. @html @tmpl('sidebarDoc', app.docs.all())
  32. @renderDisabled() unless app.isSingleDoc() or app.disabledDocs.size() is 0
  33. return
  34. renderDisabled: ->
  35. @append @tmpl('sidebarDisabled', count: app.disabledDocs.size())
  36. @refreshElements()
  37. @renderDisabledList()
  38. return
  39. renderDisabledList: ->
  40. if app.settings.get('hideDisabled')
  41. @removeDisabledList()
  42. else
  43. @appendDisabledList()
  44. return
  45. appendDisabledList: ->
  46. html = ''
  47. docs = [].concat(app.disabledDocs.all()...)
  48. while doc = docs.shift()
  49. if doc.version?
  50. versions = ''
  51. loop
  52. versions += @tmpl('sidebarDoc', doc, disabled: true)
  53. break if docs[0]?.name isnt doc.name
  54. doc = docs.shift()
  55. html += @tmpl('sidebarDisabledVersionedDoc', doc, versions)
  56. else
  57. html += @tmpl('sidebarDoc', doc, disabled: true)
  58. @append @tmpl('sidebarDisabledList', html)
  59. @disabledTitle.classList.add('open-title')
  60. @refreshElements()
  61. return
  62. removeDisabledList: ->
  63. $.remove @disabledList if @disabledList
  64. @disabledTitle.classList.remove('open-title')
  65. @refreshElements()
  66. return
  67. reset: (options = {}) ->
  68. @listSelect.deselect()
  69. @listFocus?.blur()
  70. @listFold.reset()
  71. @revealCurrent() if options.revealCurrent || app.isSingleDoc()
  72. return
  73. onOpen: (event) =>
  74. $.stopEvent(event)
  75. doc = app.docs.findBy 'slug', event.target.getAttribute('data-slug')
  76. if doc and not @lists[doc.slug]
  77. @lists[doc.slug] = if doc.types.isEmpty()
  78. new app.views.EntryList doc.entries.all()
  79. else
  80. new app.views.TypeList doc
  81. $.after event.target, @lists[doc.slug].el
  82. return
  83. onClose: (event) =>
  84. $.stopEvent(event)
  85. doc = app.docs.findBy 'slug', event.target.getAttribute('data-slug')
  86. if doc and @lists[doc.slug]
  87. @lists[doc.slug].detach()
  88. delete @lists[doc.slug]
  89. return
  90. select: (model) ->
  91. @listSelect.selectByHref model?.fullPath()
  92. return
  93. reveal: (model) ->
  94. @openDoc model.doc
  95. @openType model.getType() if model.type
  96. @focus model
  97. @paginateTo model
  98. @scrollTo model
  99. return
  100. focus: (model) ->
  101. @listFocus?.focus @find("a[href='#{model.fullPath()}']")
  102. return
  103. revealCurrent: ->
  104. if model = app.router.context.type or app.router.context.entry
  105. @reveal model
  106. @select model
  107. return
  108. openDoc: (doc) ->
  109. @listFold.open @find("[data-slug='#{doc.slug_without_version}']") if app.disabledDocs.contains(doc) and doc.version
  110. @listFold.open @find("[data-slug='#{doc.slug}']")
  111. return
  112. closeDoc: (doc) ->
  113. @listFold.close @find("[data-slug='#{doc.slug}']")
  114. return
  115. openType: (type) ->
  116. @listFold.open @lists[type.doc.slug].find("[data-slug='#{type.slug}']")
  117. return
  118. paginateTo: (model) ->
  119. @lists[model.doc.slug]?.paginateTo(model)
  120. return
  121. scrollTo: (model) ->
  122. $.scrollTo @find("a[href='#{model.fullPath()}']"), null, 'top', margin: if app.isMobile() then 48 else 0
  123. return
  124. toggleDisabled: ->
  125. if @disabledTitle.classList.contains('open-title')
  126. @removeDisabledList()
  127. app.settings.set 'hideDisabled', true
  128. else
  129. @appendDisabledList()
  130. app.settings.set 'hideDisabled', false
  131. return
  132. onClick: (event) =>
  133. if @disabledTitle and $.hasChild(@disabledTitle, event.target)
  134. $.stopEvent(event)
  135. @toggleDisabled()
  136. else if slug = event.target.getAttribute('data-enable')
  137. $.stopEvent(event)
  138. doc = app.disabledDocs.findBy('slug', slug)
  139. app.enableDoc(doc, @onEnabled, @onEnabled)
  140. return
  141. onEnabled: =>
  142. @reset()
  143. @render()
  144. return
  145. afterRoute: (route, context) =>
  146. if context.init
  147. @reset revealCurrent: true if @activated
  148. else
  149. @select context.type or context.entry
  150. return