rapid-core 0.1 → 0.2.1
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/.gitignore +1 -0
- data/Gemfile.lock +35 -2
- data/Rakefile +77 -48
- data/doc/server.txt +15 -0
- data/features/settings/double-nested/default.feature +2 -2
- data/features/settings/double-nested/validates/presence_of.feature +1 -1
- data/features/settings/nested/default.feature +1 -1
- data/features/settings/nested/validates/presence_of.feature +1 -1
- data/features/settings/not_found.feature +2 -2
- data/features/step_definitions/settings_steps.rb +7 -3
- data/features/step_definitions/template_steps.rb +3 -1
- data/lib/rapid/check.rb +30 -23
- data/lib/rapid/core.rb +12 -0
- data/lib/rapid/error.rb +1 -0
- data/lib/rapid/module.rb +10 -1
- data/lib/rapid/railtie.rb +6 -0
- data/lib/rapid/setting/base.rb +31 -8
- data/lib/rapid/setting/boolean_setting.rb +20 -1
- data/lib/rapid/setting/definer.rb +11 -47
- data/lib/rapid/setting/integer_setting.rb +7 -7
- data/lib/rapid/setting/module.rb +56 -0
- data/lib/rapid/setting/namespace/base.rb +35 -60
- data/lib/rapid/setting/namespace/instance.rb +195 -28
- data/lib/rapid/setting/string_setting.rb +7 -1
- data/lib/rapid/settings.rb +51 -65
- data/lib/rapid/skeleton/base.rb +39 -18
- data/lib/rapid/skeleton/helpers/directory.rb +5 -6
- data/lib/rapid/skeleton/helpers/files.rb +62 -0
- data/lib/rapid/skeleton/helpers/gem.rb +43 -32
- data/lib/rapid/skeleton/helpers/if_setting.rb +44 -0
- data/lib/rapid/skeleton/helpers/migration.rb +102 -32
- data/lib/rapid/skeleton/helpers/route.rb +8 -12
- data/lib/rapid/skeleton/helpers/script.rb +1 -2
- data/lib/rapid/skeleton/helpers/template.rb +23 -25
- data/lib/rapid/skeleton/helpers/view.rb +7 -7
- data/lib/rapid/spec/template.rb +1 -1
- data/lib/rapid/version.rb +1 -1
- data/lib/rapid/web/base.rb +35 -0
- data/lib/rapid/web/bootstrap.rb +98 -0
- data/lib/rapid/web/controller_helpers.rb +60 -0
- data/lib/rapid/web/navigator.rb +18 -0
- data/lib/rapid/web/select_helpers.rb +63 -0
- data/lib/rapid/web/settings_form_builder.rb +205 -0
- data/lib/rapid/web/static_helpers.rb +28 -0
- data/lib/rapid/web/tasks.rb +10 -0
- data/public/rapid/core/bootstrap-collapse.js +136 -0
- data/public/rapid/core/bootstrap-responsive.min.css +3 -0
- data/public/rapid/core/bootstrap.min.css +556 -0
- data/public/rapid/core/jquery-1.7.1.js +9253 -0
- data/public/rapid/core/prettify.css +30 -0
- data/public/rapid/core/prettify.js +28 -0
- data/rapid-core.gemspec +5 -0
- data/spec/rapid/check_spec.rb +11 -4
- data/spec/rapid/module_spec.rb +18 -0
- data/spec/rapid/setting/base_spec.rb +71 -0
- data/spec/rapid/setting/boolean_setting_spec.rb +95 -0
- data/spec/rapid/setting/definer_spec.rb +7 -13
- data/spec/rapid/setting/integer_setting_spec.rb +49 -0
- data/spec/rapid/setting/module_spec.rb +25 -0
- data/spec/rapid/setting/namespace/base_spec.rb +88 -54
- data/spec/rapid/setting/namespace/instance_spec.rb +308 -5
- data/spec/rapid/setting/string_setting_spec.rb +43 -0
- data/spec/rapid/settings_spec.rb +65 -17
- data/spec/rapid/skeleton/base_spec.rb +113 -7
- data/spec/rapid/skeleton/helpers/directory_spec.rb +8 -6
- data/spec/rapid/skeleton/helpers/files_spec.rb +93 -0
- data/spec/rapid/skeleton/helpers/gem_spec.rb +65 -36
- data/spec/rapid/skeleton/helpers/if_setting_spec.rb +110 -0
- data/spec/rapid/skeleton/helpers/migration_spec.rb +190 -1
- data/spec/rapid/skeleton/helpers/route_spec.rb +13 -12
- data/spec/rapid/skeleton/helpers/script_spec.rb +2 -1
- data/spec/rapid/skeleton/helpers/template_spec.rb +22 -35
- data/spec/rapid/spec/template_spec.rb +1 -1
- data/spec/rapid/web/base_spec.rb +33 -0
- data/spec/rapid/web/bootstrap_spec.rb +72 -0
- data/spec/rapid/web/controller_helpers_spec.rb +86 -0
- data/spec/rapid/web/navigator_spec.rb +17 -0
- data/spec/rapid/web/select_helpers_spec.rb +71 -0
- data/spec/rapid/web/settings_form_builder_spec.rb +255 -0
- data/spec/rapid/web/static_helpers_spec.rb +26 -0
- data/spec/spec_helper.rb +3 -0
- data/views/index.erb +11 -0
- data/views/layout.erb +9 -0
- metadata +107 -12
- data/lib/rapid.rb +0 -37
- data/lib/rapid/setting/class_hash.rb +0 -34
- data/lib/rapid/setting/instance_hash.rb +0 -132
- data/lib/rapid/setting/instance_root.rb +0 -107
- data/spec/rapid/setting/instance_root_spec.rb +0 -161
@@ -18,8 +18,7 @@ module Rapid
|
|
18
18
|
push_template script_path, options
|
19
19
|
|
20
20
|
output_path = options[:to] || script_path
|
21
|
-
|
22
|
-
File.chmod 0755, full_output_path
|
21
|
+
chmod_project_file 0755, output_path if project_file_exists?(output_path)
|
23
22
|
end
|
24
23
|
|
25
24
|
def pull_script script_path, options = {}
|
@@ -15,54 +15,52 @@ module Rapid
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def push_template template_path, options = {}
|
18
|
-
if_setting = options[:if]
|
19
|
-
return false if if_setting && !set?(if_setting)
|
20
|
-
|
21
|
-
full_template_path = File.join templates_path, template_path
|
22
|
-
template_content = File.open(full_template_path) { |f| f.read }
|
23
|
-
template = Rapid::Template::Base.new template_content, :filename => template_path
|
24
|
-
|
25
18
|
output_path = options[:to] || template_path
|
26
|
-
full_output_path = File.join project_path, output_path
|
27
19
|
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
if if_setting_off? options
|
21
|
+
delete_project_file output_path
|
22
|
+
|
23
|
+
else
|
24
|
+
template_content = read_template_file template_path
|
25
|
+
template = Rapid::Template::Base.new template_content, :filename => template_path
|
26
|
+
|
27
|
+
output_content = template.push self
|
28
|
+
write_project_file output_path, output_content
|
29
|
+
end
|
31
30
|
|
32
31
|
true
|
33
|
-
|
34
|
-
rescue Errno::ENOENT => e
|
35
|
-
raise Rapid::TemplateNotFoundError.new(e.message)
|
36
32
|
end
|
37
33
|
|
38
34
|
def pull_template template_path, options = {}
|
39
|
-
|
40
|
-
|
41
|
-
full_template_path = File.join templates_path, template_path
|
42
|
-
template_content = File.open(full_template_path) { |f| f.read }
|
35
|
+
template_content = read_template_file template_path
|
43
36
|
template = Rapid::Template::Base.new template_content, :filename => template_path
|
44
37
|
|
45
38
|
output_path = options[:to] || template_path
|
46
|
-
full_output_path = File.join project_path, output_path
|
47
39
|
|
48
|
-
unless
|
49
|
-
if
|
50
|
-
|
40
|
+
unless project_file_exists?(output_path)
|
41
|
+
if has_if_setting? options
|
42
|
+
if_set! false, options
|
51
43
|
else
|
52
44
|
error output_path, "doesn't exist"
|
53
45
|
end
|
54
46
|
return
|
55
47
|
end
|
56
48
|
|
57
|
-
output_content =
|
49
|
+
output_content = read_project_file output_path
|
50
|
+
result = nil
|
58
51
|
begin
|
59
|
-
template.pull output_content
|
52
|
+
result = template.pull output_content
|
60
53
|
rescue Rapid::NotMatchingTemplateError => e
|
61
54
|
exception output_path, e
|
62
55
|
return
|
63
56
|
end
|
64
57
|
|
65
|
-
|
58
|
+
if_set! true, options
|
59
|
+
|
60
|
+
result.each do |key, value|
|
61
|
+
self[key] = value
|
62
|
+
end
|
63
|
+
|
66
64
|
ok output_path, "is good"
|
67
65
|
end
|
68
66
|
|
@@ -6,26 +6,26 @@ module Rapid
|
|
6
6
|
|
7
7
|
protected
|
8
8
|
|
9
|
-
def view view_path
|
9
|
+
def view view_path, options = {}
|
10
10
|
if pushing?
|
11
|
-
push_view view_path
|
11
|
+
push_view view_path, options
|
12
12
|
elsif pulling?
|
13
|
-
pull_view view_path
|
13
|
+
pull_view view_path, options
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def push_view view_path
|
17
|
+
def push_view view_path, options
|
18
18
|
template_path = File.join 'app', 'views', view_path
|
19
19
|
rapid_view_path = File.join 'lib', 'rapid', 'views', view_path
|
20
20
|
|
21
|
-
push_template template_path, :to => rapid_view_path
|
21
|
+
push_template template_path, options.reverse_merge(:to => rapid_view_path)
|
22
22
|
end
|
23
23
|
|
24
|
-
def pull_view view_path
|
24
|
+
def pull_view view_path, options
|
25
25
|
template_path = File.join 'app', 'views', view_path
|
26
26
|
rapid_view_path = File.join 'lib', 'rapid', 'views', view_path
|
27
27
|
|
28
|
-
pull_template template_path, :to => rapid_view_path
|
28
|
+
pull_template template_path, options.reverse_merge(:to => rapid_view_path)
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|
data/lib/rapid/spec/template.rb
CHANGED
@@ -35,7 +35,7 @@ module Rapid
|
|
35
35
|
raise "please set define build_skeleton or set Rapid::Spec::Template.skeleton_class before running specs"
|
36
36
|
end
|
37
37
|
|
38
|
-
@skeleton.
|
38
|
+
@skeleton.settings = settings_hash if settings_hash
|
39
39
|
@template = Rapid::Template::Base.new template_content
|
40
40
|
@result = @template.push @skeleton
|
41
41
|
end
|
data/lib/rapid/version.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
class Base < Sinatra::Base
|
5
|
+
|
6
|
+
register SinatraMore::MarkupPlugin
|
7
|
+
register Web::StaticHelpers
|
8
|
+
register Web::SelectHelpers
|
9
|
+
register Web::ControllerHelpers
|
10
|
+
helpers Web::Bootstrap
|
11
|
+
|
12
|
+
enable :sessions
|
13
|
+
|
14
|
+
configure :development do
|
15
|
+
register Sinatra::Reloader if defined? Sinatra::Reloader
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
class << self
|
21
|
+
|
22
|
+
attr_accessor :rapid_name, :gem_path
|
23
|
+
attr_reader :file
|
24
|
+
|
25
|
+
def file= file
|
26
|
+
@gem_path = $` if file =~ /\/lib\//
|
27
|
+
@file = file
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
module Bootstrap
|
5
|
+
|
6
|
+
def bootstrap_head
|
7
|
+
tags = ""
|
8
|
+
tags << tag(:meta, :charset => "UTF-8")
|
9
|
+
tags << tag(:meta, :name => "description", :content => @description) if @description
|
10
|
+
tags << tag(:meta, :name => "author", :content => @author) if @author
|
11
|
+
tags << tag(:title, :content => (@title.to_s if @title) || "Rapid Development")
|
12
|
+
|
13
|
+
tags << bootstrap_stylesheets
|
14
|
+
|
15
|
+
tags << %(<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
|
16
|
+
<!--[if lt IE 9]>
|
17
|
+
<script src='http://html5shim.googlecode.com/svn/trunk/html5.js'></script>
|
18
|
+
<![endif]-->)
|
19
|
+
|
20
|
+
tag :head, :content => tags
|
21
|
+
end
|
22
|
+
|
23
|
+
def bootstrap_body &block
|
24
|
+
tags = bootstrap_topnav
|
25
|
+
tags << capture_html(&block)
|
26
|
+
tags << bootstrap_scripts
|
27
|
+
|
28
|
+
body = tag :body, :content => tags, "data-spy" => "scroll", "data-target" => ".subnav", "data-offset" => "50"
|
29
|
+
|
30
|
+
concat_content body
|
31
|
+
end
|
32
|
+
|
33
|
+
def bootstrap_stylesheets
|
34
|
+
tags = ""
|
35
|
+
|
36
|
+
tags << tag(:link, :href => "/rapid/core/bootstrap.min.css", :rel => "stylesheet")
|
37
|
+
tags << tag(:link, :href => "/rapid/core/bootstrap-responsive.min.css", :rel => "stylesheet")
|
38
|
+
tags << tag(:link, :href => "/rapid/core/prettify.css", :rel => "stylesheet")
|
39
|
+
|
40
|
+
if public_path && File.exists?(File.join(public_path, 'application.css'))
|
41
|
+
tags << tag(:link, :href => "/rapid/#{rapid_name}/application.css", :rel => "stylesheet")
|
42
|
+
end
|
43
|
+
|
44
|
+
tags
|
45
|
+
end
|
46
|
+
|
47
|
+
def bootstrap_scripts
|
48
|
+
tags = ""
|
49
|
+
|
50
|
+
tags << tag(:script, :content => "", :src => '/rapid/core/jquery-1.7.1.js')
|
51
|
+
tags << tag(:script, :content => "", :src => '/rapid/core/prettify.js')
|
52
|
+
tags << tag(:script, :content => "", :src => '/rapid/core/bootstrap-collapse.js')
|
53
|
+
|
54
|
+
if public_path && File.exists?(File.join(public_path, 'application.js'))
|
55
|
+
tags << tag(:script, :content => "", :src => "/rapid/#{rapid_name}/application.js")
|
56
|
+
end
|
57
|
+
|
58
|
+
tags
|
59
|
+
end
|
60
|
+
|
61
|
+
def bootstrap_topnav
|
62
|
+
%(<div class="navbar">
|
63
|
+
<div class="navbar-inner">
|
64
|
+
<div class="container">
|
65
|
+
<a href="#" class="brand">Rapid</a>
|
66
|
+
<div class="nav-collapse">
|
67
|
+
<ul class="nav pull-right">
|
68
|
+
<li>
|
69
|
+
<a href="#">Link</a>
|
70
|
+
</li>
|
71
|
+
<li class="divider-vertical"></li>
|
72
|
+
</ul>
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
</div>
|
76
|
+
</div>)
|
77
|
+
end
|
78
|
+
|
79
|
+
def bootstrap_flash
|
80
|
+
tags = ""
|
81
|
+
|
82
|
+
notice = session.delete :notice
|
83
|
+
if notice
|
84
|
+
tags << tag(:div, :content => notice, :class => 'alert alert-success')
|
85
|
+
end
|
86
|
+
|
87
|
+
error = session.delete :error
|
88
|
+
if error
|
89
|
+
tags << tag(:div, :content => error, :class => 'alert alert-error')
|
90
|
+
end
|
91
|
+
|
92
|
+
tags
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
module ControllerHelpers
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
app.helpers self
|
8
|
+
end
|
9
|
+
|
10
|
+
def application_path
|
11
|
+
ENV["APP"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def public_path
|
15
|
+
File.join gem_path, 'public', 'rapid', rapid_name if gem_path && rapid_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def rapid_name
|
19
|
+
self.class.rapid_name
|
20
|
+
end
|
21
|
+
|
22
|
+
def gem_path
|
23
|
+
self.class.gem_path
|
24
|
+
end
|
25
|
+
|
26
|
+
def setting_params options = {}
|
27
|
+
param_name = options[:param] || :settings
|
28
|
+
param = params[param_name]
|
29
|
+
return if param.nil?
|
30
|
+
|
31
|
+
setting_params_recurse param
|
32
|
+
end
|
33
|
+
|
34
|
+
def setting_params_recurse source, destination = {}
|
35
|
+
source.each do |key, value|
|
36
|
+
if value.is_a? Hash
|
37
|
+
is_on = value.delete "on"
|
38
|
+
|
39
|
+
if is_on == "0"
|
40
|
+
destination[key] = false
|
41
|
+
elsif is_on == "1" && value.empty?
|
42
|
+
destination[key] = true
|
43
|
+
else
|
44
|
+
destination[key] = setting_params_recurse(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
elsif value.blank?
|
48
|
+
destination[key] = nil
|
49
|
+
else
|
50
|
+
destination[key] = value
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
destination
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
class Navigator < Base
|
5
|
+
|
6
|
+
self.file = __FILE__
|
7
|
+
|
8
|
+
set :views, File.join(@gem_path, 'views')
|
9
|
+
set :public_folder, File.join(@gem_path, 'public')
|
10
|
+
|
11
|
+
get "/rapid" do
|
12
|
+
erb :index
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
module SelectHelpers
|
5
|
+
|
6
|
+
def self.registered(app)
|
7
|
+
app.set :default_builder, 'Rapid::Web::SettingsFormBuilder'
|
8
|
+
app.helpers self
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns the options tags for a select based on the given option items
|
12
|
+
def options_for_select(option_items, selected_values=[])
|
13
|
+
return '' if option_items.blank?
|
14
|
+
selected_values = [selected_values].compact unless selected_values.is_a?(Array)
|
15
|
+
items = option_items.collect { |caption, value|
|
16
|
+
value ||= caption
|
17
|
+
selected = selected_values.find {|v| v.to_s =~ /^(#{Regexp.escape(value)}|#{Regexp.escape(caption)})$/}
|
18
|
+
content_tag(:option, caption, :value => value, :selected => !!selected)
|
19
|
+
}
|
20
|
+
items.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
def time_zone_select name, options = {}
|
24
|
+
options.reverse_merge!(:name => name)
|
25
|
+
collection, fields = options.delete(:collection), options.delete(:fields)
|
26
|
+
options[:options] = options_from_collection(collection, fields) if collection
|
27
|
+
# options[:options].unshift('') if options.delete(:include_blank)
|
28
|
+
select_options_html = time_zone_options_for_select(options)
|
29
|
+
options.merge!(:name => "#{options[:name]}[]") if options[:multiple]
|
30
|
+
content_tag(:select, select_options_html, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
# File actionpack/lib/action_view/helpers/form_options_helper.rb, line 504
|
34
|
+
def time_zone_options_for_select(options = {})
|
35
|
+
selected = options.delete(:selected)
|
36
|
+
priority_zones = options.delete(:priority)
|
37
|
+
model = options.delete(:model) || ::ActiveSupport::TimeZone
|
38
|
+
include_blank = options.delete(:include_blank)
|
39
|
+
|
40
|
+
zone_options = ""
|
41
|
+
zone_options += %(<option value=""></option>) if include_blank
|
42
|
+
|
43
|
+
zones = model.all
|
44
|
+
convert_zones = lambda { |list| list.map { |z| [ z.to_s, z.name ] } }
|
45
|
+
|
46
|
+
if priority_zones
|
47
|
+
if priority_zones.is_a?(Regexp)
|
48
|
+
priority_zones = model.all.find_all {|z| z =~ priority_zones}
|
49
|
+
end
|
50
|
+
zone_options += options_for_select(convert_zones[priority_zones], selected)
|
51
|
+
zone_options += "<option value=\"\" disabled=\"disabled\">-------------</option>\n"
|
52
|
+
|
53
|
+
zones = zones.reject { |z| priority_zones.include?( z ) }
|
54
|
+
end
|
55
|
+
|
56
|
+
zone_options += options_for_select(convert_zones[zones], selected)
|
57
|
+
zone_options.html_safe
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
module Rapid
|
2
|
+
module Web
|
3
|
+
|
4
|
+
class SettingsFormBuilder < StandardFormBuilder
|
5
|
+
|
6
|
+
attr_writer :object_name
|
7
|
+
attr_accessor :object_field_name
|
8
|
+
|
9
|
+
def label field, options = {}
|
10
|
+
if field.is_a?(String)
|
11
|
+
super field.split('.').last, options.reverse_merge(:for => setting_id(field))
|
12
|
+
else
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def fields_for field, settings={}, &block
|
18
|
+
fields_html = builder_html_for(field, settings, &block)
|
19
|
+
@template.concat_content fields_html
|
20
|
+
end
|
21
|
+
|
22
|
+
def section name, options = {}, &block
|
23
|
+
body = @template.capture_html(&block)
|
24
|
+
|
25
|
+
title = options[:label] || name.to_s.titleize
|
26
|
+
a = @template.tag(:a, :href => '#', :class => 'toggle-section', :content => title)
|
27
|
+
legend = @template.tag(:legend, :content => a)
|
28
|
+
|
29
|
+
content = legend << body
|
30
|
+
fieldset = @template.tag(:fieldset, :id => "section_#{name}", :class => "minimize", :content => content)
|
31
|
+
@template.concat_content fieldset
|
32
|
+
fieldset
|
33
|
+
end
|
34
|
+
|
35
|
+
def settings name, &block
|
36
|
+
id = "#{name.gsub('.', '_')}_settings"
|
37
|
+
content = @template.capture_html &block
|
38
|
+
|
39
|
+
namespace = object[name]
|
40
|
+
if !namespace.respond_to?(:on?)
|
41
|
+
off = true
|
42
|
+
else
|
43
|
+
off = !namespace.on?
|
44
|
+
end
|
45
|
+
|
46
|
+
css_class = off ? 'subsettings settings-off' : 'subsettings'
|
47
|
+
|
48
|
+
html = @template.tag :div, :id => id, :class => css_class, :content => content
|
49
|
+
@template.concat_content html
|
50
|
+
end
|
51
|
+
|
52
|
+
def control_group field, options = {}, &block
|
53
|
+
label_text = options.delete(:label) || field.to_s.split('.').last.titleize
|
54
|
+
|
55
|
+
label_html = label(field, :caption => label_text)
|
56
|
+
field_html = @template.capture_html(&block)
|
57
|
+
|
58
|
+
id = setting_id(field) + "_group"
|
59
|
+
|
60
|
+
html = control_group_html id, label_html, field_html, options
|
61
|
+
@template.concat_content html
|
62
|
+
html
|
63
|
+
end
|
64
|
+
|
65
|
+
def text_field field, options = {}
|
66
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :value => object[field])
|
67
|
+
end
|
68
|
+
|
69
|
+
def text_area field, options = {}
|
70
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :value => object[field])
|
71
|
+
end
|
72
|
+
|
73
|
+
def password_field field, options = {}
|
74
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :value => object[field])
|
75
|
+
end
|
76
|
+
|
77
|
+
def select field, options = {}
|
78
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :selected => object[field])
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_box field, options = {}
|
82
|
+
if field.is_a?(String) && field =~ /\.on\Z/ && !options.key?(:checked)
|
83
|
+
options[:checked] = object[$`].on?
|
84
|
+
end
|
85
|
+
|
86
|
+
patched_check_box field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :checked => object[field])
|
87
|
+
end
|
88
|
+
|
89
|
+
def radio_button field, options = {}
|
90
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :selected => object[field])
|
91
|
+
end
|
92
|
+
|
93
|
+
def file_field field, options = {}
|
94
|
+
super field, options.reverse_merge(:id => setting_id(field), :name => setting_name(field), :value => object[field])
|
95
|
+
end
|
96
|
+
|
97
|
+
def time_zone_select field, options = {}
|
98
|
+
options.reverse_merge!(:id => setting_id(field), :value => object[field], :selected => field_value(field))
|
99
|
+
@template.send :time_zone_select, setting_name(field), options
|
100
|
+
end
|
101
|
+
|
102
|
+
def control_group_text_field field, options = {}
|
103
|
+
control_group_field :text_field, field, options
|
104
|
+
end
|
105
|
+
|
106
|
+
def control_group_text_area field, options = {}
|
107
|
+
control_group_field :text_area, field, options
|
108
|
+
end
|
109
|
+
|
110
|
+
def control_group_password_field field, options = {}
|
111
|
+
control_group_field :password_field, field, options
|
112
|
+
end
|
113
|
+
|
114
|
+
def control_group_select field, options = {}
|
115
|
+
control_group_field :select, field, options
|
116
|
+
end
|
117
|
+
|
118
|
+
def control_group_check_box field, options = {}
|
119
|
+
control_group_field :check_box, field, options
|
120
|
+
end
|
121
|
+
|
122
|
+
def control_group_radio_button field, options = {}
|
123
|
+
control_group_field :radio_button, field, options
|
124
|
+
end
|
125
|
+
|
126
|
+
def control_group_file_field field, options = {}
|
127
|
+
control_group_field :file_field, field, options
|
128
|
+
end
|
129
|
+
|
130
|
+
def control_group_time_zone_select field, options = {}
|
131
|
+
control_group_field :time_zone_select, field, options
|
132
|
+
end
|
133
|
+
|
134
|
+
protected
|
135
|
+
|
136
|
+
def object_name
|
137
|
+
@object_name || super
|
138
|
+
end
|
139
|
+
|
140
|
+
def field_id field, value=nil
|
141
|
+
id = super
|
142
|
+
id.gsub! "]", ""
|
143
|
+
id.gsub! "[", "_"
|
144
|
+
id
|
145
|
+
end
|
146
|
+
|
147
|
+
def builder_html_for field, settings = {}, &block
|
148
|
+
field_object = object.send field
|
149
|
+
|
150
|
+
builder_class = @template.send :configured_form_builder_class, settings[:builder] || self.class
|
151
|
+
builder = builder_class.new(@template, field_object)
|
152
|
+
builder.try :object_name=, "#{object_name}[#{field}]"
|
153
|
+
builder.try :object_field_name=, field
|
154
|
+
|
155
|
+
@template.capture_html(builder, &block)
|
156
|
+
end
|
157
|
+
|
158
|
+
def control_group_field field_type, field, options = {}
|
159
|
+
label_text = options.delete(:label) || field.to_s.split('.').last.titleize
|
160
|
+
|
161
|
+
css_classes = options[:class] || "input"
|
162
|
+
field_size = options[:size]
|
163
|
+
if field_size && field_size.is_a?(Symbol)
|
164
|
+
options.delete :size
|
165
|
+
css_classes += " input-#{field_size}"
|
166
|
+
end
|
167
|
+
|
168
|
+
label_html = label(field, :caption => label_text)
|
169
|
+
|
170
|
+
field_html = send field_type, field, options.merge(:class => css_classes)
|
171
|
+
|
172
|
+
id = setting_id(field) + "_group"
|
173
|
+
control_group_html id, label_html, field_html, options
|
174
|
+
end
|
175
|
+
|
176
|
+
def control_group_html id, label_html, field_html, options = {}
|
177
|
+
hidden = options[:hidden]
|
178
|
+
content = label_html + @template.tag(:div, :content => field_html, :class => 'controls')
|
179
|
+
@template.tag(:div, :id => id, :class => 'control-group', :content => content, :style => ("display:none" if hidden))
|
180
|
+
end
|
181
|
+
|
182
|
+
def setting_id setting
|
183
|
+
if setting.is_a? Symbol
|
184
|
+
field_id setting
|
185
|
+
else
|
186
|
+
"#{object_field_name || "settings"}_#{setting.gsub('.', '_')}"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def setting_name setting
|
191
|
+
"#{object_name}[#{setting.gsub('.', '][')}]"
|
192
|
+
end
|
193
|
+
|
194
|
+
def patched_check_box field, options = {}
|
195
|
+
unchecked_value = options.delete(:uncheck_value) || '0'
|
196
|
+
options.reverse_merge!(:id => field_id(field), :value => '1')
|
197
|
+
options.merge!(:checked => true) if values_matches_field?(field, options[:value])
|
198
|
+
html = hidden_field(field, :value => unchecked_value, :id => nil, :name => options[:name])
|
199
|
+
html << @template.check_box_tag(field_name(field), options)
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
end
|