da-js 0.0.1 → 0.0.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/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
- ## Version 0.0.1
1
+ ## Version 0.0.2
2
+ * Now supports forms generated by Formtastic.
3
+ * Return 'this' from formChangeTracker() to make it chainable.
2
4
 
5
+ ## Version 0.0.1
3
6
  * Initial Version
@@ -37,6 +37,7 @@ Feature: Change tracker for forms
37
37
  | Form | Element |
38
38
  | simple_form | form element and label |
39
39
  | scaffold_form | field container |
40
+ | formtastic | field container |
40
41
 
41
42
 
42
43
  Scenario: Radiobuttons in an empty simple form
@@ -92,6 +93,7 @@ Feature: Change tracker for forms
92
93
  | Form | Element |
93
94
  | simple_form | form element and label |
94
95
  | scaffold_form | field container |
96
+ | formtastic | field container |
95
97
 
96
98
 
97
99
  Scenario: Radiobuttons in an prefilled simple form
@@ -107,8 +109,8 @@ Feature: Change tracker for forms
107
109
  Then no form element and label should be marked as changed
108
110
 
109
111
 
110
- Scenario: Radiobuttons in an prefilled scaffold form
111
- Given an prefilled scaffold_form
112
+ Scenario Outline: Radiobuttons in an prefilled form
113
+ Given an prefilled <Form>
112
114
  Then no form element and label should be marked as changed
113
115
 
114
116
  When I choose the second radiobutton
@@ -116,4 +118,8 @@ Feature: Change tracker for forms
116
118
 
117
119
  When I choose the first radiobutton
118
120
  Then no form element and label should be marked as changed
119
-
121
+
122
+ Examples:
123
+ | Form |
124
+ | scaffold_form |
125
+ | formtastic |
@@ -1,10 +1,24 @@
1
+ RSpec::Matchers.define :be_marked_as_changed do
2
+ match do |element|
3
+ element["class"].split(" ").include?("changed")
4
+ end
5
+ end
6
+
1
7
  def find_element_and_label(element)
2
8
  id = "#{@form}_#{element}"
3
9
  [find("##{@form} ##{id}"), find("##{@form} label[for='#{id}']")]
4
10
  end
5
11
 
6
12
  def find_container(element)
7
- find(:xpath, "//form[@id='#{@form}']//div[contains(@class, 'field')][*[@id='#{@form}_#{element}']]")
13
+ container = case @form
14
+ when /^scaffold_form/ then "div[contains(@class, 'field')]"
15
+ when /^formtastic/ then "li[contains(@class, 'input')]"
16
+ else raise "I don't know about '#{@form}' forms ..."
17
+ end
18
+ within "##{@form}" do
19
+ element_id = find_field(element)["id"]
20
+ find :xpath, ".//#{container}[.//*[@id='#{element_id}']]"
21
+ end
8
22
  end
9
23
 
10
24
  Given /^an? (empty|prefilled) (\w+)$/ do |type, form|
@@ -72,7 +86,7 @@ end
72
86
  Then /^no form element and label should be marked as changed$/ do
73
87
  within "##{@form}" do
74
88
  all("input,textarea,select,label").each do |element|
75
- element["class"].should_not include("changed")
89
+ element.should_not be_marked_as_changed
76
90
  end
77
91
  end
78
92
  end
@@ -80,7 +94,7 @@ end
80
94
  Then /^no field container should be marked as changed$/ do
81
95
  within "##{@form}" do
82
96
  all(".field").each do |element|
83
- element["class"].should_not include("changed")
97
+ element.should_not be_marked_as_changed
84
98
  end
85
99
  end
86
100
  end
@@ -89,40 +103,40 @@ Then /^the (first|second|third) radiobutton's form element and label should( not
89
103
  button = (which == "first" ? "1" : (which == "second" ? "2" : "3"))
90
104
  element, label = find_element_and_label("radiobutton_#{button}")
91
105
  if no_longer
92
- element["class"].should_not include("changed")
93
- label["class"].should_not include("changed")
106
+ element.should_not be_marked_as_changed
107
+ label.should_not be_marked_as_changed
94
108
  else
95
- element["class"].should include("changed")
96
- label["class"].should include("changed")
109
+ element.should be_marked_as_changed
110
+ label.should be_marked_as_changed
97
111
  end
98
112
  end
99
113
 
100
114
  Then /^the (first|second|third) radiobutton's field container should( not| no longer)? be marked as changed$/ do |which, no_longer|
101
115
  button = (which == "first" ? "1" : (which == "second" ? "2" : "3"))
102
- container = find_container("radiobutton_#{button}")
116
+ container = find_container("radiobutton #{button}")
103
117
  if no_longer
104
- container["class"].should_not include("changed")
118
+ container.should_not be_marked_as_changed
105
119
  else
106
- container["class"].should include("changed")
120
+ container.should be_marked_as_changed
107
121
  end
108
122
  end
109
123
 
110
124
  Then /^the (\w+)'s form element and label should( no longer)? be marked as changed$/ do |element, no_longer|
111
125
  element, label = find_element_and_label(element)
112
126
  if no_longer
113
- element["class"].should_not include("changed")
114
- label["class"].should_not include("changed")
127
+ element.should_not be_marked_as_changed
128
+ label.should_not be_marked_as_changed
115
129
  else
116
- element["class"].should include("changed")
117
- label["class"].should include("changed")
130
+ element.should be_marked_as_changed
131
+ label.should be_marked_as_changed
118
132
  end
119
133
  end
120
134
 
121
135
  Then /^the (\w+)'s field container should( no longer)? be marked as changed$/ do |element, no_longer|
122
136
  container = find_container(element)
123
137
  if no_longer
124
- container["class"].should_not include("changed")
138
+ container.should_not be_marked_as_changed
125
139
  else
126
- container["class"].should include("changed")
140
+ container.should be_marked_as_changed
127
141
  end
128
142
  end
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <title>Test</title>
5
5
  <%= "<script src='../vendor/jquery-#{@jquery_version}.js'></script>" %>
6
- <script src="/assets/javascripts/da.js"></script>
6
+ <script src="/assets/javascripts/da-js.js"></script>
7
7
  <style type="text/css">
8
8
  form {
9
9
  background: #eee;
@@ -143,6 +143,127 @@
143
143
  </div>
144
144
  </form>
145
145
 
146
+ <form accept-charset="UTF-8" action="" id="formtastic" novalidate="novalidate">
147
+ <h2>Formtastic Form</h2>
148
+ <p>
149
+ A form generated by <a href="https://github.com/justinfrench/formtastic">Formtastic</a>.
150
+ </p>
151
+ <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="XKE2QlUw7L5WK3oez+nORpWaoGb76jO/8gPEEZlELm0="></div>
152
+ <fieldset class="inputs">
153
+ <ol>
154
+ <li class="string input optional stringish" id="formtastic_textfield_input">
155
+ <label class=" label" for="formtastic_textfield">textfield</label>
156
+ <input id="formtastic_textfield" maxlength="255" name="formtastic[textfield]" type="text">
157
+ </li>
158
+ <li class="text input optional" id="formtastic_textarea_input">
159
+ <label class=" label" for="formtastic_textarea">textarea</label>
160
+ <textarea id="formtastic_textarea" name="formtastic[textarea]" rows="20"></textarea>
161
+ </li>
162
+ <li class="check_boxes input optional" id="formtastic_checkbox_input">
163
+ <fieldset class="choices">
164
+ <legend class="label"><label>checkbox</label></legend>
165
+ <input id="formtastic_checkbox_none" name="formtastic[checkbox][]" type="hidden" value="">
166
+ <ol class="choices-group">
167
+ <li class="choice">
168
+ <label for="formtastic_checkbox_1">
169
+ <input id="formtastic_checkbox_1" name="formtastic[checkbox][]" type="checkbox" value="1">checkbox
170
+ </label>
171
+ </li>
172
+ </ol>
173
+ </fieldset>
174
+ </li>
175
+ <li class="radio input optional" id="formtastic_radiobutton_input">
176
+ <fieldset class="choices"><legend class="label"><label>radiobuttons</label></legend>
177
+ <ol class="choices-group">
178
+ <li class="choice">
179
+ <label for="formtastic_radiobutton_1">
180
+ <input id="formtastic_radiobutton_1" name="formtastic[radiobutton]" type="radio" value="1">radiobutton 1
181
+ </label>
182
+ </li>
183
+ <li class="choice">
184
+ <label for="formtastic_radiobutton_2">
185
+ <input id="formtastic_radiobutton_2" name="formtastic[radiobutton]" type="radio" value="2">radiobutton 2
186
+ </label>
187
+ </li>
188
+ <li class="choice">
189
+ <label for="formtastic_radiobutton_3">
190
+ <input id="formtastic_radiobutton_3" name="formtastic[radiobutton]" type="radio" value="3">radiobutton 3
191
+ </label>
192
+ </li>
193
+ </ol>
194
+ </fieldset>
195
+ </li>
196
+ <li class="select input optional" id="formtastic_select_input">
197
+ <label class=" label" for="formtastic_select">select</label>
198
+ <select id="formtastic_select" name="formtastic[select]">
199
+ <option value=""></option>
200
+ <option value="1">option 1</option>
201
+ <option value="2">option 2</option>
202
+ </select>
203
+ </li>
204
+ </ol>
205
+ </fieldset>
206
+ </form>
207
+
208
+ <form accept-charset="UTF-8" action="" id="formtastic_prefilled" novalidate="novalidate">
209
+ <h2>Formtastic Form (prefilled)</h2>
210
+ <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="XKE2QlUw7L5WK3oez+nORpWaoGb76jO/8gPEEZlELm0="></div>
211
+ <fieldset class="inputs">
212
+ <ol>
213
+ <li class="string input optional stringish" id="formtastic_prefilled_textfield_input">
214
+ <label class=" label" for="formtastic_prefilled_textfield">textfield</label>
215
+ <input id="formtastic_prefilled_textfield" maxlength="255" name="formtastic_prefilled[textfield]" type="text" value="text">
216
+ </li>
217
+ <li class="text input optional" id="formtastic_prefilled_textarea_input">
218
+ <label class=" label" for="formtastic_prefilled_textarea">textarea</label>
219
+ <textarea id="formtastic_prefilled_textarea" name="formtastic_prefilled[textarea]" rows="20">text</textarea>
220
+ </li>
221
+ <li class="check_boxes input optional" id="formtastic_prefilled_checkbox_input">
222
+ <fieldset class="choices">
223
+ <legend class="label"><label>checkbox</label></legend>
224
+ <input id="formtastic_prefilled_checkbox_none" name="formtastic_prefilled[checkbox][]" type="hidden" value="">
225
+ <ol class="choices-group">
226
+ <li class="choice">
227
+ <label for="formtastic_prefilled_checkbox_1">
228
+ <input id="formtastic_prefilled_checkbox_1" name="formtastic_prefilled[checkbox][]" type="checkbox" value="1" checked>checkbox
229
+ </label>
230
+ </li>
231
+ </ol>
232
+ </fieldset>
233
+ </li>
234
+ <li class="radio input optional" id="formtastic_prefilled_radiobutton_input">
235
+ <fieldset class="choices"><legend class="label"><label>radiobuttons</label></legend>
236
+ <ol class="choices-group">
237
+ <li class="choice">
238
+ <label for="formtastic_prefilled_radiobutton_1">
239
+ <input id="formtastic_prefilled_radiobutton_1" name="formtastic_prefilled[radiobutton]" type="radio" value="1" checked>radiobutton 1
240
+ </label>
241
+ </li>
242
+ <li class="choice">
243
+ <label for="formtastic_prefilled_radiobutton_2">
244
+ <input id="formtastic_prefilled_radiobutton_2" name="formtastic_prefilled[radiobutton]" type="radio" value="2">radiobutton 2
245
+ </label>
246
+ </li>
247
+ <li class="choice">
248
+ <label for="formtastic_prefilled_radiobutton_3">
249
+ <input id="formtastic_prefilled_radiobutton_3" name="formtastic_prefilled[radiobutton]" type="radio" value="3">radiobutton 3
250
+ </label>
251
+ </li>
252
+ </ol>
253
+ </fieldset>
254
+ </li>
255
+ <li class="select input optional" id="formtastic_prefilled_select_input">
256
+ <label class=" label" for="formtastic_prefilled_select">select</label>
257
+ <select id="formtastic_prefilled_select" name="formtastic_prefilled[select]">
258
+ <option value=""></option>
259
+ <option value="1" selected>option 1</option>
260
+ <option value="2">option 2</option>
261
+ </select>
262
+ </li>
263
+ </ol>
264
+ </fieldset>
265
+ </form>
266
+
146
267
  <script>
147
268
  $("form").formChangeTracker();
148
269
  </script>
@@ -4,13 +4,13 @@
4
4
  // Usage:
5
5
  // $("#myform").formChangeTracker();
6
6
  //
7
- // If the form element is wrapped in an element with the class "field", the class "changed" is set/reset on this wrapper element. Otherwise, "changed" is set/reset on the form element itself and its label (if present).
7
+ // If the form element is wrapped in an element with the class "field" (rails scaffold) or "input" (formtastic), the class "changed" is set/reset on this wrapper element. Otherwise, "changed" is set/reset on the form element itself and its label (if present).
8
8
 
9
9
  $.fn.formChangeTracker = function() {
10
10
 
11
11
  var elementSelector = "input[type!=hidden],textarea,select";
12
12
 
13
- this.each(function() {
13
+ return this.each(function() {
14
14
 
15
15
  var form = $(this);
16
16
  saveInitialValues(elementSelector);
@@ -50,8 +50,8 @@
50
50
 
51
51
  // Return the element(s) on that the "changed" class should be set/removed.
52
52
  function targetsForElement(element) {
53
- // use wrapping element with class .field if present ...
54
- var targets = $(element).closest("form .field");
53
+ // use wrapping element with class .field or .input (formtastic) if present ...
54
+ var targets = $(element).closest("form .field, form .input");
55
55
 
56
56
  // ... or fallback to the form element itself (and its label)
57
57
  if (targets.length == 0) targets = $(element).add("label[for=" + element.id + "]");
data/lib/da-js/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Da
2
2
  module Js
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: da-js
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Stefan Daschek