mobile.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. class app.views.Mobile extends app.View
  2. @className: '_mobile'
  3. @elements:
  4. body: 'body'
  5. content: '._container'
  6. sidebar: '._sidebar'
  7. docPicker: '._settings ._sidebar'
  8. @shortcuts:
  9. escape: 'onEscape'
  10. @routes:
  11. after: 'afterRoute'
  12. @detect: ->
  13. try
  14. (window.matchMedia('(max-width: 480px)').matches) or
  15. (window.matchMedia('(max-width: 767px)').matches) or
  16. (window.matchMedia('(max-height: 767px) and (max-width: 1024px)').matches) or
  17. # Need to sniff the user agent because some Android and Windows Phone devices don't take
  18. # resolution (dpi) into account when reporting device width/height.
  19. (navigator.userAgent.indexOf('Android') isnt -1 and navigator.userAgent.indexOf('Mobile') isnt -1) or
  20. (navigator.userAgent.indexOf('IEMobile') isnt -1)
  21. catch
  22. false
  23. @detectAndroidWebview: ->
  24. try
  25. /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent)
  26. catch
  27. false
  28. constructor: ->
  29. @el = document.documentElement
  30. super
  31. init: ->
  32. window.FastClick?.attach @body
  33. $.on $('._search'), 'touchend', @onTapSearch
  34. @toggleSidebar = $('button[data-toggle-sidebar]')
  35. @toggleSidebar.removeAttribute('hidden')
  36. $.on @toggleSidebar, 'click', @onClickToggleSidebar
  37. @back = $('button[data-back]')
  38. @back.removeAttribute('hidden')
  39. $.on @back, 'click', @onClickBack
  40. @forward = $('button[data-forward]')
  41. @forward.removeAttribute('hidden')
  42. $.on @forward, 'click', @onClickForward
  43. @docPickerTab = $('button[data-tab="doc-picker"]')
  44. @docPickerTab.removeAttribute('hidden')
  45. $.on @docPickerTab, 'click', @onClickDocPickerTab
  46. @settingsTab = $('button[data-tab="settings"]')
  47. @settingsTab.removeAttribute('hidden')
  48. $.on @settingsTab, 'click', @onClickSettingsTab
  49. app.document.sidebar.search
  50. .on 'searching', @showSidebar
  51. @activate()
  52. return
  53. showSidebar: =>
  54. if @isSidebarShown()
  55. window.scrollTo 0, 0
  56. return
  57. @contentTop = window.scrollY
  58. @content.style.display = 'none'
  59. @sidebar.style.display = 'block'
  60. if selection = @findByClass app.views.ListSelect.activeClass
  61. scrollContainer = if window.scrollY is @body.scrollTop then @body else document.documentElement
  62. $.scrollTo selection, scrollContainer, 'center'
  63. else
  64. window.scrollTo 0, @findByClass(app.views.ListFold.activeClass) and @sidebarTop or 0
  65. return
  66. hideSidebar: =>
  67. return unless @isSidebarShown()
  68. @sidebarTop = window.scrollY
  69. @sidebar.style.display = 'none'
  70. @content.style.display = 'block'
  71. window.scrollTo 0, @contentTop or 0
  72. return
  73. isSidebarShown: ->
  74. @sidebar.style.display isnt 'none'
  75. onClickBack: =>
  76. history.back()
  77. onClickForward: =>
  78. history.forward()
  79. onClickToggleSidebar: =>
  80. if @isSidebarShown() then @hideSidebar() else @showSidebar()
  81. return
  82. onClickDocPickerTab: (event) =>
  83. $.stopEvent(event)
  84. @showDocPicker()
  85. return
  86. onClickSettingsTab: (event) =>
  87. $.stopEvent(event)
  88. @showSettings()
  89. return
  90. showDocPicker: ->
  91. window.scrollTo 0, 0
  92. @docPickerTab.classList.add 'active'
  93. @settingsTab.classList.remove 'active'
  94. @docPicker.style.display = 'block'
  95. @content.style.display = 'none'
  96. return
  97. showSettings: ->
  98. window.scrollTo 0, 0
  99. @docPickerTab.classList.remove 'active'
  100. @settingsTab.classList.add 'active'
  101. @docPicker.style.display = 'none'
  102. @content.style.display = 'block'
  103. return
  104. onTapSearch: =>
  105. window.scrollTo 0, 0
  106. onEscape: =>
  107. @hideSidebar()
  108. afterRoute: (route) =>
  109. @hideSidebar()
  110. if route is 'settings'
  111. @showDocPicker()
  112. else
  113. @content.style.display = 'block'
  114. if page.canGoBack()
  115. @back.removeAttribute('disabled')
  116. else
  117. @back.setAttribute('disabled', 'disabled')
  118. if page.canGoForward()
  119. @forward.removeAttribute('disabled')
  120. else
  121. @forward.setAttribute('disabled', 'disabled')
  122. return