class app.views.ListFold extends app.View @targetClass: '_list-dir' @handleClass: '_list-arrow' @activeClass: 'open' @events: click: 'onClick' @shortcuts: left: 'onLeft' right: 'onRight' constructor: (@el) -> super open: (el) -> if el and not el.classList.contains @constructor.activeClass el.classList.add @constructor.activeClass $.trigger el, 'open' return close: (el) -> if el and el.classList.contains @constructor.activeClass el.classList.remove @constructor.activeClass $.trigger el, 'close' return toggle: (el) -> if el.classList.contains @constructor.activeClass @close el else @open el return reset: -> while el = @findByClass @constructor.activeClass @close el return getCursor: -> @findByClass(app.views.ListFocus.activeClass) or @findByClass(app.views.ListSelect.activeClass) onLeft: => cursor = @getCursor() if cursor?.classList.contains @constructor.activeClass @close cursor return onRight: => cursor = @getCursor() if cursor?.classList.contains @constructor.targetClass @open cursor return onClick: (event) => return if event.which isnt 1 or event.metaKey or event.ctrlKey return unless event.pageY # ignore fabricated clicks el = $.eventTarget(event) el = el.parentNode if el.parentNode.tagName.toUpperCase() is 'SVG' if el.classList.contains @constructor.handleClass $.stopEvent(event) @toggle el.parentNode else if el.classList.contains @constructor.targetClass if el.hasAttribute('href') if el.classList.contains(@constructor.activeClass) @close(el) if el.classList.contains(app.views.ListSelect.activeClass) else @open(el) else @toggle(el) return
class app.views.ListFold extends app.View
@targetClass: '_list-dir'
@handleClass: '_list-arrow'
@activeClass: 'open'
@events:
click: 'onClick'
@shortcuts:
left: 'onLeft'
right: 'onRight'
constructor: (@el) -> super
open: (el) ->
if el and not el.classList.contains @constructor.activeClass
el.classList.add @constructor.activeClass
$.trigger el, 'open'
return
close: (el) ->
if el and el.classList.contains @constructor.activeClass
el.classList.remove @constructor.activeClass
$.trigger el, 'close'
return
toggle: (el) ->
if el.classList.contains @constructor.activeClass
@close el
else
@open el
return
reset: ->
while el = @findByClass @constructor.activeClass
@close el
return
getCursor: ->
@findByClass(app.views.ListFocus.activeClass) or @findByClass(app.views.ListSelect.activeClass)
onLeft: =>
cursor = @getCursor()
if cursor?.classList.contains @constructor.activeClass
@close cursor
return
onRight: =>
cursor = @getCursor()
if cursor?.classList.contains @constructor.targetClass
@open cursor
return
onClick: (event) =>
return if event.which isnt 1 or event.metaKey or event.ctrlKey
return unless event.pageY # ignore fabricated clicks
el = $.eventTarget(event)
el = el.parentNode if el.parentNode.tagName.toUpperCase() is 'SVG'
if el.classList.contains @constructor.handleClass
$.stopEvent(event)
@toggle el.parentNode
else if el.classList.contains @constructor.targetClass
if el.hasAttribute('href')
if el.classList.contains(@constructor.activeClass)
@close(el) if el.classList.contains(app.views.ListSelect.activeClass)
else
@open(el)
else
@toggle(el)
return