unpoly-rails 0.22.1 → 0.23.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/design/positioning.txt +28 -0
- data/dist/unpoly.css +27 -20
- data/dist/unpoly.js +171 -59
- data/dist/unpoly.min.css +1 -1
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/browser.js.coffee +12 -0
- data/lib/assets/javascripts/unpoly/bus.js.coffee +21 -22
- data/lib/assets/javascripts/unpoly/form.js.coffee +9 -5
- data/lib/assets/javascripts/unpoly/layout.js.coffee +3 -2
- data/lib/assets/javascripts/unpoly/link.js.coffee +3 -2
- data/lib/assets/javascripts/unpoly/navigation.js.coffee +2 -2
- data/lib/assets/javascripts/unpoly/proxy.js.coffee +11 -9
- data/lib/assets/javascripts/unpoly/tooltip.js.coffee +9 -2
- data/lib/assets/javascripts/unpoly/util.js.coffee +79 -11
- data/lib/assets/stylesheets/unpoly/tooltip.css.sass +32 -22
- data/lib/unpoly/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/app/assets/images/grid.png +0 -0
- data/spec_app/app/assets/javascripts/integration_test.coffee +2 -0
- data/spec_app/app/assets/javascripts/jasmine_specs.coffee +7 -0
- data/spec_app/app/assets/stylesheets/integration_test.sass +24 -0
- data/spec_app/app/assets/stylesheets/jasmine_specs.sass +1 -0
- data/spec_app/app/controllers/{test_controller.rb → binding_test_controller.rb} +1 -1
- data/spec_app/app/controllers/css_test_controller.rb +5 -0
- data/spec_app/app/controllers/form_test/basics_controller.rb +14 -0
- data/spec_app/app/controllers/form_test/uploads_controller.rb +15 -0
- data/spec_app/app/controllers/pages_controller.rb +5 -0
- data/spec_app/app/views/css_test/tooltip.erb +15 -0
- data/spec_app/app/views/form_test/basics/new.erb +33 -0
- data/spec_app/app/views/form_test/submission_result.erb +30 -0
- data/spec_app/app/views/form_test/uploads/new.erb +27 -0
- data/spec_app/app/views/layouts/integration_test.erb +14 -0
- data/spec_app/app/views/pages/start.erb +25 -0
- data/spec_app/config/initializers/assets.rb +4 -1
- data/spec_app/config/routes.rb +8 -2
- data/spec_app/spec/controllers/{test_controller_spec.rb → binding_test_controller_spec.rb} +1 -1
- data/spec_app/spec/javascripts/helpers/parse_form_data.js.coffee +9 -0
- data/spec_app/spec/javascripts/support/jasmine.yml +2 -2
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +21 -1
- data/spec_app/spec/javascripts/up/tooltip_spec.js.coffee +54 -17
- metadata +21 -13
- data/spec_app/app/assets/javascripts/application.js +0 -20
- data/spec_app/app/assets/stylesheets/application.css +0 -17
- data/spec_app/app/assets/stylesheets/blocks/card.css.sass +0 -11
- data/spec_app/app/assets/stylesheets/blocks/controls.css.sass +0 -7
- data/spec_app/app/assets/stylesheets/blocks/menu.css.sass +0 -13
- data/spec_app/app/assets/stylesheets/blocks/panel.css.sass +0 -8
- data/spec_app/app/assets/stylesheets/jasmine_specs.css +0 -5
- data/spec_app/app/controllers/concerns/.keep +0 -0
- data/spec_app/app/views/layouts/application.html.erb +0 -12
data/lib/unpoly/rails/version.rb
CHANGED
data/spec_app/Gemfile.lock
CHANGED
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
//= require unpoly
|
2
|
+
|
3
|
+
body
|
4
|
+
margin: 0
|
5
|
+
background: image-url('grid.png') repeat
|
6
|
+
font-family: arial, sans-serif
|
7
|
+
|
8
|
+
.example
|
9
|
+
margin: 50px
|
10
|
+
|
11
|
+
.button
|
12
|
+
display: inline-block
|
13
|
+
height: 50px
|
14
|
+
line-height: 50px
|
15
|
+
padding-left: 25px
|
16
|
+
padding-right: 25px
|
17
|
+
background-color: #e21
|
18
|
+
color: white
|
19
|
+
text-decoration: none
|
20
|
+
&:hover
|
21
|
+
background-color: #fa1
|
22
|
+
|
23
|
+
dt
|
24
|
+
font-weight: bold
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require unpoly
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class="example">
|
2
|
+
<a class="button" href="#" up-tooltip="Tooltip text" up-position="top">Top tooltip</a>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div class="example">
|
6
|
+
<a class="button" href="#" up-tooltip="Tooltip text" up-position="bottom">Bottom tooltip</a>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="example">
|
10
|
+
<a class="button" href="#" up-tooltip="Tooltip text" up-position="left">Left tooltip</a>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="example">
|
14
|
+
<a class="button" href="#" up-tooltip="Tooltip text" up-position="right">Right tooltip</a>
|
15
|
+
</div>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<div class="example">
|
2
|
+
|
3
|
+
<h2>Basic form</h2>
|
4
|
+
|
5
|
+
<%= form_tag "/form_test/basic", method: :post, 'up-target' => '.result' do %>
|
6
|
+
|
7
|
+
<p>
|
8
|
+
<input type="text" name="text-param" value="text-value" />
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p>
|
12
|
+
<input type="password" name="password-param" value="password-value" />
|
13
|
+
</p>
|
14
|
+
|
15
|
+
<p>
|
16
|
+
<select name="select-param">
|
17
|
+
<option value="select-value">select-label</option>
|
18
|
+
</select>
|
19
|
+
</p>
|
20
|
+
|
21
|
+
<p>
|
22
|
+
<button type="submit">Submit</button>
|
23
|
+
</p>
|
24
|
+
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<h3>Submission result</h3>
|
28
|
+
|
29
|
+
<div class="result">
|
30
|
+
Results of the form submission will be shown here.
|
31
|
+
</div>
|
32
|
+
|
33
|
+
</div>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<% require "base64" %>
|
2
|
+
|
3
|
+
<div class="result">
|
4
|
+
|
5
|
+
<p>
|
6
|
+
Submitted <code>params</code> were:
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<dl>
|
10
|
+
<% params.each do |key, value| %>
|
11
|
+
<dt><code><%= key %></code></dt>
|
12
|
+
<dd>
|
13
|
+
<% if value.is_a?(String) %>
|
14
|
+
<pre><code><%= value %></code></pre>
|
15
|
+
<% elsif value.is_a?(ActionDispatch::Http::UploadedFile) %>
|
16
|
+
<% if value.original_filename.ends_with?('.jpg') %>
|
17
|
+
<img src="data:image/jpeg;base64,<%= Base64.encode64(value.read) %>">
|
18
|
+
<% elsif value.original_filename.ends_with?('.png') %>
|
19
|
+
<img src="data:image/png;base64,<%= Base64.encode64(value.read) %>">
|
20
|
+
<% else %>
|
21
|
+
<%= value.original_filename %> (<%= value.size %> bytes)
|
22
|
+
<% end %>
|
23
|
+
<% else %>
|
24
|
+
<%= value.inspect %>
|
25
|
+
<% end %>
|
26
|
+
</dd>
|
27
|
+
<% end %>
|
28
|
+
</dl>
|
29
|
+
|
30
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<div class="example">
|
2
|
+
|
3
|
+
<h2>Form with file uploads</h2>
|
4
|
+
|
5
|
+
<%= form_tag "/form_test/upload", method: :post, multipart: true, 'up-target' => '.result' do %>
|
6
|
+
|
7
|
+
<p>
|
8
|
+
<input type="text" name="text-param" value="text-value" />
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p>
|
12
|
+
<input type="file" name="file-param" />
|
13
|
+
</p>
|
14
|
+
|
15
|
+
<p>
|
16
|
+
<button type="submit">Submit</button>
|
17
|
+
</p>
|
18
|
+
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<h3>Submission result</h3>
|
22
|
+
|
23
|
+
<div class="result">
|
24
|
+
Results of the form submission will be shown here.
|
25
|
+
</div>
|
26
|
+
|
27
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Integration test - Unpoly</title>
|
5
|
+
<%= stylesheet_link_tag 'integration_test', media: 'all' %>
|
6
|
+
<%= javascript_include_tag 'integration_test' %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div class="page">
|
11
|
+
<%= yield %>
|
12
|
+
</div>
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<div class="example">
|
2
|
+
|
3
|
+
<h1>Unpoly tests</h1>
|
4
|
+
|
5
|
+
<h2>Unit tests</h2>
|
6
|
+
|
7
|
+
<ul>
|
8
|
+
<li><%= link_to 'Jasmine specs', '/specs' %></li>
|
9
|
+
</ul>
|
10
|
+
|
11
|
+
<h2>Integration tests</h2>
|
12
|
+
|
13
|
+
<ul>
|
14
|
+
<li><%= link_to 'Tooltip', '/css_test/tooltip' %></li>
|
15
|
+
</ul>
|
16
|
+
|
17
|
+
<ul>
|
18
|
+
<li><%= link_to 'Form (basic)', '/form_test/basic/new' %></li>
|
19
|
+
</ul>
|
20
|
+
|
21
|
+
<ul>
|
22
|
+
<li><%= link_to 'Form (upload)', '/form_test/upload/new' %></li>
|
23
|
+
</ul>
|
24
|
+
|
25
|
+
</div>
|
@@ -8,4 +8,7 @@ Rails.application.config.assets.version = '1.0'
|
|
8
8
|
|
9
9
|
# Precompile additional assets.
|
10
10
|
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
11
|
-
|
11
|
+
|
12
|
+
|
13
|
+
Rails.application.config.assets.precompile += %w( application.js application.css )
|
14
|
+
Rails.application.config.assets.precompile += %w( jasmine_specs.js jasmine_specs.css integration_test.js integration_test.css )
|
data/spec_app/config/routes.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
|
3
3
|
mount JasmineRails::Engine => '/specs' if defined?(JasmineRails)
|
4
|
-
root to:
|
4
|
+
root to: 'pages#start'
|
5
5
|
|
6
|
-
get '
|
6
|
+
get 'binding_test/:action', controller: 'binding_test'
|
7
|
+
get 'css_test/:action', controller: 'css_test'
|
8
|
+
|
9
|
+
namespace :form_test do
|
10
|
+
resource :basic, only: [:new, :create]
|
11
|
+
resource :upload, only: [:new, :create]
|
12
|
+
end
|
7
13
|
|
8
14
|
end
|
@@ -17,12 +17,12 @@ css_dir: "app/assets/stylesheets"
|
|
17
17
|
# list of file expressions to include as source files
|
18
18
|
# relative path from src_dir
|
19
19
|
src_files:
|
20
|
-
- "
|
20
|
+
- "jasmine_specs.{js.coffee,js,coffee}"
|
21
21
|
|
22
22
|
# list of file expressions to include as css files
|
23
23
|
# relative path from css_dir
|
24
24
|
css_files:
|
25
|
-
- "
|
25
|
+
- "jasmine_specs.{css.sass,css,sass}"
|
26
26
|
|
27
27
|
# path to parent directory of spec_files
|
28
28
|
# relative path from Rails.root
|
@@ -166,9 +166,29 @@ describe 'up.form', ->
|
|
166
166
|
@respondWith('<div class="response">new-text</div>')
|
167
167
|
expect(up.browser.url()).toEqual(@hrefBeforeExample)
|
168
168
|
|
169
|
+
describe 'in a form with file inputs', ->
|
170
|
+
|
171
|
+
beforeEach ->
|
172
|
+
@$form.affix('input[name="file-field"][type="file"]')
|
173
|
+
|
174
|
+
describeCapability 'canFormData', ->
|
175
|
+
|
176
|
+
it 'transfers the form fields via FormData', ->
|
177
|
+
up.submit(@$form)
|
178
|
+
data = @lastRequest().data()
|
179
|
+
expect(u.isFormData(data)).toBe(true)
|
180
|
+
|
181
|
+
describeFallback 'canFormData', ->
|
182
|
+
|
183
|
+
it 'falls back to a vanilla form submission', ->
|
184
|
+
form = @$form.get(0)
|
185
|
+
spyOn(form, 'submit')
|
186
|
+
up.submit(@$form)
|
187
|
+
expect(form.submit).toHaveBeenCalled()
|
188
|
+
|
169
189
|
describeFallback 'canPushState', ->
|
170
190
|
|
171
|
-
it '
|
191
|
+
it 'falls back to a vanilla form submission', ->
|
172
192
|
$form = affix('form[action="/path/to"][method="put"][up-target=".response"]')
|
173
193
|
form = $form.get(0)
|
174
194
|
spyOn(form, 'submit')
|
@@ -4,36 +4,73 @@ describe 'up.tooltip', ->
|
|
4
4
|
|
5
5
|
describe 'up.tooltip.attach', ->
|
6
6
|
|
7
|
-
it 'opens a
|
8
|
-
$link = affix('span')
|
9
|
-
$link.css(
|
10
|
-
position: 'absolute'
|
11
|
-
left: '200px'
|
12
|
-
top: '200px'
|
13
|
-
width: '50px'
|
14
|
-
height: '50px'
|
15
|
-
)
|
7
|
+
it 'opens a tooltip with the given text', ->
|
8
|
+
$link = affix('span')
|
16
9
|
up.tooltip.attach($link, html: 'tooltip text')
|
17
10
|
$tooltip = $('.up-tooltip')
|
18
|
-
expect($tooltip).toBeInDOM()
|
19
11
|
expect($tooltip).toHaveText('tooltip text')
|
20
|
-
|
21
|
-
|
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
|
-
|
25
|
-
it 'allows HTML for the tooltip text when contents are given as .html option', ->
|
12
|
+
|
13
|
+
it 'allows HTML for the tooltip text when contents are given as { html } option', ->
|
26
14
|
$link = affix('span')
|
27
15
|
up.tooltip.attach($link, html: '<b>text</b>')
|
28
16
|
$tooltip = $('.up-tooltip')
|
29
17
|
expect($tooltip.html()).toEqual('<b>text</b>')
|
30
18
|
|
31
|
-
it 'escapes HTML for the tooltip text when contents given as
|
19
|
+
it 'escapes HTML for the tooltip text when contents given as { text } option', ->
|
32
20
|
$link = affix('span')
|
33
21
|
up.tooltip.attach($link, text: '<b>text</b>')
|
34
22
|
$tooltip = $('.up-tooltip')
|
35
23
|
expect($tooltip.html()).toEqual('<b>text</b>')
|
36
24
|
|
25
|
+
describe 'positioning', ->
|
26
|
+
|
27
|
+
beforeEach ->
|
28
|
+
@$link = affix('span').text('button label')
|
29
|
+
@$link.css(
|
30
|
+
position: 'absolute'
|
31
|
+
left: '200px'
|
32
|
+
top: '200px'
|
33
|
+
width: '50px'
|
34
|
+
height: '50px'
|
35
|
+
)
|
36
|
+
@linkBox = up.util.measure(@$link, relative: true)
|
37
|
+
|
38
|
+
describe 'with { position: "top" }', ->
|
39
|
+
|
40
|
+
it 'centers the tooltip above the given element', ->
|
41
|
+
up.tooltip.attach(@$link, html: 'tooltip text', position: 'top')
|
42
|
+
$tooltip = $('.up-tooltip')
|
43
|
+
tooltipBox = up.util.measure($tooltip, relative: true)
|
44
|
+
expect(tooltipBox.top).toBeAround(@linkBox.top - tooltipBox.height, 15)
|
45
|
+
expect(tooltipBox.left).toBeAround(@linkBox.left + 0.5 * (@linkBox.width - tooltipBox.width), 15)
|
46
|
+
|
47
|
+
describe 'with { position: "right" }', ->
|
48
|
+
|
49
|
+
it 'centers the tooltip at the right side of the given element', ->
|
50
|
+
up.tooltip.attach(@$link, html: 'tooltip text', position: 'right')
|
51
|
+
$tooltip = $('.up-tooltip')
|
52
|
+
tooltipBox = up.util.measure($tooltip, relative: true)
|
53
|
+
expect(tooltipBox.top).toBeAround(@linkBox.top + 0.5 * (@linkBox.height - tooltipBox.height), 15)
|
54
|
+
expect(tooltipBox.left).toBeAround(@linkBox.left + @linkBox.width, 15)
|
55
|
+
|
56
|
+
describe 'with { position: "bottom" }', ->
|
57
|
+
|
58
|
+
it 'centers the tooltip below the given element', ->
|
59
|
+
up.tooltip.attach(@$link, html: 'tooltip text', position: 'bottom')
|
60
|
+
$tooltip = $('.up-tooltip')
|
61
|
+
tooltipBox = up.util.measure($tooltip, relative: true)
|
62
|
+
expect(tooltipBox.top).toBeAround(@linkBox.top + @linkBox.height, 15)
|
63
|
+
expect(tooltipBox.left).toBeAround(@linkBox.left + 0.5 * (@linkBox.width - tooltipBox.width), 15)
|
64
|
+
|
65
|
+
describe 'with { position: "left" }', ->
|
66
|
+
|
67
|
+
it 'centers the tooltip at the left side of the given element', ->
|
68
|
+
up.tooltip.attach(@$link, html: 'tooltip text', position: 'left')
|
69
|
+
$tooltip = $('.up-tooltip')
|
70
|
+
tooltipBox = up.util.measure($tooltip, relative: true)
|
71
|
+
expect(tooltipBox.top).toBeAround(@linkBox.top + 0.5 * (@linkBox.height - tooltipBox.height), 15)
|
72
|
+
expect(tooltipBox.left).toBeAround(@linkBox.left - tooltipBox.width, 15)
|
73
|
+
|
37
74
|
it 'closes an existing tooltip'
|
38
75
|
|
39
76
|
describe 'with position option', ->
|