unpoly-rails 0.26.1 → 0.26.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of unpoly-rails might be problematic. Click here for more details.

@@ -57,23 +57,31 @@ up.tooltip = (($) ->
57
57
  config.reset()
58
58
 
59
59
  setPosition = ($link, $tooltip, position) ->
60
- linkBox = u.measure($link)
60
+ css = {}
61
61
  tooltipBox = u.measure($tooltip)
62
- css = switch position
62
+
63
+ if u.isFixed($link)
64
+ linkBox = $link.get(0).getBoundingClientRect()
65
+ css['position'] = 'fixed'
66
+ else
67
+ linkBox = u.measure($link)
68
+
69
+ switch position
63
70
  when "top"
64
- left: linkBox.left + 0.5 * (linkBox.width - tooltipBox.width)
65
- top: linkBox.top - tooltipBox.height
71
+ css['top'] = linkBox.top - tooltipBox.height
72
+ css['left'] = linkBox.left + 0.5 * (linkBox.width - tooltipBox.width)
66
73
  when "left"
67
- left: linkBox.left - tooltipBox.width
68
- top: linkBox.top + 0.5 * (linkBox.height - tooltipBox.height)
74
+ css['top'] = linkBox.top + 0.5 * (linkBox.height - tooltipBox.height)
75
+ css['left'] = linkBox.left - tooltipBox.width
69
76
  when "right"
70
- left: linkBox.left + linkBox.width
71
- top: linkBox.top + 0.5 * (linkBox.height - tooltipBox.height)
77
+ css['top'] = linkBox.top + 0.5 * (linkBox.height - tooltipBox.height)
78
+ css['left'] = linkBox.left + linkBox.width
72
79
  when "bottom"
73
- left: linkBox.left + 0.5 * (linkBox.width - tooltipBox.width)
74
- top: linkBox.top + linkBox.height
80
+ css['top'] = linkBox.top + linkBox.height
81
+ css['left'] = linkBox.left + 0.5 * (linkBox.width - tooltipBox.width)
75
82
  else
76
83
  u.error("Unknown position option '%s'", position)
84
+
77
85
  $tooltip.attr('up-position', position)
78
86
  $tooltip.css(css)
79
87
 
@@ -886,7 +886,8 @@ up.util = (($) ->
886
886
  A function that restores the original CSS when called.
887
887
  @internal
888
888
  ###
889
- temporaryCss = ($element, css, block) ->
889
+ temporaryCss = (elementOrSelector, css, block) ->
890
+ $element = $(elementOrSelector)
890
891
  oldCss = $element.css(Object.keys(css))
891
892
  $element.css(css)
892
893
  memo = -> $element.css(oldCss)
@@ -1048,7 +1049,7 @@ up.util = (($) ->
1048
1049
  @internal
1049
1050
  ###
1050
1051
  measure = ($element, opts) ->
1051
- opts = options(opts, relative: false, inner: false, full: false)
1052
+ opts = options(opts, relative: false, inner: false)
1052
1053
 
1053
1054
  if opts.relative
1054
1055
  if opts.relative == true
@@ -1078,11 +1079,7 @@ up.util = (($) ->
1078
1079
  else
1079
1080
  box.width = $element.outerWidth()
1080
1081
  box.height = $element.outerHeight()
1081
-
1082
- if opts.full
1083
- $viewport = up.layout.viewportOf($element)
1084
- box.right = $viewport.width() - (box.left + box.width)
1085
- box.bottom = $viewport.height() - (box.top + box.height)
1082
+
1086
1083
  box
1087
1084
 
1088
1085
  ###*
@@ -4,6 +4,6 @@ module Unpoly
4
4
  # The current version of the unpoly-rails gem.
5
5
  # This version number is also used for releases of the Unpoly
6
6
  # frontend code.
7
- VERSION = '0.26.1'
7
+ VERSION = '0.26.2'
8
8
  end
9
9
  end
@@ -5,6 +5,22 @@ body
5
5
  background: image-url('grid.png') repeat
6
6
  font-family: arial, sans-serif
7
7
 
8
+ .page
9
+ min-height: 3000px
10
+
11
+ .spacer
12
+ background-color: transparentize(green, 0.5)
13
+ height: 150px
14
+ content: 'Free space'
15
+
16
+ .fixed-top-bar
17
+ position: fixed
18
+ top: 0
19
+ left: 0
20
+ right: 0
21
+ background-color: transparentize(blue, 0.5)
22
+ padding: 50px
23
+
8
24
  .example
9
25
  margin: 50px
10
26
 
@@ -0,0 +1,25 @@
1
+ <div class="spacer">
2
+ </div>
3
+
4
+ <div class="example">
5
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-left">Top-left popup</a>
6
+ </div>
7
+
8
+ <div class="example">
9
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-right">Top-right popup</a>
10
+ </div>
11
+
12
+ <div class="example">
13
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
14
+ </div>
15
+
16
+ <div class="example">
17
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
18
+ </div>
19
+
20
+ <div class="fixed-top-bar">
21
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-left">Top-left popup</a>
22
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="top-right">Top-right popup</a>
23
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-right">Bottom-right popup</a>
24
+ <a class="button" href="/css_test/popup_contents" up-popup=".contents" up-position="bottom-left">Bottom-left popup</a>
25
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="contents">
2
+ Line 1: Foo bar baz bam qux foo bar baz bam qux<br>
3
+ Line 2: Foo bar baz bam qux foo bar baz bam qux<br>
4
+ Line 3: Foo bar baz bam qux foo bar baz bam qux
5
+ </div>
@@ -13,3 +13,10 @@
13
13
  <div class="example">
14
14
  <a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
15
15
  </div>
16
+
17
+ <div class="fixed-top-bar">
18
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="top">Top tooltip</a>
19
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="bottom">Bottom tooltip</a>
20
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="left">Left tooltip</a>
21
+ <a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
22
+ </div>
@@ -14,6 +14,10 @@
14
14
  <li><%= link_to 'Tooltip', '/css_test/tooltip' %></li>
15
15
  </ul>
16
16
 
17
+ <ul>
18
+ <li><%= link_to 'Popup', '/css_test/popup' %></li>
19
+ </ul>
20
+
17
21
  <ul>
18
22
  <li><%= link_to 'Form (basic)', '/form_test/basic/new' %></li>
19
23
  </ul>
@@ -143,7 +143,7 @@ describe 'up.modal', ->
143
143
  @respondWith('<div class="container">response1</div>', request: request1)
144
144
  u.setTimer 10, =>
145
145
  @respondWith('<div class="container">response2</div>', request: request2)
146
- u.setTimer 50, =>
146
+ u.setTimer 110, =>
147
147
  expect($('.up-modal').length).toBe(1)
148
148
  expect($('.up-modal-dialog').length).toBe(1)
149
149
  expect($('.container')).toHaveText('response2')
@@ -323,37 +323,44 @@ describe 'up.modal', ->
323
323
  describe 'unobtrusive behavior', ->
324
324
 
325
325
  describe 'a[up-modal]', ->
326
-
326
+
327
327
  beforeEach ->
328
- @$link = affix('a[href="/path"][up-modal=".target"]')
329
- @followSpy = up.modal.knife.mock('follow').and.returnValue(u.resolvedPromise())
330
- @defaultSpy = up.link.knife.mock('allowDefault').and.callFake((event) -> event.preventDefault())
328
+ @stubFollow = =>
329
+ @$link = affix('a[href="/path"][up-modal=".target"]')
330
+ @followSpy = up.modal.knife.mock('follow').and.returnValue(u.resolvedPromise())
331
+ @defaultSpy = up.link.knife.mock('allowDefault').and.callFake((event) -> event.preventDefault())
331
332
 
332
333
  it 'opens the clicked link in a modal', ->
334
+ @stubFollow()
333
335
  Trigger.click(@$link)
334
336
  expect(@followSpy).toHaveBeenCalledWith(@$link)
335
337
 
336
338
  # IE does not call Javascript and always performs the default action on right clicks
337
339
  unless navigator.userAgent.match(/Trident/)
338
340
  it 'does nothing if the right mouse button is used', ->
341
+ @stubFollow()
339
342
  Trigger.click(@$link, button: 2)
340
343
  expect(@followSpy).not.toHaveBeenCalled()
341
344
 
342
345
  it 'does nothing if shift is pressed during the click', ->
346
+ @stubFollow()
343
347
  Trigger.click(@$link, shiftKey: true)
344
348
  expect(@followSpy).not.toHaveBeenCalled()
345
349
 
346
350
  it 'does nothing if ctrl is pressed during the click', ->
351
+ @stubFollow()
347
352
  Trigger.click(@$link, ctrlKey: true)
348
353
  expect(@followSpy).not.toHaveBeenCalled()
349
354
 
350
355
  it 'does nothing if meta is pressed during the click', ->
356
+ @stubFollow()
351
357
  Trigger.click(@$link, metaKey: true)
352
358
  expect(@followSpy).not.toHaveBeenCalled()
353
359
 
354
360
  describe 'with [up-instant] modifier', ->
355
361
 
356
362
  beforeEach ->
363
+ @stubFollow()
357
364
  @$link.attr('up-instant', '')
358
365
 
359
366
  it 'opens the modal on mousedown (instead of on click)', ->
@@ -386,6 +393,13 @@ describe 'up.modal', ->
386
393
  Trigger.mousedown(@$link, metaKey: true)
387
394
  expect(@followSpy).not.toHaveBeenCalled()
388
395
 
396
+ describe 'with [up-method] modifier', ->
397
+
398
+ it 'honours the given method', ->
399
+ $link = affix('a[href="/path"][up-modal=".target"][up-method="post"]')
400
+ Trigger.click($link)
401
+ expect(@lastRequest().method).toEqual 'POST'
402
+
389
403
 
390
404
  describe '[up-close]', ->
391
405
 
@@ -10,11 +10,16 @@ describe 'up.popup', ->
10
10
  jasmine.addMatchers
11
11
  toSitBelow: (util, customEqualityTesters) ->
12
12
  compare: ($popup, $link) ->
13
- pass: ->
14
- popupDims = u.measure($popup, full: true)
15
- linkDims = u.measure($link, full: true)
16
- expect(popupDims.right).toBeAround(linkDims.right, 1)
17
- expect(popupDims.top).toBeAround(linkDims.top + linkDims.height, 1)
13
+ popupDims = $popup.get(0).getBoundingClientRect()
14
+ linkDims = $link.get(0).getBoundingClientRect()
15
+ pass:
16
+ Math.abs(popupDims.right - linkDims.right) < 1.0 && Math.abs(popupDims.top - linkDims.bottom) < 1.0
17
+
18
+ beforeEach ->
19
+ @restoreBodyHeight = u.temporaryCss('body', 'min-height': '3000px')
20
+
21
+ afterEach ->
22
+ @restoreBodyHeight()
18
23
 
19
24
  it "loads this link's destination in a popup positioned under the given link", ->
20
25
  $container = affix('.container')
@@ -42,19 +47,24 @@ describe 'up.popup', ->
42
47
  expect($popup.find('.after')).not.toExist()
43
48
 
44
49
  expect($popup.css('position')).toEqual('absolute')
50
+
45
51
  expect($popup).toSitBelow($link)
46
52
 
47
53
  it 'gives the popup { position: "fixed" } if the given link is fixed', ->
54
+ # Let's test the harder case where the document is scrolled
55
+ up.layout.scroll(document, 50)
48
56
  $container = affix('.container')
49
57
  $container.css
50
58
  position: 'fixed'
51
59
  left: '100px'
52
60
  top: '50px'
53
61
  $link = $container.affix('a[href="/path/to"][up-popup=".content"]').text('link')
62
+
54
63
  up.popup.attach($link)
55
64
  @respondWith('<div class="content">popup-content</div>')
56
65
  $popup = $('.up-popup')
57
66
  expect($popup.css('position')).toEqual('fixed')
67
+
58
68
  expect($popup).toSitBelow($link)
59
69
 
60
70
  it 'does not explode if the popup was closed before the response was received', ->
@@ -166,35 +176,42 @@ describe 'up.popup', ->
166
176
  describe 'a[up-popup]', ->
167
177
 
168
178
  beforeEach ->
169
- @$link = affix('a[href="/path"][up-popup=".target"]')
170
- @attachSpy = up.popup.knife.mock('attach').and.returnValue(u.resolvedPromise())
171
- @defaultSpy = up.link.knife.mock('allowDefault').and.callFake((event) -> event.preventDefault())
179
+ @stubAttach = =>
180
+ @$link = affix('a[href="/path"][up-popup=".target"]')
181
+ @attachSpy = up.popup.knife.mock('attach').and.returnValue(u.resolvedPromise())
182
+ @defaultSpy = up.link.knife.mock('allowDefault').and.callFake((event) -> event.preventDefault())
172
183
 
173
184
  it 'opens the clicked link in a popup', ->
185
+ @stubAttach()
174
186
  Trigger.click(@$link)
175
187
  expect(@attachSpy).toHaveBeenCalledWith(@$link)
176
188
 
177
189
  # IE does not call Javascript and always performs the default action on right clicks
178
190
  unless navigator.userAgent.match(/Trident/)
179
191
  it 'does nothing if the right mouse button is used', ->
192
+ @stubAttach()
180
193
  Trigger.click(@$link, button: 2)
181
194
  expect(@attachSpy).not.toHaveBeenCalled()
182
195
 
183
196
  it 'does nothing if shift is pressed during the click', ->
197
+ @stubAttach()
184
198
  Trigger.click(@$link, shiftKey: true)
185
199
  expect(@attachSpy).not.toHaveBeenCalled()
186
200
 
187
201
  it 'does nothing if ctrl is pressed during the click', ->
202
+ @stubAttach()
188
203
  Trigger.click(@$link, ctrlKey: true)
189
204
  expect(@attachSpy).not.toHaveBeenCalled()
190
205
 
191
206
  it 'does nothing if meta is pressed during the click', ->
207
+ @stubAttach()
192
208
  Trigger.click(@$link, metaKey: true)
193
209
  expect(@attachSpy).not.toHaveBeenCalled()
194
210
 
195
211
  describe 'with [up-instant] modifier', ->
196
212
 
197
213
  beforeEach ->
214
+ @stubAttach()
198
215
  @$link.attr('up-instant', '')
199
216
 
200
217
  it 'opens the modal on mousedown (instead of on click)', ->
@@ -227,6 +244,13 @@ describe 'up.popup', ->
227
244
  Trigger.mousedown(@$link, metaKey: true)
228
245
  expect(@attachSpy).not.toHaveBeenCalled()
229
246
 
247
+ describe 'with [up-method] modifier', ->
248
+
249
+ it 'honours the given method', ->
250
+ $link = affix('a[href="/path"][up-popup=".target"][up-method="post"]')
251
+ Trigger.click($link)
252
+ expect(@lastRequest().method).toEqual 'POST'
253
+
230
254
  describe '[up-close]', ->
231
255
 
232
256
  describe 'when clicked inside a popup', ->
@@ -1,5 +1,7 @@
1
1
  describe 'up.tooltip', ->
2
-
2
+
3
+ u = up.util
4
+
3
5
  describe 'Javascript functions', ->
4
6
 
5
7
  describe 'up.tooltip.attach', ->
@@ -33,44 +35,68 @@ describe 'up.tooltip', ->
33
35
  width: '50px'
34
36
  height: '50px'
35
37
  )
36
- @linkBox = up.util.measure(@$link, relative: true)
38
+
39
+ beforeEach ->
40
+ @restoreBodyHeight = u.temporaryCss('body', 'min-height': '3000px')
41
+
42
+ afterEach ->
43
+ @restoreBodyHeight()
37
44
 
38
45
  describe 'with { position: "top" }', ->
39
46
 
40
47
  it 'centers the tooltip above the given element', ->
48
+ @linkBox = @$link.get(0).getBoundingClientRect()
41
49
  up.tooltip.attach(@$link, html: 'tooltip text', position: 'top')
42
50
  $tooltip = $('.up-tooltip')
43
- tooltipBox = up.util.measure($tooltip, relative: true)
51
+ tooltipBox = $tooltip.get(0).getBoundingClientRect()
44
52
  expect(tooltipBox.top).toBeAround(@linkBox.top - tooltipBox.height, 15)
45
53
  expect(tooltipBox.left).toBeAround(@linkBox.left + 0.5 * (@linkBox.width - tooltipBox.width), 15)
46
54
 
47
55
  describe 'with { position: "right" }', ->
48
56
 
49
57
  it 'centers the tooltip at the right side of the given element', ->
58
+ @linkBox = @$link.get(0).getBoundingClientRect()
50
59
  up.tooltip.attach(@$link, html: 'tooltip text', position: 'right')
51
60
  $tooltip = $('.up-tooltip')
52
- tooltipBox = up.util.measure($tooltip, relative: true)
61
+ tooltipBox = $tooltip.get(0).getBoundingClientRect()
53
62
  expect(tooltipBox.top).toBeAround(@linkBox.top + 0.5 * (@linkBox.height - tooltipBox.height), 15)
54
63
  expect(tooltipBox.left).toBeAround(@linkBox.left + @linkBox.width, 15)
55
64
 
56
65
  describe 'with { position: "bottom" }', ->
57
66
 
58
67
  it 'centers the tooltip below the given element', ->
68
+ @linkBox = @$link.get(0).getBoundingClientRect()
59
69
  up.tooltip.attach(@$link, html: 'tooltip text', position: 'bottom')
60
70
  $tooltip = $('.up-tooltip')
61
- tooltipBox = up.util.measure($tooltip, relative: true)
71
+ tooltipBox = $tooltip.get(0).getBoundingClientRect()
62
72
  expect(tooltipBox.top).toBeAround(@linkBox.top + @linkBox.height, 15)
63
73
  expect(tooltipBox.left).toBeAround(@linkBox.left + 0.5 * (@linkBox.width - tooltipBox.width), 15)
64
74
 
65
75
  describe 'with { position: "left" }', ->
66
76
 
67
77
  it 'centers the tooltip at the left side of the given element', ->
78
+ @linkBox = @$link.get(0).getBoundingClientRect()
68
79
  up.tooltip.attach(@$link, html: 'tooltip text', position: 'left')
69
80
  $tooltip = $('.up-tooltip')
70
- tooltipBox = up.util.measure($tooltip, relative: true)
81
+ tooltipBox = $tooltip.get(0).getBoundingClientRect()
71
82
  expect(tooltipBox.top).toBeAround(@linkBox.top + 0.5 * (@linkBox.height - tooltipBox.height), 15)
72
83
  expect(tooltipBox.left).toBeAround(@linkBox.left - tooltipBox.width, 15)
73
84
 
85
+ it 'gives the tooltip { position: "fixed" } if the given link is fixed', ->
86
+ # Let's test the harder case where the document is scrolled
87
+ up.layout.scroll(document, 50)
88
+ @$link.css(position: 'fixed')
89
+ @linkBox = @$link.get(0).getBoundingClientRect()
90
+
91
+ up.tooltip.attach(@$link, html: 'tooltip text', position: 'top')
92
+ $tooltip = $('.up-tooltip')
93
+ tooltipBox = $tooltip.get(0).getBoundingClientRect()
94
+
95
+ expect($tooltip.css('position')).toEqual('fixed')
96
+ expect(tooltipBox.top).toBeAround(@linkBox.top - tooltipBox.height, 15)
97
+ expect(tooltipBox.left).toBeAround(@linkBox.left + 0.5 * (@linkBox.width - tooltipBox.width), 15)
98
+
99
+
74
100
  it 'closes an existing tooltip'
75
101
 
76
102
  describe 'with position option', ->
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unpoly-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.1
4
+ version: 0.26.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-14 00:00:00.000000000 Z
11
+ date: 2016-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -150,6 +150,8 @@ files:
150
150
  - spec_app/app/helpers/application_helper.rb
151
151
  - spec_app/app/mailers/.keep
152
152
  - spec_app/app/models/concerns/.keep
153
+ - spec_app/app/views/css_test/popup.erb
154
+ - spec_app/app/views/css_test/popup_contents.erb
153
155
  - spec_app/app/views/css_test/tooltip.erb
154
156
  - spec_app/app/views/form_test/basics/new.erb
155
157
  - spec_app/app/views/form_test/submission_result.erb