upjs-rails 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +142 -0
- data/README.md +4 -1
- data/design/ghost-debugging.txt +118 -0
- data/design/homepage.txt +236 -0
- data/dist/up-bootstrap.js +7 -3
- data/dist/up-bootstrap.min.js +1 -1
- data/dist/up.js +1611 -1222
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/bus.js.coffee +1 -1
- data/lib/assets/javascripts/up/flow.js.coffee +21 -20
- data/lib/assets/javascripts/up/form.js.coffee +11 -12
- data/lib/assets/javascripts/up/history.js.coffee +137 -20
- data/lib/assets/javascripts/up/layout.js.coffee +134 -21
- data/lib/assets/javascripts/up/link.js.coffee +40 -17
- data/lib/assets/javascripts/up/modal.js.coffee +2 -2
- data/lib/assets/javascripts/up/motion.js.coffee +3 -1
- data/lib/assets/javascripts/up/navigation.js.coffee +5 -5
- data/lib/assets/javascripts/up/popup.js.coffee +2 -2
- data/lib/assets/javascripts/up/proxy.js.coffee +43 -82
- data/lib/assets/javascripts/up/tooltip.js.coffee +1 -1
- data/lib/assets/javascripts/up/util.js.coffee +145 -14
- data/lib/assets/javascripts/up-bootstrap/layout-ext.js.coffee +2 -2
- data/lib/assets/javascripts/up-bootstrap/navigation-ext.js.coffee +3 -1
- data/lib/assets/javascripts/up.js.coffee +2 -2
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/config/routes.rb +1 -2
- data/spec_app/spec/javascripts/helpers/knife.js.coffee +1 -1
- data/spec_app/spec/javascripts/helpers/last_request.js.coffee +4 -0
- data/spec_app/spec/javascripts/helpers/set_timer.js.coffee +3 -3
- data/spec_app/spec/javascripts/helpers/to_end_with.js.coffee +5 -0
- data/spec_app/spec/javascripts/up/flow_spec.js.coffee +8 -6
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -1
- data/spec_app/spec/javascripts/up/history_spec.js.coffee +80 -1
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +64 -4
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +2 -2
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +7 -7
- data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +6 -6
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +2 -2
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +22 -4
- metadata +7 -2
@@ -265,7 +265,10 @@ up.util = (->
|
|
265
265
|
|
266
266
|
isString = (object) ->
|
267
267
|
typeof(object) == 'string'
|
268
|
-
|
268
|
+
|
269
|
+
isNumber = (object) ->
|
270
|
+
typeof(object) == 'number'
|
271
|
+
|
269
272
|
isHash = (object) ->
|
270
273
|
typeof(object) == 'object' && !!object
|
271
274
|
|
@@ -559,11 +562,19 @@ up.util = (->
|
|
559
562
|
contains = (stringOrArray, element) ->
|
560
563
|
stringOrArray.indexOf(element) >= 0
|
561
564
|
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
565
|
+
castedAttr = ($element, attrName) ->
|
566
|
+
value = $element.attr(attrName)
|
567
|
+
switch value
|
568
|
+
when 'false' then false
|
569
|
+
when 'true' then true
|
570
|
+
when '' then true
|
571
|
+
else value # other strings, undefined, null, ...
|
572
|
+
|
573
|
+
# castsToTrue = (object) ->
|
574
|
+
# String(object) == "true"
|
575
|
+
#
|
576
|
+
# castsToFalse = (object) ->
|
577
|
+
# String(object) == "false"
|
567
578
|
|
568
579
|
locationFromXhr = (xhr) ->
|
569
580
|
xhr.getResponseHeader('X-Up-Location')
|
@@ -618,20 +629,138 @@ up.util = (->
|
|
618
629
|
array.splice(index, 1)
|
619
630
|
element
|
620
631
|
|
632
|
+
###*
|
633
|
+
@method up.util.cache
|
634
|
+
@param {Number|Function} [config.size]
|
635
|
+
Maximum number of cache entries.
|
636
|
+
Set to `undefined` to not limit the cache size.
|
637
|
+
@param {Number|Function} [config.expiry]
|
638
|
+
The number of milliseconds after which a cache entry
|
639
|
+
will be discarded.
|
640
|
+
@param {String} [config.log]
|
641
|
+
A prefix for log entries printed by this cache object.
|
642
|
+
###
|
643
|
+
cache = (config) ->
|
644
|
+
|
645
|
+
store = undefined
|
646
|
+
|
647
|
+
clear = ->
|
648
|
+
store = {}
|
649
|
+
|
650
|
+
clear()
|
651
|
+
|
652
|
+
log = (args...) ->
|
653
|
+
if config.log
|
654
|
+
args[0] = "[#{config.log}] #{args[0]}"
|
655
|
+
debug(args...)
|
656
|
+
|
657
|
+
maxSize = ->
|
658
|
+
if isMissing(config.size)
|
659
|
+
undefined
|
660
|
+
else if isFunction(config.size)
|
661
|
+
config.size()
|
662
|
+
else if isNumber(config.size)
|
663
|
+
config.size
|
664
|
+
else
|
665
|
+
error("Invalid size config: %o", config.size)
|
666
|
+
|
667
|
+
expiryMilis = ->
|
668
|
+
if isMissing(config.expiry)
|
669
|
+
undefined
|
670
|
+
else if isFunction(config.expiry)
|
671
|
+
config.expiry()
|
672
|
+
else if isNumber(config.expiry)
|
673
|
+
config.expiry
|
674
|
+
else
|
675
|
+
error("Invalid expiry config: %o", config.expiry)
|
676
|
+
|
677
|
+
normalizeStoreKey = (key) ->
|
678
|
+
if config.key
|
679
|
+
config.key(key)
|
680
|
+
else
|
681
|
+
key.toString()
|
682
|
+
|
683
|
+
trim = ->
|
684
|
+
storeKeys = copy(keys(store))
|
685
|
+
size = maxSize()
|
686
|
+
if size && storeKeys.length > size
|
687
|
+
oldestKey = null
|
688
|
+
oldestTimestamp = null
|
689
|
+
each storeKeys, (key) ->
|
690
|
+
promise = store[key] # we don't need to call cacheKey here
|
691
|
+
timestamp = promise.timestamp
|
692
|
+
if !oldestTimestamp || oldestTimestamp > timestamp
|
693
|
+
oldestKey = key
|
694
|
+
oldestTimestamp = timestamp
|
695
|
+
delete store[oldestKey] if oldestKey
|
696
|
+
|
697
|
+
alias = (oldKey, newKey) ->
|
698
|
+
value = get(oldKey)
|
699
|
+
if isDefined(value)
|
700
|
+
set(newKey, value)
|
701
|
+
|
702
|
+
timestamp = ->
|
703
|
+
(new Date()).valueOf()
|
704
|
+
|
705
|
+
set = (key, value) ->
|
706
|
+
storeKey = normalizeStoreKey(key)
|
707
|
+
store[storeKey] =
|
708
|
+
timestamp: timestamp()
|
709
|
+
value: value
|
710
|
+
|
711
|
+
remove = (key) ->
|
712
|
+
storeKey = normalizeStoreKey(key)
|
713
|
+
delete store[storeKey]
|
714
|
+
|
715
|
+
isFresh = (entry) ->
|
716
|
+
expiry = expiryMilis()
|
717
|
+
if expiry
|
718
|
+
timeSinceTouch = timestamp() - entry.timestamp
|
719
|
+
timeSinceTouch < expiryMilis()
|
720
|
+
else
|
721
|
+
true
|
722
|
+
|
723
|
+
get = (key, fallback = undefined) ->
|
724
|
+
storeKey = normalizeStoreKey(key)
|
725
|
+
if entry = store[storeKey]
|
726
|
+
if !isFresh(entry)
|
727
|
+
log("Discarding stale cache entry for %o", key)
|
728
|
+
remove(key)
|
729
|
+
fallback
|
730
|
+
else
|
731
|
+
log("Cache hit for %o", key)
|
732
|
+
entry.value
|
733
|
+
else
|
734
|
+
log("Cache miss for %o", key)
|
735
|
+
fallback
|
736
|
+
|
737
|
+
alias: alias
|
738
|
+
get: get
|
739
|
+
set: set
|
740
|
+
remove: remove
|
741
|
+
clear: clear
|
742
|
+
|
743
|
+
|
621
744
|
config = (factoryOptions = {}) ->
|
622
745
|
hash =
|
746
|
+
ensureKeyExists: (key) ->
|
747
|
+
factoryOptions.hasOwnProperty(key) or error("Unknown setting %o", key)
|
623
748
|
reset: ->
|
624
749
|
ownKeys = copy(Object.getOwnPropertyNames(hash))
|
625
750
|
for key in ownKeys
|
626
751
|
delete hash[key] unless contains(apiKeys, key)
|
627
752
|
hash.update copy(factoryOptions)
|
628
|
-
update: (options
|
629
|
-
|
630
|
-
if
|
631
|
-
hash
|
753
|
+
update: (options) ->
|
754
|
+
if options
|
755
|
+
if isString(options)
|
756
|
+
hash.ensureKeyExists(options)
|
757
|
+
hash[options]
|
632
758
|
else
|
633
|
-
|
634
|
-
|
759
|
+
for key, value of options
|
760
|
+
hash.ensureKeyExists(key)
|
761
|
+
hash[key] = value
|
762
|
+
else
|
763
|
+
hash
|
635
764
|
apiKeys = Object.getOwnPropertyNames(hash)
|
636
765
|
hash.reset()
|
637
766
|
hash
|
@@ -705,8 +834,9 @@ up.util = (->
|
|
705
834
|
endsWith: endsWith
|
706
835
|
isArray: isArray
|
707
836
|
toArray: toArray
|
708
|
-
castsToTrue: castsToTrue
|
709
|
-
castsToFalse: castsToFalse
|
837
|
+
# castsToTrue: castsToTrue
|
838
|
+
# castsToFalse: castsToFalse
|
839
|
+
castedAttr: castedAttr
|
710
840
|
locationFromXhr: locationFromXhr
|
711
841
|
methodFromXhr: methodFromXhr
|
712
842
|
clientSize: clientSize
|
@@ -721,6 +851,7 @@ up.util = (->
|
|
721
851
|
memoize: memoize
|
722
852
|
scrollbarWidth: scrollbarWidth
|
723
853
|
config: config
|
854
|
+
cache: cache
|
724
855
|
unwrapElement: unwrapElement
|
725
856
|
|
726
857
|
)()
|
@@ -1,5 +1,5 @@
|
|
1
1
|
defaults = up.layout.defaults()
|
2
2
|
|
3
3
|
up.layout.defaults
|
4
|
-
fixedTop:
|
5
|
-
fixedBottom:
|
4
|
+
fixedTop: defaults.fixedTop.concat(['.navbar-fixed-top'])
|
5
|
+
fixedBottom: defaults.fixedBottom.concat(['.navbar-fixed-bottom'])
|
@@ -2,10 +2,10 @@
|
|
2
2
|
#= require up/util
|
3
3
|
#= require up/browser
|
4
4
|
#= require up/bus
|
5
|
-
#= require up/layout
|
6
|
-
#= require up/flow
|
7
5
|
#= require up/magic
|
8
6
|
#= require up/history
|
7
|
+
#= require up/layout
|
8
|
+
#= require up/flow
|
9
9
|
#= require up/motion
|
10
10
|
#= require up/proxy
|
11
11
|
#= require up/link
|
data/lib/upjs/rails/version.rb
CHANGED
data/spec_app/Gemfile.lock
CHANGED
data/spec_app/config/routes.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
beforeEach ->
|
2
|
+
@setTimer = (millis, fun) ->
|
3
|
+
setTimeout(fun, millis)
|
@@ -22,7 +22,7 @@ describe 'up.flow', ->
|
|
22
22
|
"""
|
23
23
|
|
24
24
|
@respond = ->
|
25
|
-
|
25
|
+
@lastRequest().respondWith
|
26
26
|
status: 200
|
27
27
|
contentType: 'text/html'
|
28
28
|
responseText: @responseText
|
@@ -114,7 +114,9 @@ describe 'up.flow', ->
|
|
114
114
|
expect(window.scriptTagExecuted).toHaveBeenCalledWith('middle')
|
115
115
|
done()
|
116
116
|
|
117
|
-
|
117
|
+
it 'restores the scroll positions of all viewports within the target with options.restoreScroll'
|
118
|
+
|
119
|
+
describe 'revealing of elements', ->
|
118
120
|
|
119
121
|
beforeEach ->
|
120
122
|
@revealedHTML = ''
|
@@ -126,14 +128,14 @@ describe 'up.flow', ->
|
|
126
128
|
@request = up.replace('.middle', '/path')
|
127
129
|
@respond()
|
128
130
|
@request.then =>
|
129
|
-
expect(up.reveal).toHaveBeenCalledWith(@oldMiddle
|
131
|
+
expect(up.reveal).toHaveBeenCalledWith(@oldMiddle)
|
130
132
|
done()
|
131
133
|
|
132
134
|
it 'reveals a new element that is being appended', (done) ->
|
133
135
|
@request = up.replace('.middle:after', '/path')
|
134
136
|
@respond()
|
135
137
|
@request.then =>
|
136
|
-
expect(up.reveal).not.toHaveBeenCalledWith(@oldMiddle
|
138
|
+
expect(up.reveal).not.toHaveBeenCalledWith(@oldMiddle)
|
137
139
|
# Text nodes are wrapped in a .up-insertion container so we can
|
138
140
|
# animate them and measure their position/size for scrolling.
|
139
141
|
# This is not possible for container-less text nodes.
|
@@ -146,7 +148,7 @@ describe 'up.flow', ->
|
|
146
148
|
@request = up.replace('.middle:before', '/path')
|
147
149
|
@respond()
|
148
150
|
@request.then =>
|
149
|
-
expect(up.reveal).not.toHaveBeenCalledWith(@oldMiddle
|
151
|
+
expect(up.reveal).not.toHaveBeenCalledWith(@oldMiddle)
|
150
152
|
# Text nodes are wrapped in a .up-insertion container so we can
|
151
153
|
# animate them and measure their position/size for scrolling.
|
152
154
|
# This is not possible for container-less text nodes.
|
@@ -253,7 +255,7 @@ describe 'up.flow', ->
|
|
253
255
|
expect($('.element')).toHaveText('new text')
|
254
256
|
done()
|
255
257
|
|
256
|
-
request =
|
258
|
+
request = @lastRequest()
|
257
259
|
expect(request.url).toMatch(/\/source$/)
|
258
260
|
|
259
261
|
request.respondWith
|
@@ -9,4 +9,83 @@ describe 'up.history', ->
|
|
9
9
|
describe 'up.history.push', ->
|
10
10
|
|
11
11
|
it 'should have tests'
|
12
|
-
|
12
|
+
|
13
|
+
describe 'unobtrusive behavior', ->
|
14
|
+
|
15
|
+
describe '[up-back]', ->
|
16
|
+
|
17
|
+
it 'sets an [up-href] attribute to the previous URL and sets the up-restore-scroll attribute to "true"', ->
|
18
|
+
up.history.push('/one')
|
19
|
+
console.log("url is now %o, previous was %o", up.history.url(), up.history.previousUrl())
|
20
|
+
up.history.push('/two')
|
21
|
+
console.log("url is now %o, previous was %o", up.history.url(), up.history.previousUrl())
|
22
|
+
$element = up.ready(affix('a[href="/three"][up-back]').text('text'))
|
23
|
+
console.log("url is now %o, previous was %o", up.history.url(), up.history.previousUrl())
|
24
|
+
expect($element.attr('href')).toEndWith('/three')
|
25
|
+
expect($element.attr('up-href')).toEndWith('/one')
|
26
|
+
expect($element.attr('up-restore-scroll')).toBe('')
|
27
|
+
expect($element.attr('up-follow')).toBe('')
|
28
|
+
|
29
|
+
it 'does not overwrite an existing up-href or up-restore-scroll attribute'
|
30
|
+
|
31
|
+
it 'does not set an up-href attribute if there is no previous URL'
|
32
|
+
|
33
|
+
describe 'scroll restauration', ->
|
34
|
+
|
35
|
+
afterEach ->
|
36
|
+
$('.viewport').remove()
|
37
|
+
|
38
|
+
it 'restores the scroll position of viewports when the user hits the back button', (done) ->
|
39
|
+
|
40
|
+
longContentHtml = """
|
41
|
+
<div class="viewport" style="width: 100px; height: 100px; overflow-y: scroll">
|
42
|
+
<div class="content" style="height: 1000px"></div>
|
43
|
+
</div>
|
44
|
+
"""
|
45
|
+
|
46
|
+
respond = (html) =>
|
47
|
+
@lastRequest().respondWith
|
48
|
+
status: 200
|
49
|
+
contentType: 'text/html'
|
50
|
+
responseText: longContentHtml
|
51
|
+
|
52
|
+
$viewport = $(longContentHtml).appendTo(document.body)
|
53
|
+
|
54
|
+
up.layout.defaults(viewports: ['.viewport'])
|
55
|
+
up.history.defaults(popTargets: ['.viewport'])
|
56
|
+
|
57
|
+
$viewport.append(longContentHtml)
|
58
|
+
|
59
|
+
up.replace('.content', '/one')
|
60
|
+
respond()
|
61
|
+
$viewport.scrollTop(50)
|
62
|
+
|
63
|
+
up.replace('.content', '/two')
|
64
|
+
respond()
|
65
|
+
$('.viewport').scrollTop(150)
|
66
|
+
|
67
|
+
up.replace('.content', '/three')
|
68
|
+
respond()
|
69
|
+
$('.viewport').scrollTop(250)
|
70
|
+
|
71
|
+
history.back()
|
72
|
+
@setTimer 50, =>
|
73
|
+
respond() # we need to respond since we've never requested /two with the popTarget
|
74
|
+
expect($('.viewport').scrollTop()).toBe(150)
|
75
|
+
|
76
|
+
history.back()
|
77
|
+
@setTimer 50, =>
|
78
|
+
respond() # we need to respond since we've never requested /one with the popTarget
|
79
|
+
expect($('.viewport').scrollTop()).toBe(50)
|
80
|
+
|
81
|
+
history.forward()
|
82
|
+
@setTimer 50, =>
|
83
|
+
# No need to respond since we requested /two with the popTarget
|
84
|
+
# when we went backwards
|
85
|
+
expect($('.viewport').scrollTop()).toBe(150)
|
86
|
+
|
87
|
+
history.forward()
|
88
|
+
@setTimer 50, =>
|
89
|
+
respond() # we need to respond since we've never requested /three with the popTarget
|
90
|
+
expect($('.viewport').scrollTop()).toBe(250)
|
91
|
+
done()
|
@@ -1,5 +1,7 @@
|
|
1
1
|
describe 'up.link', ->
|
2
|
-
|
2
|
+
|
3
|
+
u = up.util
|
4
|
+
|
3
5
|
describe 'Javascript functions', ->
|
4
6
|
|
5
7
|
describe 'up.follow', ->
|
@@ -14,7 +16,7 @@ describe 'up.link', ->
|
|
14
16
|
|
15
17
|
promise = up.follow($link)
|
16
18
|
|
17
|
-
|
19
|
+
@lastRequest().respondWith
|
18
20
|
status: 200
|
19
21
|
contentType: 'text/html'
|
20
22
|
responseText:
|
@@ -33,9 +35,67 @@ describe 'up.link', ->
|
|
33
35
|
it 'uses the method from a data-method attribute', ->
|
34
36
|
$link = affix('a[href="/path"][data-method="PUT"]')
|
35
37
|
up.follow($link)
|
36
|
-
request =
|
38
|
+
request = @lastRequest()
|
37
39
|
expect(request.method).toBe('PUT')
|
38
40
|
|
41
|
+
it 'adds history entries and allows the user to use the back- and forward-buttons', (done) ->
|
42
|
+
|
43
|
+
# By default, up.history will replace the <body> tag when
|
44
|
+
# the user presses the back-button. We reconfigure this
|
45
|
+
# so we don't lose the Jasmine runner interface.
|
46
|
+
up.history.defaults
|
47
|
+
popTargets: ['.container']
|
48
|
+
|
49
|
+
|
50
|
+
respondWith = (html) =>
|
51
|
+
@lastRequest().respondWith
|
52
|
+
status: 200
|
53
|
+
contentType: 'text/html'
|
54
|
+
responseText: "<div class='container'><div class='target'>#{html}</div></div>"
|
55
|
+
|
56
|
+
followAndRespond = ($link, html) ->
|
57
|
+
promise = up.follow($link)
|
58
|
+
respondWith(html)
|
59
|
+
promise
|
60
|
+
|
61
|
+
$link1 = affix('a[href="/one"][up-target=".target"]')
|
62
|
+
$link2 = affix('a[href="/two"][up-target=".target"]')
|
63
|
+
$link3 = affix('a[href="/three"][up-target=".target"]')
|
64
|
+
$container = affix('.container')
|
65
|
+
$target = affix('.target').appendTo($container).text('original text')
|
66
|
+
|
67
|
+
followAndRespond($link1, 'text from one').then =>
|
68
|
+
expect($('.target')).toHaveText('text from one')
|
69
|
+
expect(location.pathname).toEqual('/one')
|
70
|
+
|
71
|
+
followAndRespond($link2, 'text from two').then =>
|
72
|
+
expect($('.target')).toHaveText('text from two')
|
73
|
+
expect(location.pathname).toEqual('/two')
|
74
|
+
|
75
|
+
followAndRespond($link3, 'text from three').then =>
|
76
|
+
expect($('.target')).toHaveText('text from three')
|
77
|
+
expect(location.pathname).toEqual('/three')
|
78
|
+
|
79
|
+
history.back()
|
80
|
+
@setTimer 50, =>
|
81
|
+
respondWith('restored text from two')
|
82
|
+
expect($('.target')).toHaveText('restored text from two')
|
83
|
+
expect(location.pathname).toEqual('/two')
|
84
|
+
|
85
|
+
history.back()
|
86
|
+
@setTimer 50, =>
|
87
|
+
respondWith('restored text from one')
|
88
|
+
expect($('.target')).toHaveText('restored text from one')
|
89
|
+
expect(location.pathname).toEqual('/one')
|
90
|
+
|
91
|
+
history.forward()
|
92
|
+
@setTimer 50, =>
|
93
|
+
# Since the response is cached, we don't have to respond
|
94
|
+
expect($('.target')).toHaveText('restored text from two')
|
95
|
+
expect(location.pathname).toEqual('/two')
|
96
|
+
|
97
|
+
done()
|
98
|
+
|
39
99
|
else
|
40
100
|
|
41
101
|
it 'follows the given link', ->
|
@@ -54,7 +114,7 @@ describe 'up.link', ->
|
|
54
114
|
describe 'up.visit', ->
|
55
115
|
|
56
116
|
it 'should have tests'
|
57
|
-
|
117
|
+
|
58
118
|
describe 'unobtrusive behavior', ->
|
59
119
|
|
60
120
|
describe 'a[up-target]', ->
|
@@ -11,7 +11,7 @@ describe 'up.modal', ->
|
|
11
11
|
it "loads the given link's destination in a dialog window", (done) ->
|
12
12
|
$link = affix('a[href="/path/to"][up-modal=".middle"]').text('link')
|
13
13
|
promise = up.modal.open($link)
|
14
|
-
request =
|
14
|
+
request = @lastRequest()
|
15
15
|
expect(request.url).toMatch /\/path\/to$/
|
16
16
|
request.respondWith
|
17
17
|
status: 200
|
@@ -34,7 +34,7 @@ describe 'up.modal', ->
|
|
34
34
|
it "brings its own scrollbar, padding the body on the right in order to prevent jumping", (done) ->
|
35
35
|
promise = up.modal.open(url: '/foo', target: '.container')
|
36
36
|
|
37
|
-
|
37
|
+
@lastRequest().respondWith
|
38
38
|
status: 200
|
39
39
|
contentType: 'text/html'
|
40
40
|
responseText:
|
@@ -11,11 +11,11 @@ describe 'up.motion', ->
|
|
11
11
|
opacity = -> Number($element.css('opacity'))
|
12
12
|
up.animate($element, 'fade-in', duration: 100, easing: 'linear')
|
13
13
|
|
14
|
-
setTimer 0, ->
|
14
|
+
@setTimer 0, ->
|
15
15
|
expect(opacity()).toBeAround(0.0, 0.25)
|
16
|
-
setTimer 50, ->
|
16
|
+
@setTimer 50, ->
|
17
17
|
expect(opacity()).toBeAround(0.5, 0.25)
|
18
|
-
setTimer 100, ->
|
18
|
+
@setTimer 100, ->
|
19
19
|
expect(opacity()).toBeAround(1.0, 0.25)
|
20
20
|
done()
|
21
21
|
|
@@ -104,19 +104,19 @@ describe 'up.motion', ->
|
|
104
104
|
|
105
105
|
opacity = ($element) -> Number($element.css('opacity'))
|
106
106
|
|
107
|
-
setTimer 0, ->
|
107
|
+
@setTimer 0, ->
|
108
108
|
expect(opacity($newGhost)).toBeAround(0.0, 0.25)
|
109
109
|
expect(opacity($oldGhost)).toBeAround(1.0, 0.25)
|
110
110
|
|
111
|
-
setTimer 40, ->
|
111
|
+
@setTimer 40, ->
|
112
112
|
expect(opacity($newGhost)).toBeAround(0.4, 0.25)
|
113
113
|
expect(opacity($oldGhost)).toBeAround(0.6, 0.25)
|
114
114
|
|
115
|
-
setTimer 70, ->
|
115
|
+
@setTimer 70, ->
|
116
116
|
expect(opacity($newGhost)).toBeAround(0.7, 0.25)
|
117
117
|
expect(opacity($oldGhost)).toBeAround(0.3, 0.25)
|
118
118
|
|
119
|
-
setTimer 125, ->
|
119
|
+
@setTimer 125, ->
|
120
120
|
# Once our two ghosts have rendered their visual effect,
|
121
121
|
# we remove them from the DOM.
|
122
122
|
expect($newGhost).not.toBeInDOM()
|
@@ -39,7 +39,7 @@ describe 'up.navigation', ->
|
|
39
39
|
expect($otherLink).not.toHaveClass('up-current')
|
40
40
|
|
41
41
|
it 'allows to configure a custom "current" class, but always also sets .up-current', ->
|
42
|
-
up.navigation.defaults(
|
42
|
+
up.navigation.defaults(currentClasses: ['highlight'])
|
43
43
|
spyOn(up.browser, 'url').and.returnValue('/foo')
|
44
44
|
$currentLink = up.ready(affix('a[href="/foo"]'))
|
45
45
|
expect($currentLink).toHaveClass('highlight up-current')
|
@@ -50,7 +50,7 @@ describe 'up.navigation', ->
|
|
50
50
|
$link = affix('a[href="/foo"][up-target=".main"]')
|
51
51
|
affix('.main')
|
52
52
|
$link.click()
|
53
|
-
|
53
|
+
@lastRequest().respondWith
|
54
54
|
status: 200
|
55
55
|
contentType: 'text/html'
|
56
56
|
responseHeaders: { 'X-Up-Location': '/foo/' }
|
@@ -61,7 +61,7 @@ describe 'up.navigation', ->
|
|
61
61
|
$link = affix('a[href="/foo/"][up-target=".main"]')
|
62
62
|
affix('.main')
|
63
63
|
$link.click()
|
64
|
-
|
64
|
+
@lastRequest().respondWith
|
65
65
|
status: 200
|
66
66
|
contentType: 'text/html'
|
67
67
|
responseHeaders: { 'X-Up-Location': '/foo' }
|
@@ -80,7 +80,7 @@ describe 'up.navigation', ->
|
|
80
80
|
$link.click()
|
81
81
|
# console.log($link)
|
82
82
|
expect($link).toHaveClass('up-active')
|
83
|
-
|
83
|
+
@lastRequest().respondWith
|
84
84
|
status: 200
|
85
85
|
contentType: 'text/html'
|
86
86
|
responseText: '<div class="main">new-text</div>'
|
@@ -92,7 +92,7 @@ describe 'up.navigation', ->
|
|
92
92
|
affix('.main')
|
93
93
|
Trigger.mousedown($link)
|
94
94
|
expect($link).toHaveClass('up-active')
|
95
|
-
|
95
|
+
@lastRequest().respondWith
|
96
96
|
status: 200
|
97
97
|
contentType: 'text/html'
|
98
98
|
responseText: '<div class="main">new-text</div>'
|
@@ -106,7 +106,7 @@ describe 'up.navigation', ->
|
|
106
106
|
affix('.main')
|
107
107
|
$link.click()
|
108
108
|
expect($area).toHaveClass('up-active')
|
109
|
-
|
109
|
+
@lastRequest().respondWith
|
110
110
|
status: 200
|
111
111
|
contentType: 'text/html'
|
112
112
|
responseText: '<div class="main">new-text</div>'
|
@@ -22,7 +22,7 @@ describe 'up.proxy', ->
|
|
22
22
|
expect(jasmine.Ajax.requests.count()).toEqual(1)
|
23
23
|
expect(responses).toEqual([])
|
24
24
|
|
25
|
-
|
25
|
+
@lastRequest().respondWith
|
26
26
|
status: 200
|
27
27
|
contentType: 'text/html'
|
28
28
|
responseText: 'foo'
|
@@ -39,7 +39,7 @@ describe 'up.proxy', ->
|
|
39
39
|
# See that we have triggered a second request
|
40
40
|
expect(jasmine.Ajax.requests.count()).toEqual(2)
|
41
41
|
|
42
|
-
|
42
|
+
@lastRequest().respondWith
|
43
43
|
status: 200
|
44
44
|
contentType: 'text/html'
|
45
45
|
responseText: 'bar'
|