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