@@ -99,6 +99,7 @@ group :development, :test do |
||
| 99 | 99 |
gem 'rspec', '~> 3.0' |
| 100 | 100 |
gem 'rspec-collection_matchers', '~> 1.0.0' |
| 101 | 101 |
gem 'rspec-rails', '~> 3.0.1' |
| 102 |
+ gem 'rspec-html-matchers', '~> 0.6.1' |
|
| 102 | 103 |
gem 'shoulda-matchers' |
| 103 | 104 |
gem 'spring' |
| 104 | 105 |
gem 'spring-commands-rspec' |
@@ -310,6 +310,9 @@ GEM |
||
| 310 | 310 |
rspec-expectations (3.0.4) |
| 311 | 311 |
diff-lcs (>= 1.2.0, < 2.0) |
| 312 | 312 |
rspec-support (~> 3.0.0) |
| 313 |
+ rspec-html-matchers (0.6.1) |
|
| 314 |
+ nokogiri (~> 1) |
|
| 315 |
+ rspec (~> 3) |
|
| 313 | 316 |
rspec-mocks (3.0.4) |
| 314 | 317 |
rspec-support (~> 3.0.0) |
| 315 | 318 |
rspec-rails (3.0.2) |
@@ -497,6 +500,7 @@ DEPENDENCIES |
||
| 497 | 500 |
rr |
| 498 | 501 |
rspec (~> 3.0) |
| 499 | 502 |
rspec-collection_matchers (~> 1.0.0) |
| 503 |
+ rspec-html-matchers (~> 0.6.1) |
|
| 500 | 504 |
rspec-rails (~> 3.0.1) |
| 501 | 505 |
rturk (~> 2.12.1) |
| 502 | 506 |
ruby-growl (~> 4.1.0) |
@@ -5,6 +5,7 @@ |
||
| 5 | 5 |
#= require select2 |
| 6 | 6 |
#= require json2 |
| 7 | 7 |
#= require jquery.json-editor |
| 8 |
+#= require jquery.serializeObject |
|
| 8 | 9 |
#= require latlon_and_geo |
| 9 | 10 |
#= require spectrum |
| 10 | 11 |
#= require_tree ./components |
@@ -1,16 +1,4 @@ |
||
| 1 | 1 |
$ -> |
| 2 |
- $.fn.serializeObject = -> |
|
| 3 |
- o = {}
|
|
| 4 |
- a = @serializeArray() |
|
| 5 |
- $.each a, -> |
|
| 6 |
- if o[@name] isnt `undefined` |
|
| 7 |
- o[@name] = [o[@name]] unless o[@name].push |
|
| 8 |
- o[@name].push @value or "" |
|
| 9 |
- else |
|
| 10 |
- o[@name] = @value or "" |
|
| 11 |
- return |
|
| 12 |
- o |
|
| 13 |
- |
|
| 14 | 2 |
getFormData = (elem) -> |
| 15 | 3 |
form_data = $("#edit_agent, #new_agent").serializeObject()
|
| 16 | 4 |
attribute = $(elem).data('attribute')
|
@@ -22,7 +10,7 @@ $ -> |
||
| 22 | 10 |
returnedResults = {}
|
| 23 | 11 |
completableDefaultOptions = (input) -> |
| 24 | 12 |
results: [ |
| 25 |
- (returnedResults[$(input).data('attribute')] || {text: 'Options', children: [{id: '', text: 'loading ...'}]})
|
|
| 13 |
+ (returnedResults[$(input).data('attribute')] || {text: 'Options', children: [{id: '', text: 'loading ...'}]}),
|
|
| 26 | 14 |
{
|
| 27 | 15 |
text: 'Current', |
| 28 | 16 |
children: [id: $(input).val(), text: $(input).val()] |
@@ -68,7 +56,6 @@ $ -> |
||
| 68 | 56 |
type: 'POST', |
| 69 | 57 |
data: form_data |
| 70 | 58 |
success: (data) -> |
| 71 |
- console.log data |
|
| 72 | 59 |
returnedResults[form_data.attribute] = {text: 'Options', children: $.map(data, (d) -> {id: d.value, text: d.name})}
|
| 73 | 60 |
$(e.currentTarget).trigger('change')
|
| 74 | 61 |
$(e.currentTarget).select2('open')
|
@@ -0,0 +1,40 @@ |
||
| 1 |
+require 'spec_helper' |
|
| 2 |
+ |
|
| 3 |
+describe FormConfigurableAgentPresenter do |
|
| 4 |
+ class FormConfigurableAgentPresenterAgent < Agent |
|
| 5 |
+ include FormConfigurable |
|
| 6 |
+ |
|
| 7 |
+ form_configurable :string, roles: :validatable |
|
| 8 |
+ form_configurable :text, type: :text, roles: :completable |
|
| 9 |
+ form_configurable :boolean, type: :boolean |
|
| 10 |
+ form_configurable :array, type: :array, values: [1, 2, 3] |
|
| 11 |
+ end |
|
| 12 |
+ |
|
| 13 |
+ before(:all) do |
|
| 14 |
+ @presenter = FormConfigurableAgentPresenter.new(FormConfigurableAgentPresenterAgent.new, ActionController::Base.new.view_context) |
|
| 15 |
+ end |
|
| 16 |
+ |
|
| 17 |
+ it "works for the type :string" do |
|
| 18 |
+ expect(@presenter.option_field_for(:string)).to( |
|
| 19 |
+ have_tag('input', with: {:'data-attribute' => 'string', role: 'validatable', type: 'text', name: 'agent[options][string]'})
|
|
| 20 |
+ ) |
|
| 21 |
+ end |
|
| 22 |
+ |
|
| 23 |
+ it "works for the type :text" do |
|
| 24 |
+ expect(@presenter.option_field_for(:text)).to( |
|
| 25 |
+ have_tag('textarea', with: {:'data-attribute' => 'text', role: 'completable', name: 'agent[options][text]'})
|
|
| 26 |
+ ) |
|
| 27 |
+ end |
|
| 28 |
+ |
|
| 29 |
+ it "works for the type :boolean" do |
|
| 30 |
+ expect(@presenter.option_field_for(:boolean)).to( |
|
| 31 |
+ have_tag('input', with: {:'data-attribute' => 'boolean', role: '', name: 'agent[options][boolean]', type: 'radio'})
|
|
| 32 |
+ ) |
|
| 33 |
+ end |
|
| 34 |
+ |
|
| 35 |
+ it "works for the type :boolean" do |
|
| 36 |
+ expect(@presenter.option_field_for(:array)).to( |
|
| 37 |
+ have_tag('select', with: {:'data-attribute' => 'array', role: '', name: 'agent[options][array]'})
|
|
| 38 |
+ ) |
|
| 39 |
+ end |
|
| 40 |
+end |
@@ -0,0 +1,40 @@ |
||
| 1 |
+// |
|
| 2 |
+// Use internal $.serializeArray to get list of form elements which is |
|
| 3 |
+// consistent with $.serialize |
|
| 4 |
+// |
|
| 5 |
+// From version 2.0.0, $.serializeObject will stop converting [name] values |
|
| 6 |
+// to camelCase format. This is *consistent* with other serialize methods: |
|
| 7 |
+// |
|
| 8 |
+// - $.serialize |
|
| 9 |
+// - $.serializeArray |
|
| 10 |
+// |
|
| 11 |
+// If you require camel casing, you can either download version 1.0.4 or map |
|
| 12 |
+// them yourself. |
|
| 13 |
+// |
|
| 14 |
+ |
|
| 15 |
+(function($){
|
|
| 16 |
+ $.fn.serializeObject = function () {
|
|
| 17 |
+ "use strict"; |
|
| 18 |
+ |
|
| 19 |
+ var result = {};
|
|
| 20 |
+ var extend = function (i, element) {
|
|
| 21 |
+ var node = result[element.name]; |
|
| 22 |
+ |
|
| 23 |
+ // If node with same name exists already, need to convert it to an array as it |
|
| 24 |
+ // is a multi-value field (i.e., checkboxes) |
|
| 25 |
+ |
|
| 26 |
+ if ('undefined' !== typeof node && node !== null) {
|
|
| 27 |
+ if ($.isArray(node)) {
|
|
| 28 |
+ node.push(element.value); |
|
| 29 |
+ } else {
|
|
| 30 |
+ result[element.name] = [node, element.value]; |
|
| 31 |
+ } |
|
| 32 |
+ } else {
|
|
| 33 |
+ result[element.name] = element.value; |
|
| 34 |
+ } |
|
| 35 |
+ }; |
|
| 36 |
+ |
|
| 37 |
+ $.each(this.serializeArray(), extend); |
|
| 38 |
+ return result; |
|
| 39 |
+ }; |
|
| 40 |
+})(jQuery); |