ultimate-base 0.3.1.1 → 0.3.2
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.
- data/Gemfile.lock +15 -15
- data/app/assets/javascripts/ultimate/backbone/lib/backbone.js +70 -56
- data/app/assets/javascripts/ultimate/backbone/model.js.coffee +2 -2
- data/app/assets/javascripts/ultimate/backbone/view.js.coffee +5 -4
- data/app/assets/javascripts/ultimate/backbone/views/typed-fields.js.coffee +1 -1
- data/app/assets/javascripts/ultimate/helpers/asset_tag.js.coffee +21 -19
- data/app/assets/javascripts/ultimate/helpers/form_options.js.coffee +65 -0
- data/app/assets/javascripts/ultimate/helpers/form_tag.js.coffee +177 -0
- data/app/assets/javascripts/ultimate/helpers/javascript.js.coffee +31 -0
- data/app/assets/javascripts/ultimate/helpers/record_tag.js.coffee +29 -15
- data/app/assets/javascripts/ultimate/helpers/tag.js.coffee +7 -3
- data/app/assets/javascripts/ultimate/helpers/url.js.coffee +62 -7
- data/app/assets/javascripts/ultimate/jquery-plugin-adapter.js.coffee +1 -0
- data/app/assets/javascripts/ultimate/jquery-plugin-class.js.coffee +35 -16
- data/app/assets/javascripts/ultimate/jquery.base.js.coffee +1 -1
- data/app/assets/javascripts/ultimate/underscore/underscore.js +292 -192
- data/app/assets/javascripts/ultimate/underscore/underscore.outcasts.js.coffee +27 -2
- data/app/assets/javascripts/ultimate/underscore/underscore.string.js +4 -4
- data/app/assets/stylesheets/polyfills/PIE.htc +81 -81
- data/app/assets/stylesheets/polyfills/boxsizing.htc +255 -54
- data/app/assets/stylesheets/ultimate/mixins/_vendors.scss +9 -0
- data/app/assets/stylesheets/ultimate/mixins/css3.scss +39 -28
- data/app/assets/stylesheets/ultimate/mixins/microstructures.scss +32 -6
- data/lib/ultimate/base/version.rb +1 -1
- data/test/javascripts/tests/helpers/asset_tag_test.js.coffee +1 -1
- data/test/javascripts/tests/helpers/form_options_test.js.coffee +96 -0
- data/test/javascripts/tests/helpers/form_tag_test.js.coffee +225 -0
- data/test/javascripts/tests/helpers/javascript_test.js.coffee +25 -0
- data/test/javascripts/tests/helpers/record_tag_test.js.coffee +5 -3
- data/test/javascripts/tests/helpers/tag_test.js.coffee +22 -17
- data/test/javascripts/tests/helpers/url_test.js.coffee +50 -6
- data/test/javascripts/tests/underscore/underscore.outcasts.test.js.coffee +9 -0
- metadata +8 -4
- data/app/assets/javascripts/ultimate/helpers/translation.js.coffee +0 -97
- data/test/javascripts/tests/helpers/translation_test.js.coffee +0 -140
@@ -122,7 +122,7 @@ $boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
|
122
122
|
// produce:
|
123
123
|
// background-color: $bg-color;
|
124
124
|
// background-image: -webkit-gradient(linear, right top, left top, color-stop(0%, green), color-stop(20%, orange), color-stop(100%, red)); // old webkit (Safari <= 5.0, iOS-Safari <= 4.3, Android <= 3.0)
|
125
|
-
// background-image: -webkit-linear-gradient(right, green, orange 20%, red 100%); // Chrome 10+, Safari 5.1+
|
125
|
+
// background-image: -webkit-linear-gradient(right, green, orange 20%, red 100%); // Chrome 10+, Safari 5.1+, Android 4.0+
|
126
126
|
// background-image: -moz-linear-gradient(right, green, orange 20%, red 100%); // FF 3.6+
|
127
127
|
// background-image: -ms-linear-gradient(right, green, orange 20%, red 100%); // IE 10+
|
128
128
|
// background-image: -o-linear-gradient(right, green, orange 20%, red 100%); // Opera 11.1+
|
@@ -147,7 +147,7 @@ $boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
|
147
147
|
}
|
148
148
|
$wk_stops: ();
|
149
149
|
$stops_length: length($stops);
|
150
|
-
$
|
150
|
+
$percents-by-stop: 100 / ($stops_length - 1);
|
151
151
|
$i: 0;
|
152
152
|
$p: 0;
|
153
153
|
@each $stop in $stops {
|
@@ -158,12 +158,12 @@ $boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
|
158
158
|
}
|
159
159
|
$stop: "#{$cp}, #{nth($stop, 1)}";
|
160
160
|
$wk_stops: append($wk_stops, color-stop(#{$stop}), comma);
|
161
|
-
$p: $p + $
|
161
|
+
$p: $p + $percents-by-stop;
|
162
162
|
}
|
163
163
|
$bg-color: nth(nth($stops, 1), 1);
|
164
164
|
background-color: $bg-color;
|
165
165
|
background-image: -webkit-gradient(linear, $wk_start, $wk_end, $wk_stops);
|
166
|
-
$linear-gradient: linear-gradient($corner_angle, $stops);
|
166
|
+
$linear-gradient: linear-gradient($corner_angle, change-separator($stops));
|
167
167
|
@include vendors-param(webkit moz ms o, background-image, $linear-gradient);
|
168
168
|
@if $support-ie and $pie-url {
|
169
169
|
-pie-background: $bg-color $linear-gradient;
|
@@ -189,35 +189,42 @@ $boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
|
189
189
|
// example:
|
190
190
|
// @include radial-gradient(center 45deg, circle closest-side, (orange 0%, red 100%));
|
191
191
|
// produce:
|
192
|
-
// background-image: -webkit-radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // Chrome 10+, Safari 5.1+
|
192
|
+
// background-image: -webkit-radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // Chrome 10+, Safari 5.1+, Android 4.0+
|
193
193
|
// background-image: -moz-radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // FF 3.6+
|
194
194
|
// background-image: -ms-radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // IE 10+
|
195
195
|
// background-image: -o-radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // Opera 11.6+
|
196
196
|
// background-image: radial-gradient(center 45deg, circle closest-side, orange 0%, red 100%); // future
|
197
197
|
@mixin radial-gradient($position_angle, $shape_size, $stops) {
|
198
|
-
// TODO may be deprecate background-image: -webkit-gradient(radial, $wk_start, $wk_end, unquote(list-to-string($wk_stops, ", ")));
|
199
198
|
@include vendors-param(webkit moz ms o, background-image, radial-gradient($position_angle, $shape_size, change-separator($stops)));
|
200
199
|
}
|
201
200
|
|
201
|
+
@mixin border-gradient_simple($color_start, $color_stop, $is_horizontal: false) {
|
202
|
+
$color_mix: mix($color_start, $color_stop);
|
203
|
+
@if $is_horizontal {
|
204
|
+
border-color: $color_mix $color_stop $color_mix $color_start;
|
205
|
+
} @else {
|
206
|
+
border-color: $color_start $color_mix $color_stop;
|
207
|
+
}
|
208
|
+
}
|
209
|
+
|
202
210
|
// EXPERIMENTAL
|
211
|
+
// Temporary remove webkit support, because find bug in Chromium 20
|
203
212
|
@mixin border-gradient($color_start, $color_stop, $is_horizontal: false) {
|
213
|
+
@include border-gradient_simple($color_start, $color_stop, $is_horizontal);
|
204
214
|
$start: top;
|
205
|
-
|
206
|
-
|
215
|
+
//$wk_start: left top;
|
216
|
+
//$wk_stop: left bottom;
|
207
217
|
@if $is_horizontal {
|
208
218
|
$start: left;
|
209
|
-
|
210
|
-
} @else {
|
211
|
-
$start: top;
|
212
|
-
$wk_stop: left bottom;
|
219
|
+
//$wk_stop: right top;
|
213
220
|
}
|
214
|
-
border-
|
215
|
-
-
|
216
|
-
//
|
217
|
-
-moz-border-image:
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
+
// -webkit-border-image: -webkit-gradient(linear, $wk_start, $wk_stop, from($color_start), to($color_stop)); // old webkit (Safari <= 5.0, iOS-Safari <= 4.3, Android <= 3.0)
|
222
|
+
@include vendors-full(moz ms o, border-image, linear-gradient($start, $color_start, $color_stop));
|
223
|
+
//-webkit-border-image: -webkit-linear-gradient($start, $color_start, $color_stop); // Chrome 10+, Safari 5.1+, Android 4.0+
|
224
|
+
// -moz-border-image: -moz-linear-gradient($start, $color_start, $color_stop); // FF 3.5+
|
225
|
+
// -ms-border-image: -ms-linear-gradient($start, $color_start, $color_stop); // IE 10+
|
226
|
+
// -o-border-image: -o-linear-gradient($start, $color_start, $color_stop); // Opera 11.0+
|
227
|
+
// border-image: linear-gradient($start, $color_start, $color_stop); // future
|
221
228
|
}
|
222
229
|
|
223
230
|
// Provide cross-browser CSS opacity.
|
@@ -320,12 +327,16 @@ $boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
|
320
327
|
}
|
321
328
|
}
|
322
329
|
|
323
|
-
//
|
324
|
-
|
325
|
-
//
|
326
|
-
//
|
327
|
-
//
|
328
|
-
//
|
329
|
-
//
|
330
|
-
//
|
331
|
-
|
330
|
+
// Style the html5 input placeholder in browsers that support it.
|
331
|
+
// The styles for the input placeholder are passed as mixin content.
|
332
|
+
// Mostly supported properties: color, font-*, letter-spacing.
|
333
|
+
// example:
|
334
|
+
// @include input-placeholder {
|
335
|
+
// color: #bfbfbf;
|
336
|
+
// font-style: italic;
|
337
|
+
// }
|
338
|
+
@mixin input-placeholder {
|
339
|
+
&::-webkit-input-placeholder { @content; }
|
340
|
+
&:-moz-placeholder { @content; }
|
341
|
+
&:-ms-input-placeholder { @content; }
|
342
|
+
}
|
@@ -65,18 +65,44 @@ $support-ie: true !default;
|
|
65
65
|
}
|
66
66
|
}
|
67
67
|
|
68
|
+
@mixin before($display: block, $content: '') {
|
69
|
+
&:before {
|
70
|
+
display: $display;
|
71
|
+
content: $content;
|
72
|
+
@content;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
@mixin after($display: block, $content: '') {
|
77
|
+
&:after {
|
78
|
+
display: $display;
|
79
|
+
content: $content;
|
80
|
+
@content;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
@mixin both($display: block, $content: '') {
|
85
|
+
&:before, &:after {
|
86
|
+
display: $display;
|
87
|
+
content: $content;
|
88
|
+
@content;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
68
92
|
// Set to container includes float blocks.
|
69
|
-
@mixin g-line {
|
93
|
+
@mixin g-line($clear: both) {
|
70
94
|
@include deprecate("@include g-line;", "overflow: hidden;");
|
71
95
|
@if $support-ie {
|
72
96
|
*zoom: 1;
|
73
97
|
_height: 0;
|
74
98
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
99
|
+
@include clearfix($clear);
|
100
|
+
}
|
101
|
+
|
102
|
+
// Adapted from: [A new micro clearfix hack](http://nicolasgallagher.com/micro-clearfix-hack/)
|
103
|
+
@mixin clearfix($clear: both) {
|
104
|
+
@include both(table) {
|
105
|
+
clear: $clear;
|
80
106
|
}
|
81
107
|
}
|
82
108
|
|
@@ -36,9 +36,9 @@ test "image_alt", ->
|
|
36
36
|
test "image_tag", ->
|
37
37
|
equal image_tag("xml.png"), '<img alt="Xml" src="/images/xml.png" />'
|
38
38
|
equal image_tag("rss.gif", alt: "rss syndication"), '<img alt="rss syndication" src="/images/rss.gif" />'
|
39
|
+
equal image_tag("gold.png", size: "20"), '<img alt="Gold" height="20" src="/images/gold.png" width="20" />'
|
39
40
|
equal image_tag("gold.png", size: "45x70"), '<img alt="Gold" height="70" src="/images/gold.png" width="45" />'
|
40
41
|
equal image_tag("gold.png", size: "45x70"), '<img alt="Gold" height="70" src="/images/gold.png" width="45" />'
|
41
|
-
equal image_tag("error.png", size: "45"), '<img alt="Error" src="/images/error.png" />'
|
42
42
|
equal image_tag("error.png", size: "45 x 70"), '<img alt="Error" src="/images/error.png" />'
|
43
43
|
equal image_tag("error.png", size: "x"), '<img alt="Error" src="/images/error.png" />'
|
44
44
|
equal image_tag("google.com.png"), '<img alt="Google.com" src="/images/google.com.png" />'
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#= require ultimate/underscore/underscore
|
2
|
+
#= require ultimate/underscore/underscore.string
|
3
|
+
#= require ultimate/underscore/underscore.outcasts
|
4
|
+
#= require ultimate/helpers/form_options
|
5
|
+
|
6
|
+
module "Ultimate.Helpers.FormOptions"
|
7
|
+
|
8
|
+
_.extend @, Ultimate.Helpers.FormOptions
|
9
|
+
|
10
|
+
test "options_for_select", ->
|
11
|
+
options = '<option value="Denmark">Denmark</option><option value="USA">USA</option><option value="Sweden">Sweden</option>'
|
12
|
+
equal options_for_select(options), options
|
13
|
+
equal options_for_select([ "<Denmark>", "USA", "Sweden" ]),
|
14
|
+
"<option value=\"<Denmark>\"><Denmark></option>\n<option value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>"
|
15
|
+
equal options_for_select([ "Denmark", "<USA>", "Sweden" ], "<USA>"),
|
16
|
+
"<option value=\"Denmark\">Denmark</option>\n<option selected=\"selected\" value=\"<USA>\"><USA></option>\n<option value=\"Sweden\">Sweden</option>"
|
17
|
+
equal options_for_select([ "Denmark", "<USA>", "Sweden" ], [ "<USA>", "Sweden" ]),
|
18
|
+
"<option value=\"Denmark\">Denmark</option>\n<option selected=\"selected\" value=\"<USA>\"><USA></option>\n<option selected=\"selected\" value=\"Sweden\">Sweden</option>"
|
19
|
+
equal options_for_select([ "Denmark", "<USA>", "Sweden" ], disabled: "<USA>"),
|
20
|
+
"<option value=\"Denmark\">Denmark</option>\n<option disabled=\"disabled\" value=\"<USA>\"><USA></option>\n<option value=\"Sweden\">Sweden</option>"
|
21
|
+
equal options_for_select([ "Denmark", "<USA>", "Sweden" ], disabled: ["<USA>", "Sweden"]),
|
22
|
+
"<option value=\"Denmark\">Denmark</option>\n<option disabled=\"disabled\" value=\"<USA>\"><USA></option>\n<option disabled=\"disabled\" value=\"Sweden\">Sweden</option>"
|
23
|
+
equal options_for_select([ "Denmark", "<USA>", "Sweden" ], selected: "Denmark", disabled: "<USA>"),
|
24
|
+
"<option selected=\"selected\" value=\"Denmark\">Denmark</option>\n<option disabled=\"disabled\" value=\"<USA>\"><USA></option>\n<option value=\"Sweden\">Sweden</option>"
|
25
|
+
equal options_for_select([ true, false ], selected: false, disabled: null),
|
26
|
+
"<option value=\"true\">true</option>\n<option selected=\"selected\" value=\"false\">false</option>"
|
27
|
+
equal options_for_select([1..3]),
|
28
|
+
"<option value=\"1\">1</option>\n<option value=\"2\">2</option>\n<option value=\"3\">3</option>"
|
29
|
+
equal options_for_select([ "ruby", "rubyonrails" ], "rubyonrails"),
|
30
|
+
"<option value=\"ruby\">ruby</option>\n<option selected=\"selected\" value=\"rubyonrails\">rubyonrails</option>"
|
31
|
+
equal options_for_select([ "ruby", "rubyonrails" ], "ruby"),
|
32
|
+
"<option selected=\"selected\" value=\"ruby\">ruby</option>\n<option value=\"rubyonrails\">rubyonrails</option>"
|
33
|
+
equal options_for_select([ "ruby", "rubyonrails", null ], "ruby"),
|
34
|
+
"<option selected=\"selected\" value=\"ruby\">ruby</option>\n<option value=\"rubyonrails\">rubyonrails</option>\n<option value=\"\"></option>"
|
35
|
+
equal options_for_select("$": "Dollar", "<DKR>": "<Kroner>"),
|
36
|
+
"<option value=\"Dollar\">$</option>\n<option value=\"<Kroner>\"><DKR></option>"
|
37
|
+
equal options_for_select({ "$": "Dollar", "<DKR>": "<Kroner>" }, "Dollar"),
|
38
|
+
"<option selected=\"selected\" value=\"Dollar\">$</option>\n<option value=\"<Kroner>\"><DKR></option>"
|
39
|
+
equal options_for_select({ "$": "Dollar", "<DKR>": "<Kroner>" }, [ "Dollar", "<Kroner>" ]),
|
40
|
+
"<option selected=\"selected\" value=\"Dollar\">$</option>\n<option selected=\"selected\" value=\"<Kroner>\"><DKR></option>"
|
41
|
+
equal options_for_select([ [ "<Denmark>", { class: 'bold' } ], [ "USA", { onclick: "alert('Hello World');" } ], [ "Sweden" ], "Germany" ]),
|
42
|
+
"<option class=\"bold\" value=\"<Denmark>\"><Denmark></option>\n<option onclick=\"alert('Hello World');\" value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>\n<option value=\"Germany\">Germany</option>"
|
43
|
+
equal options_for_select([ [ "<Denmark>", { data: { test: 'bold' } } ] ]),
|
44
|
+
"<option data-test=\"bold\" value=\"<Denmark>\"><Denmark></option>"
|
45
|
+
equal options_for_select([ [ "<Denmark>", { data: { test: '<bold>' } } ] ]),
|
46
|
+
"<option data-test=\"<bold>\" value=\"<Denmark>\"><Denmark></option>"
|
47
|
+
equal options_for_select([ "<Denmark>", [ "USA", { class: 'bold' } ], "Sweden" ], "USA"),
|
48
|
+
"<option value=\"<Denmark>\"><Denmark></option>\n<option class=\"bold\" selected=\"selected\" value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>"
|
49
|
+
equal options_for_select([ "<Denmark>", [ "USA", { class: 'bold' } ], "Sweden" ], [ "USA", "Sweden" ]),
|
50
|
+
"<option value=\"<Denmark>\"><Denmark></option>\n<option class=\"bold\" selected=\"selected\" value=\"USA\">USA</option>\n<option selected=\"selected\" value=\"Sweden\">Sweden</option>"
|
51
|
+
equal options_for_select([ [ "<Denmark>", { onclick: 'alert("<code>")' } ] ]),
|
52
|
+
"<option onclick=\"alert("<code>")\" value=\"<Denmark>\"><Denmark></option>"
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
class Post
|
57
|
+
title : null
|
58
|
+
author_name : null
|
59
|
+
body : null
|
60
|
+
secret : null
|
61
|
+
written_on : null
|
62
|
+
category : null
|
63
|
+
origin : null
|
64
|
+
allow_comments : null
|
65
|
+
|
66
|
+
constructor: ->
|
67
|
+
keys = ['title', 'author_name', 'body', 'secret', 'written_on', 'category', 'origin', 'allow_comments']
|
68
|
+
for a, i in arguments
|
69
|
+
@[keys[i]] = a
|
70
|
+
|
71
|
+
dummy_posts =
|
72
|
+
[ new Post("<Abe> went home", "<Abe>", "To a little house", "shh!"),
|
73
|
+
new Post("Babe went home", "Babe", "To a little house", "shh!"),
|
74
|
+
new Post("Cabe went home", "Cabe", "To a little house", "shh!") ]
|
75
|
+
|
76
|
+
test "options_from_collection_for_select", ->
|
77
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title"),
|
78
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
79
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", "Babe"),
|
80
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
81
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", [ "Babe", "Cabe" ]),
|
82
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option selected=\"selected\" value=\"Cabe\">Cabe went home</option>"
|
83
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", (p) -> p.author_name is 'Babe'),
|
84
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
85
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: "Babe"),
|
86
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option disabled=\"disabled\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
87
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: [ "Babe", "Cabe" ]),
|
88
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option disabled=\"disabled\" value=\"Babe\">Babe went home</option>\n<option disabled=\"disabled\" value=\"Cabe\">Cabe went home</option>"
|
89
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", selected: "Cabe", disabled: "Babe"),
|
90
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option disabled=\"disabled\" value=\"Babe\">Babe went home</option>\n<option selected=\"selected\" value=\"Cabe\">Cabe went home</option>"
|
91
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", "title", disabled: (p) -> p.author_name in ['Babe', 'Cabe']),
|
92
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option disabled=\"disabled\" value=\"Babe\">Babe went home</option>\n<option disabled=\"disabled\" value=\"Cabe\">Cabe went home</option>"
|
93
|
+
equal options_from_collection_for_select(dummy_posts, ((p) -> p.author_name), "title"),
|
94
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
95
|
+
equal options_from_collection_for_select(dummy_posts, "author_name", (p) -> p.title),
|
96
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
@@ -0,0 +1,225 @@
|
|
1
|
+
#= require ultimate/underscore/underscore
|
2
|
+
#= require ultimate/underscore/underscore.string
|
3
|
+
#= require ultimate/underscore/underscore.outcasts
|
4
|
+
#= require ultimate/helpers/form_tag
|
5
|
+
|
6
|
+
module "Ultimate.Helpers.FormTag"
|
7
|
+
|
8
|
+
_.extend @, Ultimate.Helpers.FormTag
|
9
|
+
|
10
|
+
hidden_fields = (options = {}) ->
|
11
|
+
method = options['method']
|
12
|
+
txt = '<div style="margin:0;padding:0;display:inline">'
|
13
|
+
txt += '<input name="utf8" type="hidden" value="✓" />'
|
14
|
+
if method and not (method in ['get', 'post'])
|
15
|
+
txt += '<input name="_method" type="hidden" value="' + method + '" />'
|
16
|
+
txt + '</div>'
|
17
|
+
|
18
|
+
form_text = (action = 'http://www.example.com', options = {}) ->
|
19
|
+
[remote, enctype, html_class, id, method] = _.map(_.string.words('remote enctype html_class id method'), (key) -> options[key])
|
20
|
+
method = 'post' if method isnt 'get'
|
21
|
+
txt = "<form accept-charset=\"UTF-8\" action=\"#{action}\""
|
22
|
+
txt += " enctype=\"multipart/form-data\"" if enctype
|
23
|
+
txt += " data-remote=\"true\"" if remote
|
24
|
+
txt += " class=\"#{html_class}\"" if html_class
|
25
|
+
txt += " id=\"#{id}\"" if id
|
26
|
+
txt += " method=\"#{method}\">"
|
27
|
+
txt
|
28
|
+
|
29
|
+
whole_form = (action = 'javascript:;', options = {}) ->
|
30
|
+
out = form_text(action, options) + hidden_fields(options)
|
31
|
+
if block = _.outcasts.blockGiven(arguments)
|
32
|
+
out += block() + "</form>"
|
33
|
+
out
|
34
|
+
|
35
|
+
test "form_tag", ->
|
36
|
+
equal form_tag(), whole_form()
|
37
|
+
equal form_tag({}, multipart: true), whole_form(null, enctype: true)
|
38
|
+
equal form_tag({}, method: 'patch'), whole_form(null, method: 'patch')
|
39
|
+
equal form_tag({}, method: 'put'), whole_form(null, method: 'put')
|
40
|
+
equal form_tag({}, method: 'delete'), whole_form(null, method: 'delete')
|
41
|
+
equal form_tag({}, remote: true), whole_form(null, remote: true)
|
42
|
+
equal form_tag(-> 'Hello world!'), whole_form(null, -> 'Hello world!')
|
43
|
+
equal form_tag(null, method: 'put', -> 'Hello world!'), whole_form(null, method: 'put', -> 'Hello world!')
|
44
|
+
|
45
|
+
test "select_tag", ->
|
46
|
+
equal select_tag("people", "<option>david</option>"),
|
47
|
+
'<select id="people" name="people"><option>david</option></select>'
|
48
|
+
equal select_tag("colors", "<option>Red</option><option>Blue</option><option>Green</option>", multiple: true),
|
49
|
+
'<select id="colors" multiple="multiple" name="colors[]"><option>Red</option><option>Blue</option><option>Green</option></select>'
|
50
|
+
equal select_tag("places", "<option>Home</option><option>Work</option><option>Pub</option>", disabled: true),
|
51
|
+
'<select disabled="disabled" id="places" name="places"><option>Home</option><option>Work</option><option>Pub</option></select>'
|
52
|
+
equal select_tag("places", "<option>Home</option><option>Work</option><option>Pub</option>", include_blank: true),
|
53
|
+
'<select id="places" name="places"><option value=""></option><option>Home</option><option>Work</option><option>Pub</option></select>'
|
54
|
+
equal select_tag("places", "<option>Home</option><option>Work</option><option>Pub</option>", prompt: "string"),
|
55
|
+
'<select id="places" name="places"><option value="">string</option><option>Home</option><option>Work</option><option>Pub</option></select>'
|
56
|
+
equal select_tag("places", "<option>Home</option><option>Work</option><option>Pub</option>", prompt: "<script>alert(1337)</script>"),
|
57
|
+
'<select id="places" name="places"><option value=""><script>alert(1337)</script></option><option>Home</option><option>Work</option><option>Pub</option></select>'
|
58
|
+
equal select_tag("places", "<option>Home</option><option>Work</option><option>Pub</option>", prompt: "string", include_blank: true),
|
59
|
+
'<select id="places" name="places"><option value="">string</option><option value=""></option><option>Home</option><option>Work</option><option>Pub</option></select>'
|
60
|
+
equal select_tag("places", null, include_blank: true),
|
61
|
+
'<select id="places" name="places"><option value=""></option></select>'
|
62
|
+
equal select_tag("places", null, prompt: "string"),
|
63
|
+
'<select id="places" name="places"><option value="">string</option></select>'
|
64
|
+
|
65
|
+
test "text_field_tag", ->
|
66
|
+
equal text_field_tag("title"),
|
67
|
+
'<input id="title" name="title" type="text" />'
|
68
|
+
equal text_field_tag("title", "Hello!", class: "admin"),
|
69
|
+
'<input class="admin" id="title" name="title" type="text" value="Hello!" />'
|
70
|
+
equal text_field_tag("title", "Hello!", size: 75),
|
71
|
+
'<input id="title" name="title" size="75" type="text" value="Hello!" />'
|
72
|
+
equal text_field_tag("title", "Hello!", disabled: true),
|
73
|
+
'<input disabled="disabled" id="title" name="title" type="text" value="Hello!" />'
|
74
|
+
equal text_field_tag("title", "Hello!", size: 70, maxlength: 80),
|
75
|
+
'<input id="title" maxlength="80" name="title" size="70" type="text" value="Hello!" />'
|
76
|
+
|
77
|
+
test "label_tag", ->
|
78
|
+
equal label_tag("title"), '<label for="title">Title</label>'
|
79
|
+
equal label_tag("title", "My Title"), '<label for="title">My Title</label>'
|
80
|
+
equal label_tag("title", "My Title", class: "small-label"), '<label class="small-label" for="title">My Title</label>'
|
81
|
+
equal label_tag( -> "Blocked" ), '<label>Blocked</label>'
|
82
|
+
equal label_tag("clock", -> "Grandfather"), '<label for="clock">Grandfather</label>'
|
83
|
+
equal label_tag("clock", id: "label_clock", -> "Grandfather"), '<label for="clock" id="label_clock">Grandfather</label>'
|
84
|
+
|
85
|
+
test "hidden_field_tag", ->
|
86
|
+
equal hidden_field_tag('id', 3), '<input id="id" name="id" type="hidden" value="3" />'
|
87
|
+
|
88
|
+
test "file_field_tag", ->
|
89
|
+
equal file_field_tag('picsplz'), '<input id="picsplz" name="picsplz" type="file" />'
|
90
|
+
equal file_field_tag('picsplz', class: 'pix'), '<input class="pix" id="picsplz" name="picsplz" type="file" />'
|
91
|
+
|
92
|
+
test "password_field_tag", ->
|
93
|
+
equal password_field_tag(), '<input id="password" name="password" type="password" />'
|
94
|
+
|
95
|
+
test "text_area_tag", ->
|
96
|
+
equal text_area_tag("body", "hello world", size: "20x40"),
|
97
|
+
'<textarea cols="20" id="body" name="body" rows="40">\nhello world</textarea>'
|
98
|
+
equal text_area_tag("body", "hello world", size: 20),
|
99
|
+
'<textarea id="body" name="body">\nhello world</textarea>'
|
100
|
+
equal text_area_tag("body", "<b>hello world</b>", size: "20x40"),
|
101
|
+
'<textarea cols="20" id="body" name="body" rows="40">\n<b>hello world</b></textarea>'
|
102
|
+
equal text_area_tag("body", "<b>hello world</b>", size: "20x40", escape: false),
|
103
|
+
'<textarea cols="20" id="body" name="body" rows="40">\n<b>hello world</b></textarea>'
|
104
|
+
equal text_area_tag("body", null, escape: false),
|
105
|
+
'<textarea id="body" name="body">\n</textarea>'
|
106
|
+
|
107
|
+
test "check_box_tag", ->
|
108
|
+
equal check_box_tag('admin'), '<input id="admin" name="admin" type="checkbox" value="1" />'
|
109
|
+
|
110
|
+
test "radio_button_tag", ->
|
111
|
+
equal radio_button_tag("people", "david"),
|
112
|
+
'<input id="people_david" name="people" type="radio" value="david" />'
|
113
|
+
equal radio_button_tag("num_people", 5),
|
114
|
+
'<input id="num_people_5" name="num_people" type="radio" value="5" />'
|
115
|
+
equal radio_button_tag("gender", "m") + radio_button_tag("gender", "f"),
|
116
|
+
'<input id="gender_m" name="gender" type="radio" value="m" /><input id="gender_f" name="gender" type="radio" value="f" />'
|
117
|
+
equal radio_button_tag("opinion", "-1") + radio_button_tag("opinion", "1"),
|
118
|
+
'<input id="opinion_-1" name="opinion" type="radio" value="-1" /><input id="opinion_1" name="opinion" type="radio" value="1" />'
|
119
|
+
equal radio_button_tag("person[gender]", "m"),
|
120
|
+
'<input id="person_gender_m" name="person[gender]" type="radio" value="m" />'
|
121
|
+
equal radio_button_tag('ctrlname', 'apache2.2'),
|
122
|
+
'<input id="ctrlname_apache2.2" name="ctrlname" type="radio" value="apache2.2" />'
|
123
|
+
|
124
|
+
test "submit_tag", ->
|
125
|
+
equal submit_tag("Save", onclick: "alert('hello!')", data: { disable_with: "Saving..." }),
|
126
|
+
'<input data-disable-with="Saving..." name="commit" onclick="alert('hello!')" type="submit" value="Save" />'
|
127
|
+
equal submit_tag("Save", data: { disable_with: "Saving..." }),
|
128
|
+
'<input data-disable-with="Saving..." name="commit" type="submit" value="Save" />'
|
129
|
+
equal submit_tag("Save", data: { confirm: "Are you sure?" }),
|
130
|
+
'<input data-confirm="Are you sure?" name="commit" type="submit" value="Save" />'
|
131
|
+
|
132
|
+
test "button_tag", ->
|
133
|
+
equal button_tag(),
|
134
|
+
'<button name="button" type="submit">Button</button>'
|
135
|
+
equal button_tag("Save", type: "submit"),
|
136
|
+
'<button name="button" type="submit">Save</button>'
|
137
|
+
equal button_tag("Button", type: "button"),
|
138
|
+
'<button name="button" type="button">Button</button>'
|
139
|
+
equal button_tag("Reset", type: "reset"),
|
140
|
+
'<button name="button" type="reset">Reset</button>'
|
141
|
+
equal button_tag("Reset", type: "reset", disabled: true),
|
142
|
+
'<button disabled="disabled" name="button" type="reset">Reset</button>'
|
143
|
+
equal button_tag("<b>Reset</b>", type: "reset", disabled: true),
|
144
|
+
'<button disabled="disabled" name="button" type="reset"><b>Reset</b></button>'
|
145
|
+
equal button_tag( -> 'Content' ),
|
146
|
+
'<button name="button" type="submit">Content</button>'
|
147
|
+
equal button_tag(name: 'temptation', type: 'button', -> content_tag('strong', 'Do not press me')),
|
148
|
+
'<button name="temptation" type="button"><strong>Do not press me</strong></button>'
|
149
|
+
equal button_tag("Save", type: "submit", data: { confirm: "Are you sure?" }),
|
150
|
+
'<button data-confirm="Are you sure?" name="button" type="submit">Save</button>'
|
151
|
+
|
152
|
+
test "image_submit_tag", ->
|
153
|
+
equal image_submit_tag("save.gif", data: { confirm: "Are you sure?" }),
|
154
|
+
'<input data-confirm="Are you sure?" src="/images/save.gif" type="image" />'
|
155
|
+
|
156
|
+
test "field_set_tag", ->
|
157
|
+
equal field_set_tag('Your details', -> 'Hello world!'),
|
158
|
+
'<fieldset><legend>Your details</legend>Hello world!</fieldset>'
|
159
|
+
equal field_set_tag(-> 'Hello world!'),
|
160
|
+
'<fieldset>Hello world!</fieldset>'
|
161
|
+
equal field_set_tag('', -> 'Hello world!'),
|
162
|
+
'<fieldset>Hello world!</fieldset>'
|
163
|
+
equal field_set_tag('', class: 'format', -> 'Hello world!'),
|
164
|
+
'<fieldset class="format">Hello world!</fieldset>'
|
165
|
+
equal field_set_tag(),
|
166
|
+
'<fieldset></fieldset>'
|
167
|
+
equal field_set_tag('You legend!'),
|
168
|
+
'<fieldset><legend>You legend!</legend></fieldset>'
|
169
|
+
|
170
|
+
test "different fields tags helpers", ->
|
171
|
+
equal color_field_tag("car"),
|
172
|
+
'<input id="car" name="car" type="color" />'
|
173
|
+
equal search_field_tag("query"),
|
174
|
+
'<input id="query" name="query" type="search" />'
|
175
|
+
equal telephone_field_tag("cell"),
|
176
|
+
'<input id="cell" name="cell" type="tel" />'
|
177
|
+
equal telephone_field_tag("cell"),
|
178
|
+
phone_field_tag("cell")
|
179
|
+
equal date_field_tag("cell"),
|
180
|
+
'<input id="cell" name="cell" type="date" />'
|
181
|
+
equal time_field_tag("cell"),
|
182
|
+
'<input id="cell" name="cell" type="time" />'
|
183
|
+
equal datetime_field_tag("appointment"),
|
184
|
+
'<input id="appointment" name="appointment" type="datetime" />'
|
185
|
+
equal datetime_local_field_tag("appointment"),
|
186
|
+
'<input id="appointment" name="appointment" type="datetime-local" />'
|
187
|
+
equal month_field_tag("birthday"),
|
188
|
+
'<input id="birthday" name="birthday" type="month" />'
|
189
|
+
equal week_field_tag("birthday"),
|
190
|
+
'<input id="birthday" name="birthday" type="week" />'
|
191
|
+
equal url_field_tag("homepage"),
|
192
|
+
'<input id="homepage" name="homepage" type="url" />'
|
193
|
+
equal email_field_tag("address"),
|
194
|
+
'<input id="address" name="address" type="email" />'
|
195
|
+
equal number_field_tag("quantity", null, in: {min: "1", max: "9"}),
|
196
|
+
'<input id="quantity" max="9" min="1" name="quantity" type="number" />'
|
197
|
+
equal range_field_tag("volume", null, in: {min: 0, max: 11}, step: 0.1),
|
198
|
+
'<input id="volume" max="11" min="0" name="volume" step="0.1" type="range" />'
|
199
|
+
|
200
|
+
test "boolean options", ->
|
201
|
+
equal check_box_tag("admin", 1, true, disabled: true, readonly: "yes"),
|
202
|
+
'<input checked="checked" disabled="disabled" id="admin" name="admin" readonly="readonly" type="checkbox" value="1" />'
|
203
|
+
equal check_box_tag("admin", 1, true, disabled: false, readonly: null),
|
204
|
+
'<input checked="checked" id="admin" name="admin" type="checkbox" value="1" />'
|
205
|
+
equal tag('input', type: "checkbox", checked: false),
|
206
|
+
'<input type="checkbox" />'
|
207
|
+
equal select_tag("people", "<option>david</option>", multiple: true),
|
208
|
+
'<select id="people" multiple="multiple" name="people[]"><option>david</option></select>'
|
209
|
+
equal select_tag("people[]", "<option>david</option>", multiple: true),
|
210
|
+
'<select id="people_" multiple="multiple" name="people[]"><option>david</option></select>'
|
211
|
+
equal select_tag("people", "<option>david</option>", multiple: null),
|
212
|
+
'<select id="people" name="people"><option>david</option></select>'
|
213
|
+
|
214
|
+
test "options side effects", ->
|
215
|
+
options = { option: "random_option" }
|
216
|
+
text_area_tag "body", "hello world", options
|
217
|
+
deepEqual options, { option: "random_option" }
|
218
|
+
submit_tag "submit value", options
|
219
|
+
deepEqual options, { option: "random_option" }
|
220
|
+
button_tag "button value", options
|
221
|
+
deepEqual options, { option: "random_option" }
|
222
|
+
image_submit_tag "submit source", options
|
223
|
+
deepEqual options, { option: "random_option" }
|
224
|
+
label_tag "submit source", "title", options
|
225
|
+
deepEqual options, { option: "random_option" }
|