simple_form-dojo 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +90 -0
- data/Rakefile +35 -0
- data/lib/simple_form-dojo/dojo_props_methods.rb +52 -0
- data/lib/simple_form-dojo/form_builder.rb +218 -0
- data/lib/simple_form-dojo/helpers/form_helper.rb +32 -0
- data/lib/simple_form-dojo/helpers/tabs_helper.rb +79 -0
- data/lib/simple_form-dojo/inputs/boolean_input.rb +19 -0
- data/lib/simple_form-dojo/inputs/collection_input.rb +41 -0
- data/lib/simple_form-dojo/inputs/currency_input.rb +9 -0
- data/lib/simple_form-dojo/inputs/date_time_input.rb +27 -0
- data/lib/simple_form-dojo/inputs/mapping_input.rb +43 -0
- data/lib/simple_form-dojo/inputs/numeric_input.rb +48 -0
- data/lib/simple_form-dojo/inputs/password_input.rb +30 -0
- data/lib/simple_form-dojo/inputs/string_input.rb +39 -0
- data/lib/simple_form-dojo/inputs/text_input.rb +33 -0
- data/lib/simple_form-dojo/inputs.rb +12 -0
- data/lib/simple_form-dojo/version.rb +3 -0
- data/lib/simple_form-dojo.rb +12 -0
- metadata +247 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OWQ5YmFjNTBlNTZmY2JmN2E3YmRiY2Q1OWFmYWYxMDZjMWU5NWZhNw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OWQ0Y2JkMWZmMWFkZDczYmY2YTY4Nzk0NTEyMDM4MDMwM2RiZDM5Yg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Njg0NjE1MWFmNDM1NDY2YWMzZjkzMDBkYjEzOTEzOTljNTNiMTdjYmI4OGJh
|
10
|
+
M2ZmMzdhMzg4MDljOWI2NWZhNjdlODY3MGIyMWMwNmMyOGNhNmMzZjE3MTQ1
|
11
|
+
MzEwNzNlYjkzMjNlNGVlOTM0NmVmMGFiMjg0M2VlNDNhNjVjMjk=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OTI5NjIzYzYwYmY3NDg2YjRmNzkxNjNiYTIyOGZiNTFiYWY3ZmM5ZGM5Y2Nl
|
14
|
+
MzU5MTViNjI5NjI1YmRmYjA0NTcyODI3NjZkMGFhOTVmMDMxMThhMDM3ZDk3
|
15
|
+
OGZiODZlYmE0N2ZmNjE2YWJjYTkzMjI0N2I1NDU3MTlmMWZmOTk=
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2011 Patrick Ward
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# SimpleFormDojo
|
2
|
+
|
3
|
+
SimpleFormDojo is a collection of helpers for use with [Dojo](http://dojotoolkit.org) and [Rails](http://rubyonrails.org). The goal of the project is to make it simple to create Dijit elements using the existing Rails helper infrastructure.
|
4
|
+
|
5
|
+
The FormBuilder is currently an extension to the [SimpleForm project](https://github.com/plataformatec/simple_form) from [Plataforma](http://blog.plataformatec.com.br/tag/simple_form).
|
6
|
+
|
7
|
+
The TabsHelper was inspired by code from CodeOfficer's [JQuery UI Helpers](https://github.com/CodeOfficer/jquery-ui-rails-helpers)
|
8
|
+
|
9
|
+
## Requirements
|
10
|
+
|
11
|
+
SimpleFormDojo is based on Dojo 1.6.0 and uses the newer data-dojo-type and data-dojo-props attributes in order to be more compliant with HTML 5. It is being developed against the latest version of Rails (currently 3.0.5).
|
12
|
+
|
13
|
+
I don't include the 1.6 dojo toolkit files in the git repository. So, to run the dummy test rails environment you'll need to [grab a copy](http://download.dojotoolkit.org/) of the toolkit files and place them in the spec/dummy/public/javascripts/ directory to run the physical rails tests and see the generated markup correctly.
|
14
|
+
|
15
|
+
## SimpleFormDojo::FormBuilder
|
16
|
+
|
17
|
+
Documentation is TBD, but in general, it works the same way that simple_form works:
|
18
|
+
|
19
|
+
<%= dojo_form_for(@user, :html => { :id => 'userForm' } ) do |f| %>
|
20
|
+
<%= f.error_messages %>
|
21
|
+
<%= f.input :username %>
|
22
|
+
<%= f.input :name %>
|
23
|
+
<%= f.input :email %>
|
24
|
+
<%= f.input :pay_rate, :as => :currency,
|
25
|
+
:dojo_html => { :promptMessage => 'Invalid Amount'
|
26
|
+
:currency => 'USD' }%>
|
27
|
+
<%= f.association :roles, :as => :check_boxes %>
|
28
|
+
<%= f.association :departments, :multiple => true %>
|
29
|
+
<%= f.input :created_at %>
|
30
|
+
<%= f.input :activated, :label => 'Active?', :as => :radio
|
31
|
+
<% end %>
|
32
|
+
|
33
|
+
### Dijit objects currently included in SimpleFormDojo::FormBuilder
|
34
|
+
|
35
|
+
* dijit/form/CurrencyTextBox
|
36
|
+
* dijit/form/DateTextBox
|
37
|
+
* dijit/form/NumberTextBox
|
38
|
+
* dijit/form/SimpleTextarea
|
39
|
+
* dijit/form/Textarea
|
40
|
+
* dijit/form/TextBox
|
41
|
+
* dijit/form/ValidationTextBox
|
42
|
+
* dijit/form/MultiSelect (using option tags only - stores not implemented yet)
|
43
|
+
* dijit/form/FilteringSelect (using options tags only - stores not implemented yet)
|
44
|
+
* dijit/form/Button
|
45
|
+
* dijit/form/CheckBox
|
46
|
+
* dijit/form/Form
|
47
|
+
* dijit/form/RadioButton
|
48
|
+
|
49
|
+
## SimpleFormDojo::Helpers::TabsHelper
|
50
|
+
|
51
|
+
The tabs helper creates markup for dijit.layout.TabContainer.
|
52
|
+
|
53
|
+
<%= dojo_tabs_for do |tab| %>
|
54
|
+
<%= tab.create('Tab Title One') do %>
|
55
|
+
#... tab contents
|
56
|
+
<% end %>
|
57
|
+
<%= tab.create('Tab Title Two') do %>
|
58
|
+
#... tab contents
|
59
|
+
<% end %>
|
60
|
+
<% end %>
|
61
|
+
|
62
|
+
**generates...**
|
63
|
+
|
64
|
+
<div data-dojo-props="doLayout:false" data-dojo-type="dijit.layout.TabContainer" id="tabs">
|
65
|
+
<div data-dojo-props="title:'Tab Title One'" data-dojo-type="dijit.layout.ContentPane">
|
66
|
+
#... tab contents
|
67
|
+
</div>
|
68
|
+
<div data-dojo-props="title:'Tab Title Two'" data-dojo-type="dijit.layout.ContentPane">
|
69
|
+
#... tab contents
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
|
73
|
+
Tabs are rendered in the order you create them.
|
74
|
+
|
75
|
+
Render tabs conditionally by appending a condition to the end of the 'create' block:
|
76
|
+
|
77
|
+
<%= tab.create('Conditional Tab') do %>
|
78
|
+
#... tab contents
|
79
|
+
<% end unless @current_user.nil? %>
|
80
|
+
|
81
|
+
Pass additional HTML options to either the parent DIV or any child tab's:
|
82
|
+
|
83
|
+
<%= dojo_tabs_for(:id => 'my-id', :class => 'new-class', :data-dojo-props => 'doLayout:true') do |tab| %>
|
84
|
+
<%= tab.create('Tab Title One', :style => 'color: #00f') do %>
|
85
|
+
#... tab contents
|
86
|
+
<% end %>
|
87
|
+
<% end %>
|
88
|
+
|
89
|
+
The default DOM ID for the parent div is 'id="tabs"' unless you pass an HTML option with a different value.
|
90
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rake'
|
10
|
+
require 'rdoc/task'
|
11
|
+
|
12
|
+
require 'rspec/core'
|
13
|
+
require 'rspec/core/rake_task'
|
14
|
+
|
15
|
+
RSpec::Core::RakeTask.new(:spec)
|
16
|
+
|
17
|
+
task :default => :spec
|
18
|
+
|
19
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = 'rdoc'
|
21
|
+
rdoc.title = 'SimpleFormDojo'
|
22
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
23
|
+
rdoc.rdoc_files.include('README.rdoc')
|
24
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Run watchr"
|
28
|
+
task :watchr do
|
29
|
+
sh %{bundle exec watchr .watchr}
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Open an irb session preloaded with this library"
|
33
|
+
task :console do
|
34
|
+
sh "irb -rubygems -r ./lib/simple_form-dojo.rb"
|
35
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module DojoPropsMethods
|
3
|
+
##
|
4
|
+
# Retrieves and merges all dojo_props
|
5
|
+
def get_and_merge_dojo_props!
|
6
|
+
add_dojo_options_to_dojo_props
|
7
|
+
if object.id.present?
|
8
|
+
add_dojo_compliant_id
|
9
|
+
else
|
10
|
+
input_html_options["id"] = nil #let dojo generate internal id
|
11
|
+
end
|
12
|
+
input_html_options[:'data-dojo-props'] = SimpleFormDojo::FormBuilder.encode_as_dojo_props(@dojo_props) if !@dojo_props.blank?
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
##
|
18
|
+
# Retrieves dojo props from :dojo_html => {} options
|
19
|
+
def add_dojo_options_to_dojo_props
|
20
|
+
@dojo_props ||= {}
|
21
|
+
@dojo_props.merge!(html_options_for(:dojo, []))
|
22
|
+
end
|
23
|
+
|
24
|
+
def tag_id index = nil
|
25
|
+
id = sanitized_object_name
|
26
|
+
id << "_#{object.id}"
|
27
|
+
id << index if index
|
28
|
+
id << "_#{sanitized_attribute_name}"
|
29
|
+
id
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_dojo_compliant_id
|
33
|
+
opts = input_html_options
|
34
|
+
if opts.has_key?("index")
|
35
|
+
opts["id"] = opts.fetch("id"){ tag_id opts["index"] }
|
36
|
+
opts.delete("index")
|
37
|
+
elsif defined?(@auto_index)
|
38
|
+
opts["id"] = opts.fetch("id"){ tag_id @auto_index }
|
39
|
+
else
|
40
|
+
opts["id"] = opts.fetch("id"){ tag_id }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def sanitized_attribute_name
|
45
|
+
@sanitized_attribute_name ||= attribute_name.to_s.sub(/\?$/,"")
|
46
|
+
end
|
47
|
+
|
48
|
+
def sanitized_object_name
|
49
|
+
@sanitized_object_name ||= object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
class FormBuilder < SimpleForm::FormBuilder
|
3
|
+
include SimpleFormDojo::Inputs
|
4
|
+
# need to include this in order to
|
5
|
+
# get the html_escape method
|
6
|
+
include ERB::Util
|
7
|
+
|
8
|
+
attr_accessor :dojo_props
|
9
|
+
|
10
|
+
map_type :currency, :to => SimpleFormDojo::Inputs::CurrencyInput
|
11
|
+
map_type :date, :time, :datetime, :to => SimpleFormDojo::Inputs::DateTimeInput
|
12
|
+
map_type :select, :radio_buttons, :check_boxes, :to => SimpleFormDojo::Inputs::CollectionInput
|
13
|
+
map_type :integer, :decimal, :float, :to => SimpleFormDojo::Inputs::NumericInput
|
14
|
+
#map_type :password, :text, :text_simple, :file, :to => SimpleFormDojo::Inputs::MappingInput
|
15
|
+
map_type :string, :email, :search, :tel, :url, :to => SimpleFormDojo::Inputs::StringInput
|
16
|
+
map_type :text, :text_simple, :to => SimpleFormDojo::Inputs::TextInput
|
17
|
+
map_type :password, :to => SimpleFormDojo::Inputs::PasswordInput
|
18
|
+
map_type :boolean, :to => SimpleFormDojo::Inputs::BooleanInput
|
19
|
+
|
20
|
+
# Simple override of initializer in order to add in the dojo_props attribute
|
21
|
+
def initialize(object_name, object, template, options, proc)
|
22
|
+
@dojo_props = nil
|
23
|
+
super(object_name, object, template, options, proc)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Creates a button
|
27
|
+
#
|
28
|
+
# overrides simple_form's button method
|
29
|
+
#
|
30
|
+
# dojo_form_for @user do |f|
|
31
|
+
# f.button :submit, :value => 'Save Me'
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# To use dojox/form/BusyButton, pass :busy => true
|
35
|
+
# dojo_form_for @uswer do |f|
|
36
|
+
# f.button :submit, :busy => true, :value => 'Save Me'
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# If :value doesn't exist, tries to determine the
|
40
|
+
# the value based on the current object
|
41
|
+
def button(type, *args, &block)
|
42
|
+
# set options to value if first arg is a Hash
|
43
|
+
options = args.extract_options!
|
44
|
+
button_type = 'dijit/form/Button'
|
45
|
+
button_type = 'dojox/form/BusyButton' if options[:busy]
|
46
|
+
options.reverse_merge!(:'data-dojo-type' => button_type)
|
47
|
+
content = ''
|
48
|
+
if value = options.delete(:value)
|
49
|
+
content = value.html_safe
|
50
|
+
else
|
51
|
+
content = button_default_value
|
52
|
+
end
|
53
|
+
options.reverse_merge!({ :type => type, :value => content })
|
54
|
+
dojo_props = {}
|
55
|
+
dojo_props.merge!(options[:dojo_html]) if options.include?(:dojo_html)
|
56
|
+
options[:'data-dojo-props'] = SimpleFormDojo::FormBuilder.encode_as_dojo_props(dojo_props)
|
57
|
+
options[:class] = "button #{options[:class]}".strip
|
58
|
+
template.content_tag(:button, content, *(args << options), &block)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Basically the same as rails submit_default_value
|
62
|
+
def button_default_value
|
63
|
+
obj = object.respond_to?(:to_model) ? object.to_model : object
|
64
|
+
key = obj ? (obj.persisted? ? :edit : :new) : :submit
|
65
|
+
model = if obj.class.respond_to?(:model_name)
|
66
|
+
obj.class.model_name.human
|
67
|
+
else
|
68
|
+
object_name.to_s.humanize
|
69
|
+
end
|
70
|
+
|
71
|
+
defaults = []
|
72
|
+
defaults << "helpers.submit.#{object_name}.#{key}"
|
73
|
+
defaults << "#{key.to_s.humanize} #{model}"
|
74
|
+
|
75
|
+
I18n.t(defaults.shift, :default => defaults)
|
76
|
+
end
|
77
|
+
|
78
|
+
def dojo_collection_radio_buttons(attribute, collection, value_method,
|
79
|
+
text_method, options={}, html_options={})
|
80
|
+
rendered_collection = render_collection(
|
81
|
+
collection, value_method, text_method, options, html_options
|
82
|
+
) do |item, value, text, default_html_options|
|
83
|
+
local_dojo_props = @dojo_props.dup
|
84
|
+
|
85
|
+
## Checked?
|
86
|
+
#if values_are_equal?(local_dojo_props[:value], value)
|
87
|
+
#local_dojo_props[:checked] = "checked"
|
88
|
+
#default_html_options[:checked] = "checked"
|
89
|
+
#end
|
90
|
+
|
91
|
+
default_html_options[:'data-dojo-props'] = SimpleFormDojo::FormBuilder.encode_as_dojo_props(local_dojo_props) if !local_dojo_props.nil?
|
92
|
+
|
93
|
+
# append the object id to the html id
|
94
|
+
default_html_options["id"] = "#{html_options["id"]}_#{value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase}" if html_options["id"].present?
|
95
|
+
|
96
|
+
builder = instantiate_collection_builder(SimpleForm::ActionViewExtensions::RadioButtonBuilder, attribute, item, value, text, default_html_options)
|
97
|
+
|
98
|
+
if block_given?
|
99
|
+
yield builder
|
100
|
+
else
|
101
|
+
builder.radio_button + builder.label(:class => "collection_radio_buttons")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
wrap_rendered_collection(rendered_collection, options)
|
105
|
+
end
|
106
|
+
|
107
|
+
def dojo_collection_check_boxes(attribute, collection, value_method,
|
108
|
+
text_method, options={}, html_options={})
|
109
|
+
rendered_collection = render_collection(
|
110
|
+
collection, value_method, text_method, options, html_options
|
111
|
+
) do |item, value, text, default_html_options|
|
112
|
+
local_dojo_props = @dojo_props.dup
|
113
|
+
|
114
|
+
## Checked
|
115
|
+
#if values_are_equal?(local_dojo_props[:value], value)
|
116
|
+
#local_dojo_props[:checked] = "checked"
|
117
|
+
#default_html_options[:checked] = "checked"
|
118
|
+
#end
|
119
|
+
default_html_options[:multiple] = true
|
120
|
+
|
121
|
+
default_html_options[:'data-dojo-props'] = SimpleFormDojo::FormBuilder.encode_as_dojo_props(local_dojo_props)
|
122
|
+
|
123
|
+
# append the object id to the html id
|
124
|
+
default_html_options["id"] = "#{html_options["id"]}_#{value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase}" if html_options["id"].present?
|
125
|
+
|
126
|
+
builder = instantiate_collection_builder(SimpleForm::ActionViewExtensions::CheckBoxBuilder, attribute, item, value, text, default_html_options)
|
127
|
+
|
128
|
+
if block_given?
|
129
|
+
yield builder
|
130
|
+
else
|
131
|
+
builder.check_box + builder.label(:class => "collection_check_boxes")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
wrap_rendered_collection(rendered_collection, options)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Adds support for Ajax remote FilteringSelect using a QueryReadStore
|
138
|
+
#
|
139
|
+
# == Example
|
140
|
+
#
|
141
|
+
# simple_form_for @user do |f|
|
142
|
+
# f.association :company, :remote_path => '/companies/qrs'
|
143
|
+
# end
|
144
|
+
# # Will create a QueryReadStore linked to a FilteringSelect
|
145
|
+
#
|
146
|
+
def association(association, options={}, &block)
|
147
|
+
options = options.dup
|
148
|
+
reflection = find_association_reflection(association)
|
149
|
+
raise "Association #{association.inspect} not found" unless reflection
|
150
|
+
store = ""
|
151
|
+
if reflection.macro == :belongs_to
|
152
|
+
options[:input_html] ||= {}
|
153
|
+
attribute = (reflection.respond_to?(:options) && reflection.options[:foreign_key]) || :"#{reflection.name}_id"
|
154
|
+
options[:input_html][:value] ||= object.send(attribute)
|
155
|
+
options[:dojo_html] ||= {}
|
156
|
+
if options[:remote_path] && !options[:dojo_html][:store]
|
157
|
+
options[:collection] = [] #Prevent collections from being loaded
|
158
|
+
qrs_id = "#{object_name.to_s.underscore}_#{object.id.to_s.gsub(/[^\w]/, "")}_#{association}_qrs"
|
159
|
+
path = options.delete(:remote_path)
|
160
|
+
options[:dojo_html][:store] = qrs_id
|
161
|
+
store = qrs(qrs_id, path)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
store.html_safe + super(association, options, &block)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Creates a Dojo QueryReadStore
|
169
|
+
#
|
170
|
+
# dojo_form_for @user do |f|
|
171
|
+
# f.qrs :company_qrs, '/companies/qrs'
|
172
|
+
# end
|
173
|
+
def qrs id, path, dojo_props = {}
|
174
|
+
dojo_props = dojo_props.dup
|
175
|
+
options = {:'data-dojo-type' => 'dojox/data/QueryReadStore'}
|
176
|
+
dojo_props[:url] = "'#{path}'"
|
177
|
+
options[:'data-dojo-props'] = SimpleFormDojo::FormBuilder.encode_as_dojo_props(dojo_props)
|
178
|
+
options[:'data-dojo-id'] = id
|
179
|
+
options[:style] ||= "display: none;"
|
180
|
+
template.content_tag(:span, nil, options)
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# The dojo props string is evaluated as javascript,
|
185
|
+
# can therefore contain any valid javascript object
|
186
|
+
# and cannot be encoded as JSON
|
187
|
+
def self.encode_as_dojo_props(options)
|
188
|
+
encode_obj(options)
|
189
|
+
.slice(1..-2)
|
190
|
+
.html_safe
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.encode_obj(obj)
|
194
|
+
case obj
|
195
|
+
when Hash
|
196
|
+
"{#{obj.collect{|k, v| "#{k}:#{encode_obj(v)}"}.join(', ')}}"
|
197
|
+
when Array
|
198
|
+
"[#{obj.collect{|v| encode_obj(v)}.join(', ')}]"
|
199
|
+
else
|
200
|
+
obj.to_s
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
private
|
205
|
+
|
206
|
+
def values_are_equal?(obj_value, item_value)
|
207
|
+
value = obj_value
|
208
|
+
if value.is_a?(String)
|
209
|
+
values = obj_value[/\[([,0-9\s]+)\]/,1]
|
210
|
+
unless values.nil?
|
211
|
+
return values.tr(' ','').split(',').include?(item_value.to_s)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
(value.to_s == item_value.to_s ? true : false)
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Helpers
|
3
|
+
module FormHelper
|
4
|
+
|
5
|
+
def dojo_form_for(record_or_name_or_array, *args, &block)
|
6
|
+
options = args.extract_options!.reverse_merge(:builder => SimpleFormDojo::FormBuilder)
|
7
|
+
options[:html] ||= {}
|
8
|
+
options[:html][:'data-dojo-id'] ||= options[:html][:id] if options[:html][:id]
|
9
|
+
options[:html][:'data-dojo-type'] ||= 'dijit/form/Form'
|
10
|
+
simple_form_for(record_or_name_or_array, *(args << options), &block).tap do |output|
|
11
|
+
form_callbacks.each do |callback|
|
12
|
+
output << callback.call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def dojo_fields_for(*args, &block)
|
18
|
+
options = args.extract_options!.reverse_merge(:builder => SimpleFormDojo::FormBuilder)
|
19
|
+
simple_fields_for(*(args << options), &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def form_associations
|
23
|
+
@form_associations ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
def form_callbacks
|
27
|
+
@form_callbacks ||= []
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
ActionView::Base.send(:include, SimpleFormDojo::Helpers::FormHelper)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'action_view'
|
2
|
+
|
3
|
+
module SimpleFormDojo
|
4
|
+
# = SimpleFormDojo Dojo Tabs Helper
|
5
|
+
module Helpers
|
6
|
+
# Provides methods to generate HTML markup for dijit/layout/TabContainer objects
|
7
|
+
#
|
8
|
+
# ==
|
9
|
+
module TabsHelper
|
10
|
+
# Returns an HTML block tag of type DIV with the appropriate dojo-data-type.
|
11
|
+
# You must pass a block of tabs as an argument.
|
12
|
+
#
|
13
|
+
# ==== Options
|
14
|
+
# The +options+ hash is used to pass additional HTML attributes to the parent DIV.
|
15
|
+
#
|
16
|
+
# The default dojo-data-props attribute is set to "doLayout:false".
|
17
|
+
#
|
18
|
+
# The default id attribute is set to "tabs".
|
19
|
+
#
|
20
|
+
# ==== Examples
|
21
|
+
#
|
22
|
+
# <%= dojo_tabs_for do |tab| %>
|
23
|
+
# <%= tab.create('Tab Title One') do %>
|
24
|
+
# #... tab contents
|
25
|
+
# <% end %>
|
26
|
+
# <% end %>
|
27
|
+
# # => <div data-dojo-props="doLayout:false" data-dojo-type="dijit/layout/TabContainer" id="tabs">
|
28
|
+
# # => <div data-dojo-props="title:'Tab Title One'" data-dojo-type="dijit/layout/ContentPane">
|
29
|
+
# # => ... tab contents
|
30
|
+
# # => </div>
|
31
|
+
# # => </div>
|
32
|
+
def dojo_tabs_for( *options, &block )
|
33
|
+
raise ArgumentError, "Missing block" unless block_given?
|
34
|
+
raw SimpleFormDojo::Helpers::TabsHelper::TabsRenderer.new( *options, &block ).render
|
35
|
+
end
|
36
|
+
|
37
|
+
class TabsRenderer
|
38
|
+
include ActionView::Helpers::CaptureHelper
|
39
|
+
def initialize( options={}, &block )
|
40
|
+
raise ArgumentError, "Missing block" unless block_given?
|
41
|
+
@template = eval( 'self', block.binding )
|
42
|
+
@options = options
|
43
|
+
@tabs = []
|
44
|
+
yield self
|
45
|
+
end
|
46
|
+
|
47
|
+
def create(title, options={}, &block)
|
48
|
+
raise ArgumentError, "Block needed for TabsRenderer#CREATE" unless block_given?
|
49
|
+
@tabs << [ title, options, block ]
|
50
|
+
# had to return an empty string. Otherwise, the @tabs object was being
|
51
|
+
# returned when used with the <%= tab.create('title') %> syntax
|
52
|
+
return ''
|
53
|
+
end
|
54
|
+
|
55
|
+
def render
|
56
|
+
content_tag( :div, raw([render_tabs].join), { :id => :tabs,
|
57
|
+
"data-dojo-props" => "doLayout:false",
|
58
|
+
"data-dojo-type" => "dijit/layout/TabContainer"
|
59
|
+
}.merge(@options) )
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def render_tabs
|
65
|
+
@tabs.collect do |tab|
|
66
|
+
content_tag(:div, capture( &tab[2] ), tab[1].merge( "data-dojo-type" => "dijit/layout/ContentPane",
|
67
|
+
"data-dojo-props" => "title:'#{tab[0]}'"))
|
68
|
+
end.join.to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
def method_missing( *args, &block )
|
72
|
+
@template.send( *args, &block )
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
ActionView::Base.send(:include, SimpleFormDojo::Helpers::TabsHelper)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class BooleanInput < SimpleForm::Inputs::BooleanInput
|
4
|
+
include DojoPropsMethods
|
5
|
+
|
6
|
+
def input
|
7
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
8
|
+
get_and_merge_dojo_props!
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def dojo_type
|
15
|
+
'dijit/form/CheckBox'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class CollectionInput < SimpleForm::Inputs::CollectionInput
|
4
|
+
|
5
|
+
include DojoPropsMethods
|
6
|
+
|
7
|
+
def input
|
8
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
9
|
+
infer_dojo_props_from_validations!
|
10
|
+
get_and_merge_dojo_props!
|
11
|
+
|
12
|
+
label_method, value_method = detect_collection_methods
|
13
|
+
collection_method = @builder.respond_to?(:"dojo_collection_#{input_type}") ?
|
14
|
+
"dojo_collection_#{input_type}" :
|
15
|
+
"collection_#{input_type}"
|
16
|
+
@builder.dojo_props = @dojo_props
|
17
|
+
@builder.send(collection_method, attribute_name, collection, value_method,
|
18
|
+
label_method, input_options, input_html_options)
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def dojo_type
|
24
|
+
case input_type
|
25
|
+
when :check_boxes
|
26
|
+
'dijit/form/CheckBox'
|
27
|
+
when :radio_buttons
|
28
|
+
'dijit/form/RadioButton'
|
29
|
+
when :select
|
30
|
+
(input_html_options.has_key?(:multiple) ? 'dijit/form/MultiSelect' : 'dijit/form/FilteringSelect')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def infer_dojo_props_from_validations!
|
35
|
+
@dojo_props ||= {}
|
36
|
+
@dojo_props.merge!(:required => has_required?)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class DateTimeInput < SimpleForm::Inputs::StringInput
|
4
|
+
|
5
|
+
include DojoPropsMethods
|
6
|
+
|
7
|
+
def input
|
8
|
+
input_html_options[:type] = :text
|
9
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
10
|
+
get_and_merge_dojo_props!
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def dojo_type
|
17
|
+
case input_type
|
18
|
+
when :date, :datetime
|
19
|
+
'dijit/form/DateTextBox'
|
20
|
+
when :time
|
21
|
+
'dijit/form/TimeTextBox'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
# Uses MapType to handle basic input types. See the original simple_form
|
4
|
+
# source for details.
|
5
|
+
class MappingInput < SimpleForm::Inputs::MappingInput
|
6
|
+
include DojoPropsMethods
|
7
|
+
|
8
|
+
map_type :text_simple, :to => :text_area
|
9
|
+
|
10
|
+
def input
|
11
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
12
|
+
infer_dojo_props_from_validations!
|
13
|
+
get_and_merge_dojo_props!
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def dojo_type
|
20
|
+
case input_type
|
21
|
+
when :password
|
22
|
+
if has_required?
|
23
|
+
'dijit/form/ValidationTextBox'
|
24
|
+
else
|
25
|
+
'dijit/form/TextBox'
|
26
|
+
end
|
27
|
+
when :text
|
28
|
+
'dijit/form/Textarea'
|
29
|
+
when :text_simple
|
30
|
+
'dijit/form/SimpleTextarea'
|
31
|
+
when :file
|
32
|
+
raise('File fields have not been implemented yet!')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def infer_dojo_props_from_validations!
|
37
|
+
@dojo_props ||= {}
|
38
|
+
@dojo_props.merge!(:required => true) if has_required?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class NumericInput < SimpleForm::Inputs::NumericInput
|
4
|
+
|
5
|
+
include DojoPropsMethods
|
6
|
+
|
7
|
+
def input
|
8
|
+
input_html_options[:type] = :text
|
9
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
10
|
+
infer_dojo_props_from_validations!
|
11
|
+
get_and_merge_dojo_props!
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def dojo_type
|
18
|
+
'dijit/form/NumberTextBox'
|
19
|
+
end
|
20
|
+
|
21
|
+
def integer?
|
22
|
+
if input_type == :integer
|
23
|
+
@dojo_props ||= {}
|
24
|
+
@dojo_props[:constraints] ||= {}
|
25
|
+
@dojo_props[:constraints][:places] ||= 0;
|
26
|
+
true
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def infer_dojo_props_from_validations!
|
33
|
+
@dojo_props ||= {}
|
34
|
+
@dojo_props.merge!(:required => true) if has_required?
|
35
|
+
if has_validators?
|
36
|
+
# numeric_validator and find_numericality_validator inherited from SimpleForm
|
37
|
+
numeric_validator = find_numericality_validator or return
|
38
|
+
validator_options = numeric_validator.options
|
39
|
+
@dojo_props[:constraints] ||= {}
|
40
|
+
@dojo_props[:constraints][:min] ||= minimum_value(validator_options)
|
41
|
+
@dojo_props[:constraints][:max] ||= maximum_value(validator_options)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class PasswordInput < SimpleForm::Inputs::PasswordInput
|
4
|
+
include DojoPropsMethods
|
5
|
+
|
6
|
+
def input
|
7
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
8
|
+
infer_dojo_props_from_validations!
|
9
|
+
get_and_merge_dojo_props!
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def dojo_type
|
16
|
+
if has_required?
|
17
|
+
'dijit/form/ValidationTextBox'
|
18
|
+
else
|
19
|
+
'dijit/form/TextBox'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def infer_dojo_props_from_validations!
|
24
|
+
@dojo_props ||= {}
|
25
|
+
@dojo_props.merge!(:required => true) if has_required?
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class StringInput < SimpleForm::Inputs::StringInput
|
4
|
+
include DojoPropsMethods
|
5
|
+
EMAIL_REGEXP="^[\\\\w!#%$*+=?`{|}~^-]+(?:[\\\\w!#%$*+=?`{|}~^.-])*@(?:[a-zA-Z0-9-]+\\\\.)+[a-zA-Z]{2,6}$"
|
6
|
+
|
7
|
+
def input
|
8
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
9
|
+
infer_dojo_props_from_validations!
|
10
|
+
get_and_merge_dojo_props!
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def dojo_type
|
17
|
+
if has_required? || [:tel, :email].include?(input_type)
|
18
|
+
'dijit/form/ValidationTextBox'
|
19
|
+
else
|
20
|
+
'dijit/form/TextBox'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def infer_dojo_props_from_validations!
|
25
|
+
@dojo_props = {}
|
26
|
+
@dojo_props.merge!(:required => true) if has_required?
|
27
|
+
case input_type
|
28
|
+
when :email
|
29
|
+
@dojo_props[:pattern] ||= "'#{EMAIL_REGEXP}'"
|
30
|
+
@dojo_props[:invalidMessage] = "'Invalid email format.'"
|
31
|
+
when :tel
|
32
|
+
@dojo_props[:pattern] ||= "'^[\\\\d(.)+\\\\s-]+$'"
|
33
|
+
@dojo_props[:invalidMessage] = "'Invalid phone format.'"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
class TextInput < SimpleForm::Inputs::TextInput
|
4
|
+
include DojoPropsMethods
|
5
|
+
|
6
|
+
#map_type :text_simple, :to => :text_area
|
7
|
+
|
8
|
+
def input
|
9
|
+
input_html_options[:'data-dojo-type'] ||= dojo_type
|
10
|
+
infer_dojo_props_from_validations!
|
11
|
+
get_and_merge_dojo_props!
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def dojo_type
|
18
|
+
case input_type
|
19
|
+
when :text
|
20
|
+
'dijit/form/Textarea'
|
21
|
+
when :text_simple
|
22
|
+
'dijit/form/SimpleTextarea'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def infer_dojo_props_from_validations!
|
27
|
+
@dojo_props ||= {}
|
28
|
+
@dojo_props.merge!(:required => true) if has_required?
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module SimpleFormDojo
|
2
|
+
module Inputs
|
3
|
+
autoload :StringInput, 'simple_form-dojo/inputs/string_input'
|
4
|
+
autoload :DateTimeInput, 'simple_form-dojo/inputs/date_time_input'
|
5
|
+
autoload :NumericInput, 'simple_form-dojo/inputs/numeric_input'
|
6
|
+
autoload :TextInput, 'simple_form-dojo/inputs/text_input'
|
7
|
+
autoload :PasswordInput, 'simple_form-dojo/inputs/password_input'
|
8
|
+
autoload :CollectionInput, 'simple_form-dojo/inputs/collection_input'
|
9
|
+
autoload :CurrencyInput, 'simple_form-dojo/inputs/currency_input'
|
10
|
+
autoload :BooleanInput, 'simple_form-dojo/inputs/boolean_input'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'action_view'
|
2
|
+
require 'simple_form'
|
3
|
+
require 'simple_form-dojo/version'
|
4
|
+
require 'simple_form-dojo/helpers/tabs_helper'
|
5
|
+
require 'simple_form-dojo/helpers/form_helper'
|
6
|
+
|
7
|
+
module SimpleFormDojo
|
8
|
+
autoload :FormBuilder, 'simple_form-dojo/form_builder'
|
9
|
+
autoload :Inputs, 'simple_form-dojo/inputs'
|
10
|
+
autoload :DojoPropsMethods, 'simple_form-dojo/dojo_props_methods'
|
11
|
+
end
|
12
|
+
|
metadata
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_form-dojo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Giouzenis
|
8
|
+
- Patrick Ward
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: simple_form
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.1.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 2.1.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rspec
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.12.0
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 2.12.0
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rails
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 3.2.9
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 3.2.9
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rspec-rails
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 2.12.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.12.0
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec-html-matchers
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: nokogiri
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ~>
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.5.5
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.5.5
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: capybara
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ~>
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 2.0.1
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ~>
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 2.0.1
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: spork
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.9.2
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.9.2
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: sqlite3
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ~>
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 1.3.6
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ~>
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 1.3.6
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: factory_girl_rails
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ~>
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 4.1.0
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ~>
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 4.1.0
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: database_cleaner
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ~>
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 0.9.1
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ~>
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 0.9.1
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
name: watchr
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
type: :development
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: awesome_print
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ! '>='
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - ! '>='
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
196
|
+
description: SimpleFormDojo is a collection of helpers for use with Dojo and Rails.
|
197
|
+
The goal of the project is to make it simple to create Dijit elements using the
|
198
|
+
existing Rails helper infrastructure.
|
199
|
+
email:
|
200
|
+
- alexandrosg@gmail.com
|
201
|
+
executables: []
|
202
|
+
extensions: []
|
203
|
+
extra_rdoc_files: []
|
204
|
+
files:
|
205
|
+
- lib/simple_form-dojo/form_builder.rb
|
206
|
+
- lib/simple_form-dojo/version.rb
|
207
|
+
- lib/simple_form-dojo/inputs/mapping_input.rb
|
208
|
+
- lib/simple_form-dojo/inputs/numeric_input.rb
|
209
|
+
- lib/simple_form-dojo/inputs/boolean_input.rb
|
210
|
+
- lib/simple_form-dojo/inputs/text_input.rb
|
211
|
+
- lib/simple_form-dojo/inputs/collection_input.rb
|
212
|
+
- lib/simple_form-dojo/inputs/password_input.rb
|
213
|
+
- lib/simple_form-dojo/inputs/date_time_input.rb
|
214
|
+
- lib/simple_form-dojo/inputs/string_input.rb
|
215
|
+
- lib/simple_form-dojo/inputs/currency_input.rb
|
216
|
+
- lib/simple_form-dojo/dojo_props_methods.rb
|
217
|
+
- lib/simple_form-dojo/inputs.rb
|
218
|
+
- lib/simple_form-dojo/helpers/form_helper.rb
|
219
|
+
- lib/simple_form-dojo/helpers/tabs_helper.rb
|
220
|
+
- lib/simple_form-dojo.rb
|
221
|
+
- MIT-LICENSE
|
222
|
+
- Rakefile
|
223
|
+
- README.markdown
|
224
|
+
homepage: https://github.com/agios/simple_form-dojo
|
225
|
+
licenses: []
|
226
|
+
metadata: {}
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options: []
|
229
|
+
require_paths:
|
230
|
+
- lib
|
231
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ! '>='
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - ! '>='
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
241
|
+
requirements: []
|
242
|
+
rubyforge_project: simple_form-dojo
|
243
|
+
rubygems_version: 2.0.3
|
244
|
+
signing_key:
|
245
|
+
specification_version: 4
|
246
|
+
summary: Dojo Toolkit helpers for Rails 3
|
247
|
+
test_files: []
|