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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +142 -0
  3. data/README.md +4 -1
  4. data/design/ghost-debugging.txt +118 -0
  5. data/design/homepage.txt +236 -0
  6. data/dist/up-bootstrap.js +7 -3
  7. data/dist/up-bootstrap.min.js +1 -1
  8. data/dist/up.js +1611 -1222
  9. data/dist/up.min.js +2 -2
  10. data/lib/assets/javascripts/up/bus.js.coffee +1 -1
  11. data/lib/assets/javascripts/up/flow.js.coffee +21 -20
  12. data/lib/assets/javascripts/up/form.js.coffee +11 -12
  13. data/lib/assets/javascripts/up/history.js.coffee +137 -20
  14. data/lib/assets/javascripts/up/layout.js.coffee +134 -21
  15. data/lib/assets/javascripts/up/link.js.coffee +40 -17
  16. data/lib/assets/javascripts/up/modal.js.coffee +2 -2
  17. data/lib/assets/javascripts/up/motion.js.coffee +3 -1
  18. data/lib/assets/javascripts/up/navigation.js.coffee +5 -5
  19. data/lib/assets/javascripts/up/popup.js.coffee +2 -2
  20. data/lib/assets/javascripts/up/proxy.js.coffee +43 -82
  21. data/lib/assets/javascripts/up/tooltip.js.coffee +1 -1
  22. data/lib/assets/javascripts/up/util.js.coffee +145 -14
  23. data/lib/assets/javascripts/up-bootstrap/layout-ext.js.coffee +2 -2
  24. data/lib/assets/javascripts/up-bootstrap/navigation-ext.js.coffee +3 -1
  25. data/lib/assets/javascripts/up.js.coffee +2 -2
  26. data/lib/upjs/rails/version.rb +1 -1
  27. data/spec_app/Gemfile.lock +1 -1
  28. data/spec_app/config/routes.rb +1 -2
  29. data/spec_app/spec/javascripts/helpers/knife.js.coffee +1 -1
  30. data/spec_app/spec/javascripts/helpers/last_request.js.coffee +4 -0
  31. data/spec_app/spec/javascripts/helpers/set_timer.js.coffee +3 -3
  32. data/spec_app/spec/javascripts/helpers/to_end_with.js.coffee +5 -0
  33. data/spec_app/spec/javascripts/up/flow_spec.js.coffee +8 -6
  34. data/spec_app/spec/javascripts/up/form_spec.js.coffee +1 -1
  35. data/spec_app/spec/javascripts/up/history_spec.js.coffee +80 -1
  36. data/spec_app/spec/javascripts/up/link_spec.js.coffee +64 -4
  37. data/spec_app/spec/javascripts/up/modal_spec.js.coffee +2 -2
  38. data/spec_app/spec/javascripts/up/motion_spec.js.coffee +7 -7
  39. data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +6 -6
  40. data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +2 -2
  41. data/spec_app/spec/javascripts/up/util_spec.js.coffee +22 -4
  42. metadata +7 -2
@@ -11,26 +11,44 @@ up.layout = (->
11
11
  u = up.util
12
12
 
13
13
  ###*
14
-
14
+ Configures the application layout.
15
15
 
16
16
  @method up.layout.defaults
17
- @param {String} [options.viewport]
18
- @param {String} [options.fixedTop]
19
- @param {String} [options.fixedBottom]
17
+ @param {Array<String>} [options.viewports]
18
+ An array of CSS selectors that find viewports
19
+ (containers that scroll their contents).
20
+ @param {Array<String>} [options.fixedTop]
21
+ An array of CSS selectors that find elements fixed to the
22
+ top edge of the screen (using `position: fixed`).
23
+ @param {Array<String>} [options.fixedBottom]
24
+ An array of CSS selectors that find elements fixed to the
25
+ bottom edge of the screen (using `position: fixed`).
20
26
  @param {Number} [options.duration]
27
+ The duration of the scrolling animation in milliseconds.
28
+ Setting this to `0` will disable scrolling animations.
21
29
  @param {String} [options.easing]
30
+ The timing function that controls the animation's acceleration.
31
+ See [W3C documentation](http://www.w3.org/TR/css3-transitions/#transition-timing-function)
32
+ for a list of pre-defined timing functions.
22
33
  @param {Number} [options.snap]
34
+ When [revealing](#up.reveal) elements, Up.js will scroll an viewport
35
+ to the top when the revealed element is closer to the top than `options.snap`.
23
36
  ###
24
37
  config = u.config
25
38
  duration: 0
26
- viewport: 'body, .up-modal, [up-viewport]'
27
- fixedTop: '[up-fixed~=top]'
28
- fixedBottom: '[up-fixed~=bottom]'
39
+ viewports: ['body', '.up-modal', '[up-viewport]']
40
+ fixedTop: ['[up-fixed~=top]']
41
+ fixedBottom: ['[up-fixed~=bottom]']
29
42
  snap: 50
30
43
  easing: 'swing'
31
44
 
45
+ lastScrollTops = u.cache
46
+ size: 30,
47
+ key: up.history.normalizeUrl
48
+
32
49
  reset = ->
33
50
  config.reset()
51
+ lastScrollTops.clear()
34
52
 
35
53
  SCROLL_PROMISE_KEY = 'up-scroll-promise'
36
54
 
@@ -73,35 +91,35 @@ up.layout = (->
73
91
  A promise that will be resolved when the scrolling ends.
74
92
  ###
75
93
  scroll = (viewport, scrollTop, options) ->
76
- $view = $(viewport)
94
+ $viewport = $(viewport)
77
95
  options = u.options(options)
78
96
  duration = u.option(options.duration, config.duration)
79
97
  easing = u.option(options.easing, config.easing)
80
98
 
81
- finishScrolling($view)
99
+ finishScrolling($viewport)
82
100
 
83
101
  if duration > 0
84
102
  deferred = $.Deferred()
85
103
 
86
- $view.data(SCROLL_PROMISE_KEY, deferred)
104
+ $viewport.data(SCROLL_PROMISE_KEY, deferred)
87
105
  deferred.then ->
88
- $view.removeData(SCROLL_PROMISE_KEY)
106
+ $viewport.removeData(SCROLL_PROMISE_KEY)
89
107
  # Since we're scrolling using #animate, #finish can be
90
108
  # used to jump to the last frame:
91
109
  # https://api.jquery.com/finish/
92
- $view.finish()
110
+ $viewport.finish()
93
111
 
94
112
  targetProps =
95
113
  scrollTop: scrollTop
96
114
 
97
- $view.animate targetProps,
115
+ $viewport.animate targetProps,
98
116
  duration: duration,
99
117
  easing: easing,
100
118
  complete: -> deferred.resolve()
101
119
 
102
120
  deferred
103
121
  else
104
- $view.scrollTop(scrollTop)
122
+ $viewport.scrollTop(scrollTop)
105
123
  u.resolvedDeferred()
106
124
 
107
125
  ###*
@@ -122,10 +140,10 @@ up.layout = (->
122
140
  u.error("Fixed element %o must have a CSS attribute %o", $obstructor, cssAttr)
123
141
  parseInt(anchorPosition) + $obstructor.height()
124
142
 
125
- fixedTopBottoms = for obstructor in $(config.fixedTop)
143
+ fixedTopBottoms = for obstructor in $(config.fixedTop.join(', '))
126
144
  measurePosition(obstructor, 'top')
127
145
 
128
- fixedBottomTops = for obstructor in $(config.fixedBottom)
146
+ fixedBottomTops = for obstructor in $(config.fixedBottom.join(', '))
129
147
  measurePosition(obstructor, 'bottom')
130
148
 
131
149
  top: Math.max(0, fixedTopBottoms...)
@@ -171,7 +189,7 @@ up.layout = (->
171
189
  reveal = (elementOrSelector, options) ->
172
190
  options = u.options(options)
173
191
  $element = $(elementOrSelector)
174
- $viewport = findViewport($element, options.viewport)
192
+ $viewport = viewportOf($element, options.viewport)
175
193
 
176
194
  snap = u.option(options.snap, config.snap)
177
195
 
@@ -220,23 +238,112 @@ up.layout = (->
220
238
  else
221
239
  u.resolvedDeferred()
222
240
 
241
+ viewportSelector = ->
242
+ config.viewports.join(', ')
243
+
223
244
  ###*
224
- @private
225
- @method up.viewport.findViewport
245
+ Returns the viewport for the given element.
246
+
247
+ Throws an error if no viewport could be found.
248
+
249
+ @protected
250
+ @method up.layout.viewportOf
251
+ @param {String|Element|jQuery} selectorOrElement
226
252
  ###
227
- findViewport = ($element, viewportSelectorOrElement) ->
253
+ viewportOf = (selectorOrElement, viewportSelectorOrElement) ->
254
+ $element = $(selectorOrElement)
228
255
  $viewport = undefined
229
256
  # If someone has handed as a jQuery element, that's the
230
257
  # view period.
231
258
  if u.isJQuery(viewportSelectorOrElement)
232
259
  $viewport = viewportSelectorOrElement
233
260
  else
234
- vieportSelector = u.presence(viewportSelectorOrElement) || config.viewport
261
+ vieportSelector = u.presence(viewportSelectorOrElement) || viewportSelector()
235
262
  $viewport = $element.closest(vieportSelector)
236
263
 
237
264
  $viewport.length or u.error("Could not find viewport for %o", $element)
238
265
  $viewport
239
266
 
267
+ ###*
268
+ Returns a jQuery collection of all the viewports contained within the
269
+ given selector or element.
270
+
271
+ @protected
272
+ @method up.layout.viewportsIn
273
+ @param {String|Element|jQuery} selectorOrElement
274
+ @return jQuery
275
+ ###
276
+ viewportsIn = (selectorOrElement) ->
277
+ $element = $(selectorOrElement)
278
+ u.findWithSelf($element, viewportSelector())
279
+
280
+ ###*
281
+ Returns a jQuery collection of all the viewports on the screen.
282
+
283
+ @protected
284
+ @method up.layout.viewports
285
+ ###
286
+ viewports = ->
287
+ $(viewportSelector())
288
+
289
+ ###*
290
+ Returns a hash with scroll positions.
291
+
292
+ Each key in the hash is a viewport selector. The corresponding
293
+ value is the viewport's top scroll position:
294
+
295
+ up.layout.scrollTops()
296
+ => { '.main': 0, '.sidebar': 73 }
297
+
298
+ @protected
299
+ @method up.layout.scrollTops
300
+ @return Object<String, Number>
301
+ ###
302
+ scrollTops = ->
303
+ topsBySelector = {}
304
+ for viewport in config.viewports
305
+ $viewport = $(viewport)
306
+ if $viewport.length
307
+ topsBySelector[viewport] = $viewport.scrollTop()
308
+ topsBySelector
309
+
310
+ ###*
311
+ Saves the top scroll positions of all the
312
+ viewports configured in `up.layout.defaults('viewports').
313
+ The saved scroll positions can be restored by calling
314
+ [`up.layout.restoreScroll()`](#up.layout.restoreScroll).
315
+
316
+ @method up.layout.saveScroll
317
+ @param {String} [options.url]
318
+ @param {Object<String, Number>} [options.tops]
319
+ @protected
320
+ ###
321
+ saveScroll = (options = {}) ->
322
+ url = u.option(options.url, up.history.url())
323
+ tops = u.option(options.tops, scrollTops())
324
+ lastScrollTops.set(url, tops)
325
+
326
+ ###*
327
+ Restores the top scroll positions of all the
328
+ viewports configured in `up.layout.defaults('viewports')`.
329
+
330
+ @method up.layout.restoreScroll
331
+ @param {String} [options.within]
332
+ @protected
333
+ ###
334
+ restoreScroll = (options = {}) ->
335
+
336
+ $viewports = if options.within
337
+ viewportsIn(options.within)
338
+ else
339
+ viewports()
340
+
341
+ tops = lastScrollTops.get(up.history.url())
342
+
343
+ for selector, scrollTop of tops
344
+ $matchingViewport = $viewports.filter(selector)
345
+ up.scroll($matchingViewport, scrollTop, duration: 0)
346
+
240
347
  ###*
241
348
  Marks this element as a scrolling container. Apply this ttribute if your app uses
242
349
  a custom panel layout with fixed positioning instead of scrolling `<body>`.
@@ -323,6 +430,12 @@ up.layout = (->
323
430
  scroll: scroll
324
431
  finishScrolling: finishScrolling
325
432
  defaults: config.update
433
+ viewportOf: viewportOf
434
+ viewportsIn: viewportsIn
435
+ viewports: viewports
436
+ scrollTops: scrollTops
437
+ saveScroll: saveScroll
438
+ restoreScroll: restoreScroll
326
439
 
327
440
  )()
328
441
 
@@ -132,9 +132,8 @@ up.link = (->
132
132
  or to `body` if such an attribute does not exist.
133
133
  @param {Function|String} [options.transition]
134
134
  A transition function or name.
135
- @param {Element|jQuery|String} [options.scroll]
136
- An element or selector that will be scrolled to the top in
137
- case the replaced element is not visible in the viewport.
135
+ @param {Element|jQuery|String} [options.reveal]
136
+ Whether to reveal the followed element within its viewport.
138
137
  @param {Number} [options.duration]
139
138
  The duration of the transition. See [`up.morph`](/up.motion#up.morph).
140
139
  @param {Number} [options.delay]
@@ -148,10 +147,11 @@ up.link = (->
148
147
  options = u.options(options)
149
148
  url = u.option($link.attr('up-href'), $link.attr('href'))
150
149
  selector = u.option(options.target, $link.attr('up-target'), 'body')
151
- options.transition = u.option(options.transition, $link.attr('up-transition'), $link.attr('up-animation'))
152
- options.history = u.option(options.history, $link.attr('up-history'))
153
- options.scroll = u.option(options.scroll, $link.attr('up-scroll'), 'body')
154
- options.cache = u.option(options.cache, $link.attr('up-cache'))
150
+ options.transition = u.option(options.transition, u.castedAttr($link, 'up-transition'), u.castedAttr($link, 'up-animation'))
151
+ options.history = u.option(options.history, u.castedAttr($link, 'up-history'))
152
+ options.reveal = u.option(options.reveal, u.castedAttr($link, 'up-reveal'))
153
+ options.cache = u.option(options.cache, u.castedAttr($link, 'up-cache'))
154
+ options.restoreScroll = u.option(options.restoreScroll, u.castedAttr($link, 'up-restore-scroll'))
155
155
  options.method = followMethod($link, options)
156
156
  options = u.merge(options, up.motion.animateOptions(options, $link))
157
157
 
@@ -219,6 +219,9 @@ up.link = (->
219
219
  @param [up-href]
220
220
  The destination URL to follow.
221
221
  If omitted, the the link's `href` attribute will be used.
222
+ @param [up-restore-scroll='false']
223
+ Whether to restore the scroll position of all viewports
224
+ within the target selector.
222
225
  ###
223
226
  up.on 'click', 'a[up-target], [up-href][up-target]', (event, $link) ->
224
227
  if shouldProcessLinkEvent(event, $link)
@@ -265,7 +268,21 @@ up.link = (->
265
268
 
266
269
  shouldProcessLinkEvent = (event, $link) ->
267
270
  u.isUnmodifiedMouseEvent(event) && !childClicked(event, $link)
268
-
271
+
272
+ ###*
273
+ Makes sure that the given link is handled by Up.js.
274
+
275
+ This is done by giving the link an `up-follow` attribute
276
+ if it doesn't already have it an `up-target` or `up-follow` attribute.
277
+
278
+ @method up.link.makeFollowable
279
+ @protected
280
+ ###
281
+ makeFollowable = (link) ->
282
+ $link = $(link)
283
+ if u.isMissing($link.attr('up-target')) && u.isMissing($link.attr('up-follow'))
284
+ $link.attr('up-follow', '')
285
+
269
286
  ###*
270
287
  If applied on a link, Follows this link via AJAX and replaces the
271
288
  current `<body>` element with the response's `<body>` element.
@@ -292,6 +309,9 @@ up.link = (->
292
309
  @param [up-href]
293
310
  The destination URL to follow.
294
311
  If omitted, the the link's `href` attribute will be used.
312
+ @param [up-restore-scroll='false']
313
+ Whether to restore the scroll position of all viewports
314
+ within the response.
295
315
  ###
296
316
  up.on 'click', 'a[up-follow], [up-href][up-follow]', (event, $link) ->
297
317
  if shouldProcessLinkEvent(event, $link)
@@ -321,9 +341,9 @@ up.link = (->
321
341
  @ujs
322
342
  @method [up-expand]
323
343
  ###
324
- up.compiler '[up-expand]', ($fragment) ->
325
- link = $fragment.find('a, [up-href]').get(0)
326
- link or u.error('No link to expand within %o', $fragment)
344
+ up.compiler '[up-expand]', ($area) ->
345
+ link = $area.find('a, [up-href]').get(0)
346
+ link or u.error('No link to expand within %o', $area)
327
347
  upAttributePattern = /^up-/
328
348
  newAttrs = {}
329
349
  newAttrs['up-href'] = $(link).attr('href')
@@ -331,10 +351,10 @@ up.link = (->
331
351
  name = attribute.name
332
352
  if name.match(upAttributePattern)
333
353
  newAttrs[name] = attribute.value
334
- # Make sure that the containing area will be considered a link
335
- u.isGiven(newAttrs['up-target']) or newAttrs['up-follow'] = ''
336
- u.setMissingAttrs($fragment, newAttrs)
337
- $fragment.removeAttr('up-expand')
354
+ u.setMissingAttrs($area, newAttrs)
355
+ $area.removeAttr('up-expand')
356
+ makeFollowable($area)
357
+
338
358
 
339
359
  ###*
340
360
  Marks up the current link to be followed *as fast as possible*.
@@ -356,12 +376,14 @@ up.link = (->
356
376
  @ujs
357
377
  ###
358
378
  up.compiler '[up-dash]', ($element) ->
359
- target = $element.attr('up-dash')
379
+ target = u.castedAttr($element, 'up-dash')
360
380
  newAttrs = {
361
381
  'up-preload': 'true',
362
382
  'up-instant': 'true'
363
383
  }
364
- if u.isBlank(target) || u.castsToTrue(target)
384
+ if target is true
385
+ # If it's literally `true` then we don't have a target selector.
386
+ # Just follow the link by replacing `<body>`.
365
387
  newAttrs['up-follow'] = ''
366
388
  else
367
389
  newAttrs['up-target'] = target
@@ -371,6 +393,7 @@ up.link = (->
371
393
  knife: eval(Knife?.point)
372
394
  visit: visit
373
395
  follow: follow
396
+ makeFollowable: makeFollowable
374
397
  childClicked: childClicked
375
398
  followMethod: followMethod
376
399
 
@@ -207,8 +207,8 @@ up.modal = (->
207
207
  maxWidth = u.option(options.maxWidth, $link.attr('up-max-width'), config.maxWidth)
208
208
  height = u.option(options.height, $link.attr('up-height'), config.height)
209
209
  animation = u.option(options.animation, $link.attr('up-animation'), config.openAnimation)
210
- sticky = u.option(options.sticky, $link.is('[up-sticky]'))
211
- history = if up.browser.canPushState() then u.option(options.history, $link.attr('up-history'), true) else false
210
+ sticky = u.option(options.sticky, u.castedAttr($link, 'up-sticky'))
211
+ history = if up.browser.canPushState() then u.option(options.history, u.castedAttr($link, 'up-history'), true) else false
212
212
  animateOptions = up.motion.animateOptions(options, $link)
213
213
 
214
214
  close()
@@ -123,6 +123,8 @@ up.motion = (->
123
123
  $element = $(elementOrSelector)
124
124
  finish($element)
125
125
  options = animateOptions(options)
126
+ if animation == 'none' || animation == false
127
+ none()
126
128
  if u.isFunction(animation)
127
129
  assertIsDeferred(animation($element, options), animation)
128
130
  else if u.isString(animation)
@@ -260,7 +262,7 @@ up.motion = (->
260
262
  $new = $(target)
261
263
  finish($old)
262
264
  finish($new)
263
- if transitionOrName == 'none'
265
+ if transitionOrName == 'none' or transitionOrName == false
264
266
  # don't create ghosts if we aren't really transitioning
265
267
  none()
266
268
  else if transition = u.presence(transitionOrName, u.isFunction) || transitions[transitionOrName]
@@ -23,16 +23,16 @@ up.navigation = (->
23
23
  The class to set on [links that point the current location](#up-current).
24
24
  ###
25
25
  config = u.config
26
- currentClass: 'up-current'
26
+ currentClasses: ['up-current']
27
27
 
28
28
  reset = ->
29
29
  config.reset()
30
30
 
31
31
  currentClass = ->
32
- klass = config.currentClass
33
- unless u.contains(klass, 'up-current')
34
- klass += ' up-current'
35
- klass
32
+ classes = config.currentClasses
33
+ classes = classes.concat(['up-current'])
34
+ classes = u.uniq(classes)
35
+ classes.join(' ')
36
36
 
37
37
  CLASS_ACTIVE = 'up-active'
38
38
  SELECTORS_SECTION = ['a', '[up-href]', '[up-alias]']
@@ -141,8 +141,8 @@ up.popup = (->
141
141
  selector = u.option(options.target, $link.attr('up-popup'), 'body')
142
142
  position = u.option(options.position, $link.attr('up-position'), config.position)
143
143
  animation = u.option(options.animation, $link.attr('up-animation'), config.openAnimation)
144
- sticky = u.option(options.sticky, $link.is('[up-sticky]'))
145
- history = if up.browser.canPushState() then u.option(options.history, $link.attr('up-history'), false) else false
144
+ sticky = u.option(options.sticky, u.castedAttr($link, 'up-sticky'))
145
+ history = if up.browser.canPushState() then u.option(options.history, u.castedAttr($link, 'up-history'), false) else false
146
146
  animateOptions = up.motion.animateOptions(options, $link)
147
147
 
148
148
  close()
@@ -53,7 +53,6 @@ up.proxy = (->
53
53
 
54
54
  u = up.util
55
55
 
56
- cache = undefined
57
56
  $waitingLink = undefined
58
57
  preloadDelayTimer = undefined
59
58
  busyDelayTimer = undefined
@@ -81,6 +80,44 @@ up.proxy = (->
81
80
  cacheSize: 70
82
81
  cacheExpiry: 1000 * 60 * 5
83
82
 
83
+ cacheKey = (request) ->
84
+ normalizeRequest(request)
85
+ [ request.url,
86
+ request.method,
87
+ request.data,
88
+ request.selector
89
+ ].join('|')
90
+
91
+ cache = u.cache
92
+ size: -> config.cacheSize
93
+ expiry: -> config.cacheExpiry
94
+ key: cacheKey
95
+ log: 'up.proxy'
96
+
97
+ ###*
98
+ @protected
99
+ @method up.proxy.get
100
+ ###
101
+ get = cache.get
102
+
103
+ ###*
104
+ @protected
105
+ @method up.proxy.set
106
+ ###
107
+ set = cache.set
108
+
109
+ ###*
110
+ @protected
111
+ @method up.proxy.remove
112
+ ###
113
+ remove = cache.remove
114
+
115
+ ###*
116
+ @protected
117
+ @method up.proxy.clear
118
+ ###
119
+ clear = cache.clear
120
+
84
121
  cancelPreloadDelay = ->
85
122
  clearTimeout(preloadDelayTimer)
86
123
  preloadDelayTimer = null
@@ -90,40 +127,18 @@ up.proxy = (->
90
127
  busyDelayTimer = null
91
128
 
92
129
  reset = ->
93
- cache = {}
94
130
  $waitingLink = null
95
131
  cancelPreloadDelay()
96
132
  cancelBusyDelay()
97
133
  pendingCount = 0
98
134
  config.reset()
99
135
  busyEventEmitted = false
136
+ cache.clear()
100
137
 
101
138
  reset()
102
139
 
103
- cacheKey = (request) ->
104
- normalizeRequest(request)
105
- [ request.url,
106
- request.method,
107
- request.data,
108
- request.selector
109
- ].join('|')
110
-
111
- trim = ->
112
- keys = u.keys(cache)
113
- if keys.length > config.cacheSize
114
- oldestKey = null
115
- oldestTimestamp = null
116
- u.each keys, (key) ->
117
- promise = cache[key] # we don't need to call cacheKey here
118
- timestamp = promise.timestamp
119
- if !oldestTimestamp || oldestTimestamp > timestamp
120
- oldestKey = key
121
- oldestTimestamp = timestamp
122
- delete cache[oldestKey] if oldestKey
123
-
124
- timestamp = ->
125
- (new Date()).valueOf()
126
-
140
+ alias = cache.alias
141
+
127
142
  normalizeRequest = (request) ->
128
143
  unless request._normalized
129
144
  request.method = u.normalizeMethod(request.method)
@@ -131,11 +146,6 @@ up.proxy = (->
131
146
  request.selector ||= 'body'
132
147
  request._normalized = true
133
148
  request
134
-
135
- alias = (oldRequest, newRequest) ->
136
- u.debug("Aliasing %o to %o", oldRequest, newRequest)
137
- if promise = get(oldRequest)
138
- set(newRequest, promise)
139
149
 
140
150
  ###*
141
151
  Makes a request to the given URL and caches the response.
@@ -160,8 +170,8 @@ up.proxy = (->
160
170
  If set to `false` a network connection will always be attempted.
161
171
  ###
162
172
  ajax = (options) ->
163
- forceCache = u.castsToTrue(options.cache)
164
- ignoreCache = u.castsToFalse(options.cache)
173
+ forceCache = (options.cache == true)
174
+ ignoreCache = (options.cache == false)
165
175
 
166
176
  request = u.only(options, 'url', 'method', 'data', 'selector', '_normalized')
167
177
 
@@ -254,55 +264,6 @@ up.proxy = (->
254
264
  normalizeRequest(request)
255
265
  u.contains(SAFE_HTTP_METHODS, request.method)
256
266
 
257
- isFresh = (promise) ->
258
- timeSinceTouch = timestamp() - promise.timestamp
259
- timeSinceTouch < config.cacheExpiry
260
-
261
- ###*
262
- @protected
263
- @method up.proxy.get
264
- ###
265
- get = (request) ->
266
- key = cacheKey(request)
267
- if promise = cache[key]
268
- if !isFresh(promise)
269
- u.debug("Discarding stale cache entry for %o (%o)", request.url, request)
270
- remove(request)
271
- undefined
272
- else
273
- u.debug("Cache hit for %o (%o)", request.url, request)
274
- # $('body').css('background-color': 'green')
275
- promise
276
- else
277
- u.debug("Cache miss for %o (%o)", request.url, request)
278
- undefined
279
-
280
- ###*
281
- @protected
282
- @method up.proxy.set
283
- ###
284
- set = (request, promise) ->
285
- trim()
286
- key = cacheKey(request)
287
- promise.timestamp = timestamp()
288
- cache[key] = promise
289
- promise
290
-
291
- ###*
292
- @protected
293
- @method up.proxy.remove
294
- ###
295
- remove = (request) ->
296
- key = cacheKey(request)
297
- delete cache[key]
298
-
299
- ###*
300
- @protected
301
- @method up.proxy.clear
302
- ###
303
- clear = ->
304
- cache = {}
305
-
306
267
  checkPreload = ($link) ->
307
268
  delay = parseInt(u.presentAttr($link, 'up-delay')) || config.preloadDelay
308
269
  unless $link.is($waitingLink)
@@ -60,7 +60,7 @@ up.tooltip = (->
60
60
  $link = $(linkOrSelector)
61
61
  html = u.option(options.html, $link.attr('up-tooltip'), $link.attr('title'))
62
62
  position = u.option(options.position, $link.attr('up-position'), 'top')
63
- animation = u.option(options.animation, $link.attr('up-animation'), 'fade-in')
63
+ animation = u.option(options.animation, u.castedAttr($link, 'up-animation'), 'fade-in')
64
64
  animateOptions = up.motion.animateOptions(options, $link)
65
65
  close()
66
66
  $tooltip = createElement(html)