-
Notifications
You must be signed in to change notification settings - Fork 1
/
open.coffee
122 lines (121 loc) · 3.04 KB
/
open.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
module.exports =
_name: "open"
_v: 1
mixins: [
require "./computed"
require "./events"
require "./@popstate"
]
events:
popstate:
active: -> @onBody and @openingOrOpen
cbs: -> @hide(false)
click:
el: document.documentElement
outside: true
cbs: "hide"
active: -> @openingOrOpen and not @keepOpen
delay: true
destroy: true
keyup:
el:document.documentElement
notPrevented: true
destroy: true
keyCode: [27]
active: -> @openingOrOpen and not @keepOpen
cbs: "hide"
props:
open:
type: Boolean
keepOpen:
type: Boolean
data: ->
isOpen: null
opening: false
closing: false
openingOrOpen: false
toggleAnimate: true
methods:
_attach: ->
if not @parentElement
if @onBody
document.body.appendChild @ if @parentElement != document.body
else if @parentElement != @__parentElement
@__parentElement.replaceChild @, @__placeholder
_detach: ->
if @parentElement
if @onBody
@remove() if @parentElement == document.body
else if @parentElement == @__parentElement
@__parentElement.replaceChild @__placeholder, @
_setOpen: ->
@closing = false
@opening = false
@isOpen = true
@open = true
@openingOrOpen = true
@$emit name:"toggle", detail:true
@onOpen?()
_setClose: ->
@closing = false
@opening = false
@isOpen = false
@open = false
@openingOrOpen = false
@$emit name:"toggle", detail:false
@onClose?()
show: (animate) ->
return if @openingOrOpen
@_attach()
@toggleAnimate = animate = animate != false
@opening = true
@openingOrOpen = true
@closing = false
@onShow?(animate)
if @$animate and @enter?
@animation = @enter @$cancelAnimation @animation,
animate: animate
done: @_setOpen
else
@setOpen(@)
hide: (animate) ->
return if @closing or not @openingOrOpen
@toggleAnimate = animate = animate != false
@closing = true
@openingOrOpen = false
@onHide?(animate)
done = ->
@_setClose()
@_detach()
if @$animate and @leave?
@animation = @leave @$cancelAnimation @animation,
animate: animate
done: done
else
done.call(@)
toggle: (animate) ->
return if @beforeToggle? and not @beforeToggle(animate)
if @isOpen
@hide(animate)
else
@show(animate)
watch:
open: (val) ->
unless @isOpen?
if val
@toggle(false)
else
@isOpen = val
else
if val != @isOpen
@toggle()
connectedCallback: ->
if @_isFirstConnect
@__parentElement = @parentElement
@__placeholder = document.createComment("#open")
@__parentElement.replaceChild @__placeholder, @
disconnectedCallback: ->
if @isOpen
@toggle(false)
test module.exports, {}, (el) ->
it "should work", ->