1
0

sidebar_hover.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. class app.views.SidebarHover extends app.View
  2. @itemClass: '_list-hover'
  3. @events:
  4. focus: 'onFocus'
  5. blur: 'onBlur'
  6. mouseover: 'onMouseover'
  7. mouseout: 'onMouseout'
  8. scroll: 'onScroll'
  9. click: 'onClick'
  10. @routes:
  11. after: 'onRoute'
  12. constructor: (@el) ->
  13. unless isPointerEventsSupported()
  14. delete @constructor.events.mouseover
  15. super
  16. show: (el) ->
  17. unless el is @cursor
  18. @hide()
  19. if @isTarget(el) and @isTruncated(el.lastElementChild or el)
  20. @cursor = el
  21. @clone = @makeClone @cursor
  22. $.append document.body, @clone
  23. @offsetTop ?= @el.offsetTop
  24. @position()
  25. return
  26. hide: ->
  27. if @cursor
  28. $.remove @clone
  29. @cursor = @clone = null
  30. return
  31. position: =>
  32. if @cursor
  33. rect = $.rect(@cursor)
  34. if rect.top >= @offsetTop
  35. @clone.style.top = rect.top + 'px'
  36. @clone.style.left = rect.left + 'px'
  37. else
  38. @hide()
  39. return
  40. makeClone: (el) ->
  41. clone = el.cloneNode(true)
  42. clone.classList.add 'clone'
  43. clone
  44. isTarget: (el) ->
  45. el?.classList?.contains @constructor.itemClass
  46. isSelected: (el) ->
  47. el.classList.contains 'active'
  48. isTruncated: (el) ->
  49. el.scrollWidth > el.offsetWidth
  50. onFocus: (event) =>
  51. @focusTime = Date.now()
  52. @show event.target
  53. return
  54. onBlur: =>
  55. @hide()
  56. return
  57. onMouseover: (event) =>
  58. if @isTarget(event.target) and not @isSelected(event.target) and @mouseActivated()
  59. @show event.target
  60. return
  61. onMouseout: (event) =>
  62. if @isTarget(event.target) and @mouseActivated()
  63. @hide()
  64. return
  65. mouseActivated: ->
  66. # Skip mouse events caused by focus events scrolling the sidebar.
  67. not @focusTime or Date.now() - @focusTime > 500
  68. onScroll: =>
  69. @position()
  70. return
  71. onClick: (event) =>
  72. if event.target is @clone
  73. $.click @cursor
  74. return
  75. onRoute: =>
  76. @hide()
  77. return
  78. isPointerEventsSupported = ->
  79. el = document.createElement 'div'
  80. el.style.cssText = 'pointer-events: auto'
  81. el.style.pointerEvents is 'auto'