rails-bootstrap-helpers 0.0.1 → 0.1.0
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/README.md +336 -14
- data/lib/rails-bootstrap-helpers.rb +14 -3
- data/lib/rails-bootstrap-helpers/helpers/accordion_helper.rb +8 -0
- data/lib/rails-bootstrap-helpers/helpers/alert_helper.rb +24 -14
- data/lib/rails-bootstrap-helpers/helpers/base_helper.rb +25 -13
- data/lib/rails-bootstrap-helpers/helpers/button_helper.rb +85 -13
- data/lib/rails-bootstrap-helpers/helpers/form_tag_helper.rb +42 -10
- data/lib/rails-bootstrap-helpers/helpers/navigation_helper.rb +17 -0
- data/lib/rails-bootstrap-helpers/helpers/options_helper.rb +24 -3
- data/lib/rails-bootstrap-helpers/helpers/tag_helper.rb +26 -0
- data/lib/rails-bootstrap-helpers/helpers/url_helper.rb +17 -0
- data/lib/rails-bootstrap-helpers/rails/engine.rb +4 -2
- data/lib/rails-bootstrap-helpers/renderers/{abstract_button_renderer.rb → abstract_link_renderer.rb} +23 -7
- data/lib/rails-bootstrap-helpers/renderers/accordion_renderer.rb +94 -0
- data/lib/rails-bootstrap-helpers/renderers/action_link_renderer.rb +19 -0
- data/lib/rails-bootstrap-helpers/renderers/button_renderer.rb +6 -4
- data/lib/rails-bootstrap-helpers/renderers/content_tag_renderer.rb +67 -0
- data/lib/rails-bootstrap-helpers/renderers/dropdown_button_renderer.rb +87 -0
- data/lib/rails-bootstrap-helpers/renderers/iconic_icon_renderer.rb +75 -0
- data/lib/rails-bootstrap-helpers/renderers/row_link_renderer.rb +12 -0
- data/lib/rails-bootstrap-helpers/renderers/tabbable_renderer.rb +186 -0
- data/lib/rails-bootstrap-helpers/version.rb +1 -1
- data/spec/dummy/log/test.log +296 -0
- data/spec/helpers/accordion_helper_spec.rb +35 -0
- data/spec/helpers/alert_helper_spec.rb +11 -7
- data/spec/helpers/base_helper_spec.rb +44 -0
- data/spec/helpers/button_helper_spec.rb +214 -9
- data/spec/helpers/form_tag_helper_spec.rb +27 -0
- data/spec/helpers/navigation_helper_spec.rb +228 -0
- data/spec/helpers/options_helper_spec.rb +50 -0
- data/spec/helpers/tag_helper_spec.rb +26 -0
- data/spec/helpers/url_helper_spec.rb +33 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/html.rb +9 -0
- data/spec/support/matchers/helpers/alert_helper/render_bs_alert.rb +19 -10
- data/spec/support/matchers/helpers/base_helper/render_icon.rb +18 -1
- data/spec/support/matchers/helpers/base_helper/render_iconic_icon.rb +191 -0
- data/spec/support/matchers/helpers/button_helper/render_bs_button_to.rb +44 -3
- data/spec/support/matchers/helpers/button_helper/render_inline_button_to.rb +1 -1
- data/spec/support/matchers/helpers/form_tag_helper/render_bs_button_tag.rb +39 -1
- data/spec/support/matchers/helpers/form_tag_helper/render_bs_submit_tag.rb +96 -0
- data/spec/support/matchers/helpers/url_helper/render_action_link_to.rb +123 -0
- data/spec/support/matchers/helpers/url_helper/render_row_link_to.rb +97 -0
- metadata +59 -8
- checksums.yaml +0 -15
data/lib/rails-bootstrap-helpers/renderers/{abstract_button_renderer.rb → abstract_link_renderer.rb}
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
module RailsBootstrapHelpers::Renderers
|
2
|
-
class
|
2
|
+
class AbstractLinkRenderer < Renderer
|
3
3
|
def initialize (template, type, *args, &block)
|
4
4
|
super template
|
5
5
|
@args = args
|
@@ -22,9 +22,10 @@ module RailsBootstrapHelpers::Renderers
|
|
22
22
|
attr_accessor :options
|
23
23
|
attr_accessor :html_options
|
24
24
|
attr_accessor :text
|
25
|
+
attr_accessor :type
|
25
26
|
|
26
27
|
def method
|
27
|
-
case
|
28
|
+
case type
|
28
29
|
when :link then :link_to
|
29
30
|
when :button then :button_tag
|
30
31
|
else :link_to
|
@@ -32,7 +33,7 @@ module RailsBootstrapHelpers::Renderers
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def new_args
|
35
|
-
case
|
36
|
+
case type
|
36
37
|
when :link
|
37
38
|
[text, options, html_options, *self.args[3 .. -1]]
|
38
39
|
when :button then
|
@@ -57,10 +58,15 @@ module RailsBootstrapHelpers::Renderers
|
|
57
58
|
def append_class (cls)
|
58
59
|
return unless cls
|
59
60
|
|
60
|
-
if c = html_options[
|
61
|
-
html_options[
|
61
|
+
if c = html_options["class"]
|
62
|
+
html_options["class"] << " " + cls.to_s
|
62
63
|
else
|
63
|
-
|
64
|
+
if c = has_option?("class")
|
65
|
+
c << " " + cls.to_s
|
66
|
+
cls = c
|
67
|
+
end
|
68
|
+
|
69
|
+
html_options["class"] = cls.to_s
|
64
70
|
end
|
65
71
|
end
|
66
72
|
|
@@ -68,9 +74,19 @@ module RailsBootstrapHelpers::Renderers
|
|
68
74
|
|
69
75
|
def extract_options!
|
70
76
|
self.options = args[1]
|
71
|
-
|
77
|
+
|
78
|
+
if options.is_a?(Hash)
|
79
|
+
self.options = bs_options(options)
|
80
|
+
self.options = options.stringify_keys
|
81
|
+
end
|
82
|
+
|
72
83
|
self.html_options = args[2] || {}
|
84
|
+
self.html_options = bs_options(html_options)
|
73
85
|
self.html_options = html_options.stringify_keys
|
86
|
+
|
87
|
+
if cls = html_options["class"]
|
88
|
+
html_options["class"] = cls.dup
|
89
|
+
end
|
74
90
|
end
|
75
91
|
|
76
92
|
def _has_option? (key, options, html_options = nil)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module RailsBootstrapHelpers::Renderers
|
2
|
+
class AccordionRenderer < Renderer
|
3
|
+
def initialize (template, id, &block)
|
4
|
+
super template
|
5
|
+
@id = id
|
6
|
+
@block = block
|
7
|
+
@selector = Selector.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
@context = AccordionContext.new(self)
|
12
|
+
block.call(context)
|
13
|
+
build_accordion
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
attr_reader :id
|
18
|
+
attr_reader :block
|
19
|
+
attr_reader :selector
|
20
|
+
attr_reader :context
|
21
|
+
|
22
|
+
def build_accordion
|
23
|
+
content_tag :div, id: id, class: "accordion" do
|
24
|
+
contents = []
|
25
|
+
selector.base "##{id}.accordion" do |base|
|
26
|
+
context.groups.each_with_index do |group, count|
|
27
|
+
contents << build_group(group, count, base)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
contents.join("\n").html_safe
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_group (group, count, accordion_base)
|
36
|
+
base = "accordion-group"
|
37
|
+
|
38
|
+
selector.base ".#{base}" do |group_base|
|
39
|
+
foobar = self
|
40
|
+
content_tag(:div, class: base) do
|
41
|
+
body = "accordion-body"
|
42
|
+
build_heading(group.heading, body, count, accordion_base, group_base) +
|
43
|
+
build_body(body, group.block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def build_heading (heading, body, count, accordion_base, group_base)
|
49
|
+
href = "#{group_base}:nth-child(#{count + 1}) .#{body}.collapse"
|
50
|
+
|
51
|
+
content_tag :div, class: "accordion-heading" do
|
52
|
+
content_tag :a, heading,
|
53
|
+
href: href,
|
54
|
+
class: "accordion-toggle",
|
55
|
+
:"data-toggle" => "collapse",
|
56
|
+
:"data-parent" => accordion_base
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def build_body (body, block)
|
61
|
+
content_tag :div, class: body + " collapse" do
|
62
|
+
content_tag :div, class: "accordion-inner", &block
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class AccordionContext
|
67
|
+
Group = Struct.new(:heading, :block)
|
68
|
+
|
69
|
+
attr_reader :groups
|
70
|
+
|
71
|
+
def initialize (renderer)
|
72
|
+
@renderer = renderer
|
73
|
+
@groups = []
|
74
|
+
end
|
75
|
+
|
76
|
+
def group (heading, &block)
|
77
|
+
@groups << Group.new(heading, block)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class Selector
|
82
|
+
def initialize
|
83
|
+
@base = []
|
84
|
+
end
|
85
|
+
|
86
|
+
def base (base, &block)
|
87
|
+
@base << base
|
88
|
+
block.call @base.join(" ")
|
89
|
+
ensure
|
90
|
+
@base.pop
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RailsBootstrapHelpers::Renderers
|
2
|
+
class ActionLinkRenderer < AbstractLinkRenderer
|
3
|
+
def initialize (template, *args, &block)
|
4
|
+
super template, :link, *args, &block
|
5
|
+
end
|
6
|
+
|
7
|
+
def render
|
8
|
+
append_class "act"
|
9
|
+
|
10
|
+
if style = has_option?("style")
|
11
|
+
unless style.to_s == "default"
|
12
|
+
append_class "act-" + style.to_s
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module RailsBootstrapHelpers::Renderers
|
2
|
-
class ButtonRenderer <
|
2
|
+
class ButtonRenderer < AbstractLinkRenderer
|
3
|
+
include RailsBootstrapHelpers::Helpers::BaseHelper
|
4
|
+
|
3
5
|
def render
|
4
6
|
append_class "btn"
|
5
7
|
|
6
|
-
if style = has_option?("style")
|
8
|
+
if (style = has_option?("style")) && style != "default"
|
7
9
|
append_class "btn-" + style.to_s
|
8
10
|
end
|
9
11
|
|
@@ -20,9 +22,9 @@ module RailsBootstrapHelpers::Renderers
|
|
20
22
|
icon_args = [icon, invert: has_option?("icon_invert")]
|
21
23
|
|
22
24
|
if pos.to_s == "right"
|
23
|
-
self.text = self.text.to_s + " " +
|
25
|
+
self.text = self.text.to_s + " " + icon(*icon_args)
|
24
26
|
else
|
25
|
-
self.text =
|
27
|
+
self.text = icon(*icon_args) + " " + self.text.to_s
|
26
28
|
end
|
27
29
|
|
28
30
|
self.text = self.text.html_safe
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module RailsBootstrapHelpers::Renderers
|
2
|
+
class ContentTagRenderer < Renderer
|
3
|
+
def initialize (template, name, options, &block)
|
4
|
+
super template
|
5
|
+
|
6
|
+
@name = name
|
7
|
+
@options = options
|
8
|
+
@block = block
|
9
|
+
|
10
|
+
@indentation_level = 0
|
11
|
+
@default_indentation = 2
|
12
|
+
@buffer = ""
|
13
|
+
@context = Context.new(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def render
|
17
|
+
content_tag_impl(name, options, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :name
|
23
|
+
attr_reader :content
|
24
|
+
attr_reader :options
|
25
|
+
attr_reader :block
|
26
|
+
attr_reader :context
|
27
|
+
attr_reader :buffer
|
28
|
+
attr_reader :default_indentation
|
29
|
+
|
30
|
+
def content_tag_impl (name, options = {}, &block)
|
31
|
+
append tag(name, options, true)
|
32
|
+
indent { context.instance_eval(&block) }
|
33
|
+
append "</#{name}>"
|
34
|
+
buffer.html_safe
|
35
|
+
end
|
36
|
+
|
37
|
+
def indent (&block)
|
38
|
+
last_indentation_level = @indentation_level
|
39
|
+
@indentation_level += default_indentation
|
40
|
+
block.call
|
41
|
+
ensure
|
42
|
+
@indentation_level = last_indentation_level
|
43
|
+
end
|
44
|
+
|
45
|
+
def append (string)
|
46
|
+
unless string.nil?
|
47
|
+
buffer << " " * @indentation_level
|
48
|
+
buffer << string
|
49
|
+
buffer << "\n"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Context
|
54
|
+
def initialize (renderer)
|
55
|
+
@renderer = renderer
|
56
|
+
end
|
57
|
+
|
58
|
+
def bs_content_tag (name, options = {}, &block)
|
59
|
+
@renderer.send :content_tag_impl, name, options, &block
|
60
|
+
end
|
61
|
+
|
62
|
+
def append (string)
|
63
|
+
@renderer.send :append, string
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module RailsBootstrapHelpers::Renderers
|
2
|
+
class DropdownButtonRenderer < Renderer
|
3
|
+
def initialize (template, text, url_or_options = nil, options = {}, &block)
|
4
|
+
super template
|
5
|
+
@text = text
|
6
|
+
@block = block
|
7
|
+
|
8
|
+
extract_args!(url_or_options, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
button_group do
|
13
|
+
render_toggle_button + "\n" +
|
14
|
+
render_menu
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
attr_reader :options
|
20
|
+
attr_reader :url
|
21
|
+
attr_reader :split
|
22
|
+
attr_reader :block
|
23
|
+
attr_reader :text
|
24
|
+
|
25
|
+
def extract_args! (url_or_options, options)
|
26
|
+
if url_or_options.is_a?(Hash)
|
27
|
+
@options = url_or_options.dup
|
28
|
+
@split = false
|
29
|
+
elsif url_or_options.nil?
|
30
|
+
@options = options.dup
|
31
|
+
@split = false
|
32
|
+
else
|
33
|
+
@url = url_or_options
|
34
|
+
@options = options.dup
|
35
|
+
@split = true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def render_toggle_button
|
40
|
+
if split
|
41
|
+
bs_button_to(text, url, options) << "\n" <<
|
42
|
+
render_toggle_button_impl(false)
|
43
|
+
else
|
44
|
+
render_toggle_button_impl(true)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def toggle_options
|
49
|
+
@toggle_options ||= begin
|
50
|
+
opts = split ? {} : options.deep_dup
|
51
|
+
data = opts[:data] || {}
|
52
|
+
data[:toggle] = "dropdown"
|
53
|
+
opts[:data] = data
|
54
|
+
|
55
|
+
append_class!(opts, "dropdown-toggle")
|
56
|
+
|
57
|
+
if (style = options[:style]) && style != "default"
|
58
|
+
append_class!(opts, "btn-#{style}")
|
59
|
+
end
|
60
|
+
|
61
|
+
opts
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def render_caret
|
66
|
+
content_tag :span, nil, class: "caret"
|
67
|
+
end
|
68
|
+
|
69
|
+
def render_toggle_button_impl (with_text)
|
70
|
+
text = with_text ? text_with_caret : render_caret
|
71
|
+
bs_button_tag text, nil, toggle_options
|
72
|
+
end
|
73
|
+
|
74
|
+
def text_with_caret
|
75
|
+
@text_with_caret ||= begin
|
76
|
+
escaped_text = ERB::Util.html_escape(text)
|
77
|
+
(escaped_text + " " + render_caret).html_safe
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def render_menu
|
82
|
+
content_tag :ul, class: "dropdown-menu" do
|
83
|
+
template.capture(&block)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module RailsBootstrapHelpers::Renderers
|
2
|
+
class IconicIconRenderer < Renderer
|
3
|
+
def initialize (template, icon, options)
|
4
|
+
super template
|
5
|
+
@icon = icon
|
6
|
+
@options = options.dup
|
7
|
+
end
|
8
|
+
|
9
|
+
def render
|
10
|
+
icon = ERB::Util.html_escape(@icon.to_s)
|
11
|
+
append_class!(options, "iconic-#{icon}")
|
12
|
+
append_style(:color, options.delete(:color))
|
13
|
+
|
14
|
+
handle_size
|
15
|
+
handle_bs_style
|
16
|
+
handle_action_style
|
17
|
+
|
18
|
+
content_tag :i, "", bs_options(options)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :icon
|
24
|
+
attr_reader :options
|
25
|
+
|
26
|
+
def handle_bs_style
|
27
|
+
if bs_style = options.delete(:bs_style)
|
28
|
+
if bs_style.to_s == "muted"
|
29
|
+
append_class!(options, :muted)
|
30
|
+
else
|
31
|
+
append_class!(options, "text-#{bs_style}")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def handle_action_style
|
37
|
+
if action_style = options.delete(:action_style)
|
38
|
+
append_class!(options, "act")
|
39
|
+
|
40
|
+
unless action_style.to_s == "default"
|
41
|
+
append_class!(options, "act-#{action_style}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def handle_size
|
47
|
+
if size = options.delete(:size)
|
48
|
+
size = size.to_s
|
49
|
+
|
50
|
+
if size.to_i > 0
|
51
|
+
size << "px"
|
52
|
+
end
|
53
|
+
|
54
|
+
append_style("font-size", size)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def append_style (key, value)
|
59
|
+
if value
|
60
|
+
style = options[:style].to_s
|
61
|
+
|
62
|
+
if style.present?
|
63
|
+
unless style.end_with?(";")
|
64
|
+
style << ";"
|
65
|
+
end
|
66
|
+
|
67
|
+
style << " "
|
68
|
+
end
|
69
|
+
|
70
|
+
style << "#{key}: #{value};"
|
71
|
+
options[:style] = style
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|