upjs-rails 0.9.1 → 0.10.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/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'
|