mobile.coffee 3.8 KB

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