157 lines · 4.0 KB · Text
RawDownload
class app.views.Mobile extends app.View  @className: '_mobile'   @elements:    body:      'body'    content:   '._container'    sidebar:   '._sidebar'    docPicker: '._settings ._sidebar'   @shortcuts:    escape: 'onEscape'   @routes:    after: 'afterRoute'   @detect: ->    if Cookies.get('override-mobile-detect')?      return JSON.parse Cookies.get('override-mobile-detect')    try      (window.matchMedia('(max-width: 480px)').matches) or      (window.matchMedia('(max-width: 767px)').matches) or      (window.matchMedia('(max-height: 767px) and (max-width: 1024px)').matches) or      # Need to sniff the user agent because some Android and Windows Phone devices don't take      # resolution (dpi) into account when reporting device width/height.      (navigator.userAgent.indexOf('Android') isnt -1 and navigator.userAgent.indexOf('Mobile') isnt -1) or      (navigator.userAgent.indexOf('IEMobile') isnt -1)    catch      false   @detectAndroidWebview: ->    try      /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent)    catch      false   constructor: ->    @el = document.documentElement    super   init: ->    window.FastClick?.attach @body     $.on $('._search'), 'touchend', @onTapSearch     @toggleSidebar = $('button[data-toggle-sidebar]')    @toggleSidebar.removeAttribute('hidden')    $.on @toggleSidebar, 'click', @onClickToggleSidebar     @back = $('button[data-back]')    @back.removeAttribute('hidden')    $.on @back, 'click', @onClickBack     @forward = $('button[data-forward]')    @forward.removeAttribute('hidden')    $.on @forward, 'click', @onClickForward     @docPickerTab = $('button[data-tab="doc-picker"]')    @docPickerTab.removeAttribute('hidden')    $.on @docPickerTab, 'click', @onClickDocPickerTab     @settingsTab = $('button[data-tab="settings"]')    @settingsTab.removeAttribute('hidden')    $.on @settingsTab, 'click', @onClickSettingsTab     app.document.sidebar.search      .on 'searching', @showSidebar     @activate()    return   showSidebar: =>    if @isSidebarShown()      window.scrollTo 0, 0      return     @contentTop = window.scrollY    @content.style.display = 'none'    @sidebar.style.display = 'block'     if selection = @findByClass app.views.ListSelect.activeClass      scrollContainer = if window.scrollY is @body.scrollTop then @body else document.documentElement      $.scrollTo selection, scrollContainer, 'center'    else      window.scrollTo 0, @findByClass(app.views.ListFold.activeClass) and @sidebarTop or 0    return   hideSidebar: =>    return unless @isSidebarShown()    @sidebarTop = window.scrollY    @sidebar.style.display = 'none'    @content.style.display = 'block'    window.scrollTo 0, @contentTop or 0    return   isSidebarShown: ->    @sidebar.style.display isnt 'none'   onClickBack: =>    history.back()   onClickForward: =>    history.forward()   onClickToggleSidebar: =>    if @isSidebarShown() then @hideSidebar() else @showSidebar()    return   onClickDocPickerTab: (event) =>    $.stopEvent(event)    @showDocPicker()    return   onClickSettingsTab: (event) =>    $.stopEvent(event)    @showSettings()    return   showDocPicker: ->    window.scrollTo 0, 0    @docPickerTab.classList.add 'active'    @settingsTab.classList.remove 'active'    @docPicker.style.display = 'block'    @content.style.display = 'none'    return   showSettings: ->    window.scrollTo 0, 0    @docPickerTab.classList.remove 'active'    @settingsTab.classList.add 'active'    @docPicker.style.display = 'none'    @content.style.display = 'block'    return   onTapSearch: =>    window.scrollTo 0, 0   onEscape: =>    @hideSidebar()   afterRoute: (route) =>    @hideSidebar()     if route is 'settings'      @showDocPicker()    else      @content.style.display = 'block'     if page.canGoBack()      @back.removeAttribute('disabled')    else      @back.setAttribute('disabled', 'disabled')     if page.canGoForward()      @forward.removeAttribute('disabled')    else      @forward.setAttribute('disabled', 'disabled')    return