upjs-rails 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/dist/up.js +166 -71
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/flow.js.coffee +25 -7
- data/lib/assets/javascripts/up/form.js.coffee +8 -4
- data/lib/assets/javascripts/up/history.js.coffee +1 -2
- data/lib/assets/javascripts/up/link.js.coffee +4 -3
- data/lib/assets/javascripts/up/modal.js.coffee +3 -3
- data/lib/assets/javascripts/up/motion.js.coffee +51 -16
- data/lib/assets/javascripts/up/popup.js.coffee +3 -3
- data/lib/assets/javascripts/up/proxy.js.coffee +28 -13
- data/lib/assets/javascripts/up/slot.js.coffee +66 -0
- data/lib/assets/javascripts/up/util.js.coffee +5 -6
- data/lib/assets/javascripts/up.js.coffee +1 -1
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/spec/javascripts/helpers/set_timer.js.coffee +3 -0
- data/spec_app/spec/javascripts/helpers/to_be_around.js.coffee +5 -0
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +148 -4
- data/spec_app/spec/javascripts/up/{marker_spec.js.coffee → slot_spec.js.coffee} +3 -3
- data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +2 -2
- metadata +5 -3
- data/lib/assets/javascripts/up/marker.js.coffee +0 -39
@@ -0,0 +1,66 @@
|
|
1
|
+
###*
|
2
|
+
Content slots
|
3
|
+
=============
|
4
|
+
|
5
|
+
It can be useful to mark "slots" in your page layout where you expect
|
6
|
+
content to appear in the future.
|
7
|
+
|
8
|
+
For example, you might have
|
9
|
+
|
10
|
+
<div up-slot class="alerts"></div>
|
11
|
+
|
12
|
+
<script>
|
13
|
+
up.awaken('.alerts', function ($element) {
|
14
|
+
|
15
|
+
RELOAD SHOULD NOT CACHE
|
16
|
+
|
17
|
+
setInterval(3000, function() { up.reload('.alerts') });
|
18
|
+
});
|
19
|
+
</script>
|
20
|
+
|
21
|
+
Seeing that the `.alerts` container is empty, Up.js will hide it:
|
22
|
+
|
23
|
+
<div class="alerts" up-slot style="display: none"></div>
|
24
|
+
|
25
|
+
As soon as you
|
26
|
+
|
27
|
+
<div class="alerts" up-slot>
|
28
|
+
Meeting at 11:30 AM
|
29
|
+
</div>
|
30
|
+
|
31
|
+
|
32
|
+
TODO: Write some documentation
|
33
|
+
|
34
|
+
@class up.slot
|
35
|
+
###
|
36
|
+
up.slot = (->
|
37
|
+
|
38
|
+
u = up.util
|
39
|
+
|
40
|
+
hasContent = ($slot) ->
|
41
|
+
u.trim($slot.html()) != ''
|
42
|
+
|
43
|
+
check = ($element) ->
|
44
|
+
u.findWithSelf($element, '[up-slot]').each ->
|
45
|
+
$slot = $(this)
|
46
|
+
unless hasContent($slot)
|
47
|
+
$slot.hide()
|
48
|
+
|
49
|
+
###*
|
50
|
+
Use this attribute to mark up empty element containers that
|
51
|
+
you plan to update with content in the future.
|
52
|
+
|
53
|
+
An element with this attribute is automatically hidden
|
54
|
+
if it has no content, and is re-shown if it is updated with
|
55
|
+
content.
|
56
|
+
|
57
|
+
This is useful to prevent the element from applying unwanted
|
58
|
+
margins to the surrounding page flow.
|
59
|
+
|
60
|
+
@method [up-slot]
|
61
|
+
@ujs
|
62
|
+
###
|
63
|
+
up.bus.on 'fragment:ready', check
|
64
|
+
|
65
|
+
)()
|
66
|
+
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
###*
|
3
2
|
Utility functions
|
4
3
|
=================
|
@@ -328,7 +327,7 @@ up.util = (->
|
|
328
327
|
for arg in args
|
329
328
|
value = arg
|
330
329
|
value = value() if isFunction(value)
|
331
|
-
if
|
330
|
+
if isGiven(value)
|
332
331
|
match = value
|
333
332
|
break
|
334
333
|
match
|
@@ -402,11 +401,11 @@ up.util = (->
|
|
402
401
|
The element to animate.
|
403
402
|
@param {Object} lastFrame
|
404
403
|
The CSS properties that should be transitioned to.
|
405
|
-
@param {Number} [
|
404
|
+
@param {Number} [options.duration=300]
|
406
405
|
The duration of the animation, in milliseconds.
|
407
|
-
@param {Number} [
|
406
|
+
@param {Number} [options.delay=0]
|
408
407
|
The delay before the animation starts, in milliseconds.
|
409
|
-
@param {String} [
|
408
|
+
@param {String} [options.easing='ease']
|
410
409
|
The timing function that controls the animation's acceleration.
|
411
410
|
See [W3C documentation](http://www.w3.org/TR/css3-transitions/#transition-timing-function)
|
412
411
|
for a list of pre-defined timing functions.
|
@@ -517,7 +516,7 @@ up.util = (->
|
|
517
516
|
|
518
517
|
contains = (array, element) ->
|
519
518
|
array.indexOf(element) >= 0
|
520
|
-
|
519
|
+
|
521
520
|
castsToTrue = (object) ->
|
522
521
|
String(object) == "true"
|
523
522
|
|
data/lib/upjs/rails/version.rb
CHANGED
@@ -4,12 +4,156 @@ describe 'up.motion', ->
|
|
4
4
|
|
5
5
|
describe 'up.animate', ->
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
if up.browser.canCssAnimation()
|
8
|
+
|
9
|
+
it 'animates the given element', (done) ->
|
10
|
+
$element = affix('.element').text('content')
|
11
|
+
opacity = -> Number($element.css('opacity'))
|
12
|
+
up.animate($element, 'fade-in', duration: 100, easing: 'linear')
|
13
|
+
|
14
|
+
setTimer 0, ->
|
15
|
+
expect(opacity()).toBeAround(0.0, 0.25)
|
16
|
+
setTimer 50, ->
|
17
|
+
expect(opacity()).toBeAround(0.5, 0.25)
|
18
|
+
setTimer 100, ->
|
19
|
+
expect(opacity()).toBeAround(1.0, 0.25)
|
20
|
+
done()
|
21
|
+
|
22
|
+
it 'cancels an existing animation on the element by instantly jumping to the last frame', ->
|
23
|
+
$element = affix('.element').text('content')
|
24
|
+
up.animate($element, { 'font-size': '40px' }, duration: 10000, easing: 'linear')
|
25
|
+
up.animate($element, { 'fade-in' }, duration: 100, easing: 'linear')
|
26
|
+
expect($element.css('font-size')).toEqual('40px')
|
27
|
+
|
28
|
+
else
|
29
|
+
|
30
|
+
it "doesn't animate and directly sets the last frame instead", ->
|
31
|
+
$element = affix('.element').text('content')
|
32
|
+
up.animate($element, { 'font-size': '40px' }, duration: 10000, easing: 'linear')
|
33
|
+
expect($element.css('font-size')).toEqual('40px')
|
34
|
+
|
35
|
+
|
9
36
|
describe 'up.morph', ->
|
10
37
|
|
11
|
-
|
12
|
-
|
38
|
+
if up.browser.canCssAnimation()
|
39
|
+
|
40
|
+
it 'transitions between two element using ghosts', (done) ->
|
41
|
+
|
42
|
+
$old = affix('.old').text('old content').css(
|
43
|
+
position: 'absolute'
|
44
|
+
top: '10px'
|
45
|
+
left: '11px',
|
46
|
+
width: '12px',
|
47
|
+
height: '13px'
|
48
|
+
)
|
49
|
+
$new = affix('.new').text('new content').css(
|
50
|
+
position: 'absolute'
|
51
|
+
top: '20px'
|
52
|
+
left: '21px',
|
53
|
+
width: '22px',
|
54
|
+
height: '23px'
|
55
|
+
)
|
56
|
+
up.morph($old, $new, 'cross-fade', duration: 100, easing: 'linear')
|
57
|
+
|
58
|
+
# The actual animation will be performed on Ghosts since
|
59
|
+
# two element usually cannot exist in the DOM at the same time
|
60
|
+
# without undesired visual effects
|
61
|
+
$oldGhost = $('.old.up-ghost')
|
62
|
+
$newGhost = $('.new.up-ghost')
|
63
|
+
expect($oldGhost).toExist()
|
64
|
+
expect($newGhost).toExist()
|
65
|
+
|
66
|
+
# Ghosts should be inserted before (not after) the element
|
67
|
+
# or the browser scroll position will be too low after the
|
68
|
+
# transition ends.
|
69
|
+
expect($oldGhost.next()).toEqual($old)
|
70
|
+
expect($newGhost.next()).toEqual($new)
|
71
|
+
|
72
|
+
# The actual elements are hidden, but $old will take up its original
|
73
|
+
# space until the animation completes.
|
74
|
+
expect($old.css(['display', 'visibility'])).toEqual(
|
75
|
+
display: 'block',
|
76
|
+
visibility: 'hidden'
|
77
|
+
)
|
78
|
+
expect($new.css(['display', 'visibility'])).toEqual(
|
79
|
+
display: 'none',
|
80
|
+
visibility: 'visible'
|
81
|
+
)
|
82
|
+
|
83
|
+
# Ghosts will hover over $old and $new using absolute positioning,
|
84
|
+
# matching the coordinates of the original elements.
|
85
|
+
expect($oldGhost.css(['position', 'top', 'left', 'width', 'height'])).toEqual(
|
86
|
+
position: 'absolute'
|
87
|
+
top: '10px'
|
88
|
+
left: '11px',
|
89
|
+
width: '12px',
|
90
|
+
height: '13px'
|
91
|
+
)
|
92
|
+
expect($newGhost.css(['position', 'top', 'left', 'width', 'height'])).toEqual(
|
93
|
+
position: 'absolute'
|
94
|
+
top: '20px'
|
95
|
+
left: '21px',
|
96
|
+
width: '22px',
|
97
|
+
height: '23px'
|
98
|
+
)
|
99
|
+
|
100
|
+
opacity = ($element) -> Number($element.css('opacity'))
|
101
|
+
|
102
|
+
setTimer 0, ->
|
103
|
+
expect(opacity($newGhost)).toBeAround(0.0, 0.25)
|
104
|
+
expect(opacity($oldGhost)).toBeAround(1.0, 0.25)
|
105
|
+
|
106
|
+
setTimer 40, ->
|
107
|
+
expect(opacity($newGhost)).toBeAround(0.4, 0.25)
|
108
|
+
expect(opacity($oldGhost)).toBeAround(0.6, 0.25)
|
109
|
+
|
110
|
+
setTimer 70, ->
|
111
|
+
expect(opacity($newGhost)).toBeAround(0.7, 0.25)
|
112
|
+
expect(opacity($oldGhost)).toBeAround(0.3, 0.25)
|
113
|
+
|
114
|
+
setTimer 125, ->
|
115
|
+
# Once our two ghosts have rendered their visual effect,
|
116
|
+
# we remove them from the DOM.
|
117
|
+
expect($newGhost).not.toBeInDOM()
|
118
|
+
expect($oldGhost).not.toBeInDOM()
|
119
|
+
|
120
|
+
# The old element is still in the DOM, but hidden.
|
121
|
+
# Morphing does *not* remove the target element.
|
122
|
+
expect($old.css(['display', 'visibility'])).toEqual(
|
123
|
+
display: 'none',
|
124
|
+
visibility: 'hidden'
|
125
|
+
)
|
126
|
+
expect($new.css(['display', 'visibility'])).toEqual(
|
127
|
+
display: 'block',
|
128
|
+
visibility: 'visible'
|
129
|
+
)
|
130
|
+
|
131
|
+
done()
|
132
|
+
|
133
|
+
it 'cancels an existing transition on the element by instantly jumping to the last frame', ->
|
134
|
+
$old = affix('.old').text('old content')
|
135
|
+
$new = affix('.new').text('new content')
|
136
|
+
|
137
|
+
up.morph($old, $new, 'cross-fade', duration: 200)
|
138
|
+
$ghost1 = $('.old.up-ghost')
|
139
|
+
expect($ghost1).toHaveLength(1)
|
140
|
+
|
141
|
+
up.morph($old, $new, 'cross-fade', duration: 200)
|
142
|
+
$ghost2 = $('.old.up-ghost')
|
143
|
+
# Check that we didn't create additional ghosts
|
144
|
+
expect($ghost2).toHaveLength(1)
|
145
|
+
# Check that it's a different ghosts
|
146
|
+
expect($ghost2).not.toEqual($ghost1)
|
147
|
+
|
148
|
+
else
|
149
|
+
|
150
|
+
it "doesn't animate and hides the first element instead", ->
|
151
|
+
$old = affix('.old').text('old content')
|
152
|
+
$new = affix('.new').text('new content')
|
153
|
+
up.morph($old, $new, 'cross-fade', duration: 1000)
|
154
|
+
expect($old).toBeHidden()
|
155
|
+
expect($new).toBeVisible()
|
156
|
+
|
13
157
|
describe 'up.transition', ->
|
14
158
|
|
15
159
|
it 'should have tests'
|
@@ -2,15 +2,15 @@ describe 'up.marker', ->
|
|
2
2
|
|
3
3
|
describe 'unobtrusive behavior', ->
|
4
4
|
|
5
|
-
describe '[up-
|
5
|
+
describe '[up-slot]', ->
|
6
6
|
|
7
7
|
it 'hides empty containers', ->
|
8
|
-
$element = affix('.element[up-
|
8
|
+
$element = affix('.element[up-slot]')
|
9
9
|
up.ready($element)
|
10
10
|
expect($element).not.toBeVisible()
|
11
11
|
|
12
12
|
it 'does not hide empty containers', ->
|
13
|
-
$element = affix('.element[up-
|
13
|
+
$element = affix('.element[up-slot]').text('content')
|
14
14
|
up.ready($element)
|
15
15
|
expect($element).toBeVisible()
|
16
16
|
|
@@ -19,8 +19,8 @@ describe 'up.tooltip', ->
|
|
19
19
|
expect($tooltip).toHaveText('tooltip text')
|
20
20
|
tooltipBox = up.util.measure($tooltip, relative: true)
|
21
21
|
linkBox = up.util.measure($link, relative: true)
|
22
|
-
expect(tooltipBox.top).
|
23
|
-
expect(tooltipBox.left).
|
22
|
+
expect(tooltipBox.top).toBeAround(linkBox.top - tooltipBox.height, 15)
|
23
|
+
expect(tooltipBox.left).toBeAround(linkBox.left + 0.5 * (linkBox.width - tooltipBox.width), 15)
|
24
24
|
|
25
25
|
it 'allows HTML for the tooltip text'
|
26
26
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
@@ -125,13 +125,13 @@ files:
|
|
125
125
|
- lib/assets/javascripts/up/history.js.coffee
|
126
126
|
- lib/assets/javascripts/up/link.js.coffee
|
127
127
|
- lib/assets/javascripts/up/magic.js.coffee
|
128
|
-
- lib/assets/javascripts/up/marker.js.coffee
|
129
128
|
- lib/assets/javascripts/up/modal.js.coffee
|
130
129
|
- lib/assets/javascripts/up/module.js.coffee
|
131
130
|
- lib/assets/javascripts/up/motion.js.coffee
|
132
131
|
- lib/assets/javascripts/up/navigation.js.coffee
|
133
132
|
- lib/assets/javascripts/up/popup.js.coffee
|
134
133
|
- lib/assets/javascripts/up/proxy.js.coffee
|
134
|
+
- lib/assets/javascripts/up/slot.js.coffee
|
135
135
|
- lib/assets/javascripts/up/tooltip.js.coffee
|
136
136
|
- lib/assets/javascripts/up/util.js.coffee
|
137
137
|
- lib/assets/javascripts/up/viewport.js.coffee
|
@@ -227,6 +227,8 @@ files:
|
|
227
227
|
- spec_app/spec/javascripts/helpers/index.js.coffee
|
228
228
|
- spec_app/spec/javascripts/helpers/reset_path.js.coffee
|
229
229
|
- spec_app/spec/javascripts/helpers/reset_up.js.coffee
|
230
|
+
- spec_app/spec/javascripts/helpers/set_timer.js.coffee
|
231
|
+
- spec_app/spec/javascripts/helpers/to_be_around.js.coffee
|
230
232
|
- spec_app/spec/javascripts/helpers/to_equal_jquery.js.coffee
|
231
233
|
- spec_app/spec/javascripts/helpers/trigger.js.coffee
|
232
234
|
- spec_app/spec/javascripts/support/jasmine.yml
|
@@ -236,12 +238,12 @@ files:
|
|
236
238
|
- spec_app/spec/javascripts/up/history_spec.js.coffee
|
237
239
|
- spec_app/spec/javascripts/up/link_spec.js.coffee
|
238
240
|
- spec_app/spec/javascripts/up/magic_spec.js.coffee
|
239
|
-
- spec_app/spec/javascripts/up/marker_spec.js.coffee
|
240
241
|
- spec_app/spec/javascripts/up/modal_spec.js.coffee
|
241
242
|
- spec_app/spec/javascripts/up/motion_spec.js.coffee
|
242
243
|
- spec_app/spec/javascripts/up/navigation_spec.js.coffee
|
243
244
|
- spec_app/spec/javascripts/up/popup_spec.js.coffee
|
244
245
|
- spec_app/spec/javascripts/up/proxy_spec.js.coffee
|
246
|
+
- spec_app/spec/javascripts/up/slot_spec.js.coffee
|
245
247
|
- spec_app/spec/javascripts/up/tooltip_spec.js.coffee
|
246
248
|
- spec_app/spec/javascripts/up/util_spec.js.coffee
|
247
249
|
- spec_app/test/controllers/.keep
|
@@ -1,39 +0,0 @@
|
|
1
|
-
###*
|
2
|
-
Markers
|
3
|
-
=======
|
4
|
-
|
5
|
-
TODO: Write some documentation
|
6
|
-
|
7
|
-
@class up.marker
|
8
|
-
###
|
9
|
-
up.marker = (->
|
10
|
-
|
11
|
-
u = up.util
|
12
|
-
|
13
|
-
hasContent = ($marker) ->
|
14
|
-
u.trim($marker.html()) != ''
|
15
|
-
|
16
|
-
check = ($element) ->
|
17
|
-
u.findWithSelf($element, '[up-marker]').each ->
|
18
|
-
$marker = $(this)
|
19
|
-
unless hasContent($marker)
|
20
|
-
$marker.hide()
|
21
|
-
|
22
|
-
###*
|
23
|
-
Use this attribute to mark up empty element containers that
|
24
|
-
you plan to update with content in the future.
|
25
|
-
|
26
|
-
An element with this attribute is automatically hidden
|
27
|
-
if it has no content, and is re-shown if it is updated with
|
28
|
-
content.
|
29
|
-
|
30
|
-
This is useful to prevent the element from applying unwanted
|
31
|
-
margins to the surrounding page flow.
|
32
|
-
|
33
|
-
@method [up-marker]
|
34
|
-
@ujs
|
35
|
-
###
|
36
|
-
up.bus.on 'fragment:ready', check
|
37
|
-
|
38
|
-
)()
|
39
|
-
|