bootstrap_ui_helper 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e26314f2f2b54fc50aefdafbc176c0ad65e5a463
4
- data.tar.gz: 98f766aa947346510ebb84319f1a240dcd521d89
3
+ metadata.gz: ddccba0e62ae94336a902898de6bfecf864d0913
4
+ data.tar.gz: 301bc1e5129a8c32ffe65712ea35b7781936bcf9
5
5
  SHA512:
6
- metadata.gz: d09a35756e59cc30cb942c824d2847a9f6871745699e0df2a0d8e6b7ad285a408c6cc8989e9662e528244aad891972fc10cf942fcc1e38219b8f520d4fd3750a
7
- data.tar.gz: a731800e6c67852e1a6621129a1fa37dc213b8be8dca949793c8101014ef13eb6d1013f7ecd8a55373bba40f4eee56763523b0bb1b2da3c0b33ee4d384d48817
6
+ metadata.gz: d9a732dd179af6596ed50b9ad5e506d82c907b27947fb45e8873a71f1469d47373bb60ada764dc8f5bbfd44aa5c73ea4327c708ae1facfcb6f81fbe76f49b534
7
+ data.tar.gz: b48ed5fb3ad875fddaec24e155609b71b7a827d0800b1cbab3510ebe9fc82704bd941ba201ea167bd836dce9ed597575c14eac034488997279a3fd5973a2d21a
data/CHANGELOG.md CHANGED
@@ -1,2 +1,24 @@
1
- ##v0.3.1
2
- - fix and improve dropdown helper
1
+ # bootstrap_ui_helper Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ bootstrap_ui_helper is in a 0.3.2 beta state. This means that its APIs and behavior are subject to breaking changes without deprecation notices.
6
+
7
+ ## [0.3.1](https://github.com/Sen-Zhang/bootstrap_ui_helper/releases/tag/0.3.1) (2015-10-16)
8
+
9
+ Fixes:
10
+
11
+ * Fix dropdown_helper
12
+
13
+ ## [0.3.2](https://github.com/Sen-Zhang/bootstrap_ui_helper/releases/tag/0.3.2) (2015-11-09)
14
+
15
+ Changes:
16
+
17
+ * Redo panel_helper
18
+ * Redo modal_helper
19
+ * Refactor icon_helper
20
+ * Refactor panel_helper
21
+ * Refactor panel_row_helper
22
+ * Refactor nav_helper
23
+ * Refactor navbar_helper
24
+ * Refactor form_helper
data/README.md CHANGED
@@ -38,11 +38,3 @@ In `application.css`, add the following line:
38
38
  ## Usage
39
39
 
40
40
  Please proceed to http://sen-zhang.github.io/#/articles/bootstrap_ui_helper for more details and examples on how to use the helpers.
41
-
42
- ## Contributing
43
-
44
- 1. Fork it ( https://github.com/[my-github-username]/bootstrap_ui_helper/fork )
45
- 2. Create your feature branch (`git checkout -b my-new-feature`)
46
- 3. Commit your changes (`git commit -am 'Add some feature'`)
47
- 4. Push to the branch (`git push origin my-new-feature`)
48
- 5. Create a new Pull Request
@@ -1,5 +1,5 @@
1
- (function ($) {
2
- "use strict";
1
+ (function ($, document) {
2
+ 'use strict';
3
3
 
4
4
  /*
5
5
  * create a jquery DOM element based on tag name and options
@@ -19,27 +19,33 @@
19
19
  */
20
20
  $.fn.nav = function () {
21
21
  var $this = $(this),
22
- activeChildLocator = $this.data("active-el-locator"),
22
+ activeChildLocator = $this.data('active-el-locator'),
23
23
  children = $this.children();
24
24
 
25
25
  if (activeChildLocator % 1 === 0) {
26
- $(children[activeChildLocator]).attr("active", true);
26
+ $(children[activeChildLocator]).attr('active', true);
27
27
  } else {
28
- $this.children(activeChildLocator).attr("active", true);
28
+ $this.children(activeChildLocator).attr('active', true);
29
29
  }
30
30
 
31
31
  $this.children().remove();
32
32
 
33
33
  children.each(function () {
34
34
  var $child = $(this),
35
- wrapper = createElement("li", {role: "presentation"});
35
+ wrapper;
36
36
 
37
- if ($child.attr("active") === "true") {
38
- $child.removeAttr("active");
39
- wrapper.addClass("active");
40
- }
37
+ if ($child.prop('tagName') === 'LI') {
38
+ $this.append($child);
39
+ } else {
40
+ wrapper = createElement('li', {role: 'presentation'});
41
+
42
+ if ($child.attr('active') === 'true') {
43
+ $child.removeAttr('active');
44
+ wrapper.addClass('active');
45
+ }
41
46
 
42
- $this.append(wrapper.append($child));
47
+ $this.append(wrapper.append($child));
48
+ }
43
49
  });
44
50
  };
45
51
 
@@ -50,14 +56,14 @@
50
56
  */
51
57
  $.fn.panelRow = function () {
52
58
  var $this = $(this),
53
- columnClass = $this.data("column-class"),
59
+ columnClass = $this.data('column-class'),
54
60
  children = $this.children();
55
61
 
56
62
  $this.children().remove();
57
63
 
58
64
  children.each(function () {
59
65
  var $child = $(this),
60
- wrapper = createElement("div");
66
+ wrapper = createElement('div');
61
67
 
62
68
  $this.append(wrapper.addClass(columnClass).append($child));
63
69
  });
@@ -65,13 +71,13 @@
65
71
 
66
72
  /*
67
73
  * Button Group
68
- * make sure children button group has the same size of their parents"
74
+ * make sure children button group has the same size of their parents
69
75
  *
70
76
  */
71
77
  $.fn.buttonGroup = function () {
72
78
  var $this = $(this);
73
79
 
74
- $this.children(".btn-group").addClass($this.data("size"));
80
+ $this.children('.btn-group').addClass($this.data('size'));
75
81
  };
76
82
 
77
83
  /*
@@ -79,19 +85,19 @@
79
85
  *
80
86
  */
81
87
  $.fn.navBar = function () {
82
- var $this = $(this),
83
- $burgerBtn = $this.find(".navbar-toggle"),
84
- $collapse = $this.find(".navbar-collapse");
88
+ var $this = $(this),
89
+ $burgerBtn = $this.find('.navbar-toggle'),
90
+ $collapse = $this.find('.navbar-collapse');
85
91
 
86
92
  if ($burgerBtn.length > 0 && $collapse.length > 0) {
87
- var collapseId = $collapse.attr("id");
93
+ var collapseId = $collapse.attr('id');
88
94
 
89
- if ($collapse.attr("id") === undefined) {
95
+ if ($collapse.attr('id') === undefined) {
90
96
  collapseId = Math.random().toString(36).substring(7);
91
- $collapse.attr("id", collapseId);
97
+ $collapse.attr('id', collapseId);
92
98
  }
93
99
 
94
- $burgerBtn.attr("data-target", "#" + collapseId);
100
+ $burgerBtn.attr('data-target', '#' + collapseId);
95
101
  }
96
102
  };
97
103
 
@@ -110,4 +116,4 @@
110
116
  $("[data-bui='btn_group']").buttonGroup();
111
117
 
112
118
  });
113
- })(jQuery);
119
+ })(window.jQuery, window.document);
@@ -1,16 +1,12 @@
1
1
  module AlertBoxHelper
2
2
  include ActionView::Helpers
3
+ include FormatHelper
3
4
 
4
5
  def alert_box(content_or_options=nil, options={}, &block)
5
- if content_or_options.is_a?(Hash)
6
- options = content_or_options
7
- else
8
- content = content_or_options
9
- end
10
-
11
- dismissible = options.delete(:dismiss).present?
12
- klass = options.delete(:class)
13
- type = alert_type(options.delete(:type))
6
+ content, options = parse_content_or_options(content_or_options, options)
7
+ dismissible = options.delete(:dismiss).present?
8
+ klass = options.delete(:class)
9
+ type = alert_type(options.delete(:type))
14
10
 
15
11
  prepend_class(options, 'alert', type, klass)
16
12
  options[:role] = 'alert'
@@ -3,10 +3,12 @@ module BootstrapFormHelper
3
3
  include PanelHelper
4
4
 
5
5
  mattr_accessor :layout
6
+ alias_method :fieldset, :panel
7
+
6
8
  FIELD_HELPERS = [:email_field, :password_field, :text_field, :text_area,
7
9
  :search_field, :telephone_field, :url_field, :number_field,
8
10
  :file_field, :date_field, :time_field, :month_field,
9
- :week_field, :datetime_field]
11
+ :week_field, :datetime_field, :datetime_local_field]
10
12
 
11
13
  def form_for(record, options = {}, &block)
12
14
  html_options = options[:html] ||= {}
@@ -17,8 +19,7 @@ module BootstrapFormHelper
17
19
  super
18
20
  end
19
21
 
20
- # TODO: color_field, datetime_local_field, range_field
21
-
22
+ # TODO: color_field, range_field
22
23
  FIELD_HELPERS.each do |helper|
23
24
  define_method helper do |object_name, method, options={}|
24
25
  label_class, field_wrapper = ['col-sm-3 control-label', true] if layout == :horizontal
@@ -26,18 +27,18 @@ module BootstrapFormHelper
26
27
  prepend_class(options, 'form-control') unless __callee__ == :file_field
27
28
 
28
29
  required = 'required' if options.delete(:required)
29
- label_sr_only = 'sr-only' if options[:label].is_a?(FalseClass)
30
+ label_sr_only = 'sr-only' if options[:label].is_a?(FalseClass) || layout == :inline
30
31
  label_class = squeeze_n_strip("#{label_class} #{required} #{label_sr_only}")
31
- help_text = (options[:help] ? "<span class='help-block text-left'>#{options[:help]}</span>" : '').html_safe
32
+ help_text = render_help_text(options.delete(:help))
32
33
  prefix_content = options.delete(:prefix)
33
34
  suffix_content = options.delete(:suffix)
34
35
 
35
- label_proc = proc { label(object_name, method, options[:label], class: label_class) }
36
+ label_proc = proc { label(object_name, method, options.delete(:label), class: label_class) }
36
37
 
37
38
  input_proc = proc do
38
39
  input_content = if prefix_content.present? || suffix_content.present?
39
- prefix_addon = build_input_addon(prefix_content)
40
- suffix_addon = build_input_addon(suffix_content)
40
+ prefix_addon = render_input_addon(prefix_content)
41
+ suffix_addon = render_input_addon(suffix_content)
41
42
  content_tag :div, class: 'input-group' do
42
43
  prefix_addon + super(object_name, method, options) + suffix_addon
43
44
  end
@@ -50,44 +51,46 @@ module BootstrapFormHelper
50
51
 
51
52
  render_field(field_wrapper, label_proc, input_proc)
52
53
  end
54
+ end
53
55
 
54
- def fields_for(record_name, record_object = nil, options = {}, &block)
55
- fieldset = HashWithIndifferentAccess.new(options.delete(:fieldset))
56
+ def fields_for(record_name, record_object = nil, options = {}, &block)
57
+ fieldset = HashWithIndifferentAccess.new(options.delete(:fieldset))
56
58
 
57
- if fieldset.present?
58
- type = get_panel_type(fieldset[:type])
59
- title = fieldset[:title]
60
- end
59
+ if fieldset.present?
60
+ type = get_panel_type(fieldset[:type])
61
+ title = fieldset[:title]
62
+ end
61
63
 
62
- content_tag :fieldset, class: "panel #{type}" do
63
- ((title.present? ? (content_tag :div, title, class: 'panel-heading') : '') +
64
- (content_tag :div, class: 'panel-body' do
65
- super
66
- end)).html_safe
67
- end
64
+ content_tag :fieldset, class: "panel #{type}" do
65
+ ((title.present? ? (content_tag :div, title, class: 'panel-heading') : '') +
66
+ (content_tag :div, class: 'panel-body' do
67
+ super
68
+ end)).html_safe
68
69
  end
70
+ end
69
71
 
70
- alias_method :fieldset, :panel
72
+ def render_help_text(help)
73
+ (help.present? ? "<span class='help-block text-left'>#{help}</span>" : '').html_safe
74
+ end
71
75
 
72
- def build_input_addon(content)
73
- return ('').html_safe if content.blank?
76
+ def render_input_addon(content)
77
+ return ('').html_safe if content.blank?
74
78
 
75
- if content.is_a?(String)
76
- "<span class='input-group-addon'>#{content}</span>".html_safe
77
- elsif content.is_a?(Hash) && content.key?(:icon)
78
- "<span class='input-group-addon'>#{icon(content[:icon])}</span>".html_safe
79
- else
80
- ('').html_safe
81
- end
79
+ if content.is_a?(String)
80
+ "<span class='input-group-addon'>#{content}</span>".html_safe
81
+ elsif content.is_a?(Hash) && content.key?(:icon)
82
+ "<span class='input-group-addon'>#{icon(content[:icon])}</span>".html_safe
83
+ else
84
+ ('').html_safe
82
85
  end
86
+ end
83
87
 
84
- def render_field(inline_style, label_proc, input_proc)
85
- content_tag :div, class: 'form-group' do
86
- if inline_style
87
- (label_proc.call + (content_tag :div, class: 'col-sm-9', &input_proc)).html_safe
88
- else
89
- (label_proc.call + input_proc.call).html_safe
90
- end
88
+ def render_field(inline_style, label_proc, input_proc)
89
+ content_tag :div, class: 'form-group' do
90
+ if inline_style
91
+ (label_proc.call + (content_tag :div, class: 'col-sm-9', &input_proc)).html_safe
92
+ else
93
+ (label_proc.call + input_proc.call).html_safe
91
94
  end
92
95
  end
93
96
  end
@@ -99,56 +102,25 @@ module BootstrapFormHelper
99
102
  attr_accessor :output_buffer
100
103
 
101
104
  def check_box(method, options = {}, checked_value = '1', unchecked_value = '0')
102
- layout_inline = options.delete(:layout).try(:to_sym) == :inline
105
+ layout_inline, help_text, label = parse_options(options)
103
106
 
104
- check_box = proc do
105
- proc = proc do
106
- @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value) +
107
- options[:label]
108
- end
109
-
110
- if layout_inline
111
- content_tag :label, class: 'checkbox-inline', &proc
112
- else
113
- content_tag :div, class: 'checkbox' do
114
- content_tag :label, &proc
115
- end
116
- end
107
+ check_box_proc = proc do
108
+ @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value) +
109
+ label
117
110
  end
118
111
 
119
- if horizontal_layout?
120
- content_tag :div, class: 'form-group' do
121
- content_tag :div, class: 'col-sm-offset-3 col-sm-9', &check_box
122
- end
123
- else
124
- check_box.call
125
- end
112
+ render_input_field(layout_inline, help_text, :checkbox, &check_box_proc)
126
113
  end
127
114
 
128
115
  def radio_button(method, tag_value, options = {})
129
- layout_inline = options.delete(:layout).try(:to_sym) == :inline
116
+ layout_inline, help_text, label = parse_options(options)
130
117
 
131
- radio_button = proc do
132
- proc = proc do
133
- @template.radio_button(@object_name, method, tag_value, objectify_options(options)) + options[:label]
134
- end
135
-
136
- if layout_inline
137
- content_tag :label, class: 'radio-inline', &proc
138
- else
139
- content_tag :div, class: 'radio' do
140
- content_tag :label, &proc
141
- end
142
- end
118
+ radio_button_proc = proc do
119
+ @template.radio_button(@object_name, method, tag_value, objectify_options(options)) +
120
+ label
143
121
  end
144
122
 
145
- if horizontal_layout?
146
- content_tag :div, class: 'form-group' do
147
- content_tag :div, class: 'col-sm-offset-3 col-sm-9', &radio_button
148
- end
149
- else
150
- radio_button.call
151
- end
123
+ render_input_field(layout_inline, help_text, :radio, &radio_button_proc)
152
124
  end
153
125
 
154
126
  def submit(value=nil, options={})
@@ -167,6 +139,33 @@ module BootstrapFormHelper
167
139
  end
168
140
 
169
141
  private
142
+ def parse_options(options)
143
+ layout_inline = options.delete(:layout).try(:to_sym) == :inline
144
+ help_text = render_help_text(options.delete(:help))
145
+ label = options.delete(:label)
146
+
147
+ [layout_inline, help_text, label]
148
+ end
149
+
150
+ def get_input_lambda(layout_inline, help_text, type, &block)
151
+ lambda do
152
+ return (content_tag :label, class: "#{type}-inline", &block) + help_text if layout_inline
153
+
154
+ (content_tag :div, class: "#{type}" do
155
+ content_tag :label, &block
156
+ end) + help_text
157
+ end
158
+ end
159
+
160
+ def render_input_field(layout_inline, help_text, type, &block)
161
+ input_lambda = get_input_lambda(layout_inline, help_text, type, &block)
162
+
163
+ return input_lambda.call unless horizontal_layout?
164
+
165
+ content_tag :div, class: 'form-group' do
166
+ content_tag :div, class: 'col-sm-offset-3 col-sm-9', &input_lambda
167
+ end
168
+ end
170
169
 
171
170
  def horizontal_layout?
172
171
  BootstrapFormHelper.layout == :horizontal
@@ -174,17 +173,16 @@ module BootstrapFormHelper
174
173
  end
175
174
 
176
175
  private
177
-
178
176
  def get_form_layout(form_layout)
179
177
  case form_layout.try(:to_sym)
180
178
  when :horizontal
181
- layout = :horizontal
179
+ self.layout = :horizontal
182
180
  'form form-horizontal'
183
181
  when :inline
184
- layout = :inline
182
+ self.layout = :inline
185
183
  'form form-inline'
186
184
  else
187
- layout = :basic
185
+ self.layout = :basic
188
186
  'form'
189
187
  end
190
188
  end
@@ -4,16 +4,15 @@ module BootstrapFormOptionsHelper
4
4
  include FormatHelper
5
5
  include BootstrapFormHelper
6
6
 
7
-
8
7
  def select(method, choices = nil, options = {}, html_options = {}, &block)
9
8
  label_class, field_wrapper = horizontal_layout? ? ['col-sm-3 control-label', true] : []
10
9
 
11
- required = 'required' if html_options.delete(:required)
12
- label_sr_only = 'sr-only' if html_options[:label].is_a?(FalseClass)
13
- html_options[:class] = squeeze_n_strip("form-control #{html_options[:class]}")
14
- label_class = squeeze_n_strip("#{label_class} #{required} #{label_sr_only}")
15
- help_text = (html_options[:help] ? "<span class='help-block text-left'>#{html_options[:help]}</span>" : '').html_safe
10
+ required = 'required' if options.delete(:required)
11
+ label_sr_only = 'sr-only' if options[:label].is_a?(FalseClass) || layout == :inline
12
+ label_class = squeeze_n_strip("#{label_class} #{required} #{label_sr_only}")
13
+ help_text = render_help_text(options.delete(:help))
16
14
 
15
+ prepend_class(html_options, 'form-control')
17
16
  select_proc = proc do
18
17
  @template.select(@object_name,
19
18
  method,
@@ -22,38 +21,49 @@ module BootstrapFormOptionsHelper
22
21
  @default_options.merge(html_options),
23
22
  &block) + help_text
24
23
  end
25
-
26
- label_proc = proc { label(method, html_options[:label], class: label_class) }
24
+ label_proc = proc { label(method, options.delete(:label), class: label_class) }
27
25
 
28
26
  render_field(field_wrapper, label_proc, select_proc)
29
27
  end
30
28
 
31
29
  def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
32
30
  check_boxes_proc = proc do
33
- @template.collection_check_boxes(@object_name, method, collection, value_method, text_method,
34
- objectify_options(options), @default_options.merge(html_options),
31
+ @template.collection_check_boxes(@object_name,
32
+ method,
33
+ collection,
34
+ value_method,
35
+ text_method,
36
+ objectify_options(options),
37
+ @default_options.merge(html_options),
35
38
  &block)
36
39
  end
37
40
 
38
- render_collection(options[:label], &check_boxes_proc)
41
+ render_collection(options.delete(:label), &check_boxes_proc)
39
42
  end
40
43
 
41
44
  def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
42
- radion_buttons_prc = proc do
43
- @template.collection_radio_buttons(@object_name, method, collection, value_method, text_method,
44
- objectify_options(options), @default_options.merge(html_options),
45
+ radio_buttons_proc = proc do
46
+ @template.collection_radio_buttons(@object_name,
47
+ method,
48
+ collection,
49
+ value_method,
50
+ text_method,
51
+ objectify_options(options),
52
+ @default_options.merge(html_options),
45
53
  &block)
46
54
  end
47
55
 
48
- render_collection(options[:label], &radion_buttons_prc)
56
+ render_collection(options.delete(:label), &radio_buttons_proc)
49
57
  end
50
58
 
51
59
  private
52
60
 
53
61
  def render_label(label)
54
- label_class = 'col-sm-3 control-label' if horizontal_layout?
62
+ label_class = horizontal_layout? ? 'col-sm-3 control-label' : ''
63
+ label_class += ' sr-only' if label.blank?
55
64
 
56
- label.present? ? "<label class='#{label_class}'>#{label}</label> " : ''
65
+ rendered_label = ("<label class='#{label_class}'>#{label}</label> ").html_safe
66
+ basic_layout? ? content_tag(:div, rendered_label) : rendered_label
57
67
  end
58
68
 
59
69
  def render_input(&input_block)
@@ -66,6 +76,10 @@ module BootstrapFormOptionsHelper
66
76
  end
67
77
  end
68
78
 
79
+ def basic_layout?
80
+ BootstrapFormHelper.layout == :basic
81
+ end
82
+
69
83
  def horizontal_layout?
70
84
  BootstrapFormHelper.layout == :horizontal
71
85
  end
@@ -77,7 +91,7 @@ module BootstrapFormOptionsHelper
77
91
  def render(&block)
78
92
  rendered_collection = render_collection do |item, value, text, default_html_options|
79
93
  default_html_options[:multiple] = true
80
- builder = instantiate_builder(CheckBoxBuilder, item, value, text, default_html_options)
94
+ builder = instantiate_builder(CheckBoxBuilder, item, value, text, default_html_options)
81
95
 
82
96
  if block_given?
83
97
  @template_object.capture(builder, &block)
@@ -3,16 +3,14 @@ module ButtonHelper
3
3
  include FormatHelper
4
4
 
5
5
  def button(content_or_options=nil, options={}, &block)
6
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
6
+ content, options = parse_content_or_options(content_or_options, options)
7
7
 
8
8
  layout = 'btn-block' if options.delete(:layout).try(:to_sym) == :block
9
9
  size = get_btn_size(options.delete(:size))
10
10
  type = get_btn_type(options.delete(:type))
11
11
  prepend_class(options, 'btn', type, size, layout)
12
12
 
13
- content_tag :button, options do
14
- content.presence || capture(&block)
15
- end
13
+ content_tag :button, (content.presence || capture(&block)), options
16
14
  end
17
15
 
18
16
  def button_group(options={}, &block)
@@ -38,7 +36,7 @@ module ButtonHelper
38
36
  end
39
37
 
40
38
  def navbar_button(content_or_options=nil, options={}, &block)
41
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
39
+ content, options = parse_content_or_options(content_or_options, options)
42
40
 
43
41
  prepend_class(options, 'navbar-btn')
44
42
  button content, options, &block
@@ -133,8 +133,4 @@ module DropdownHelper
133
133
 
134
134
  DropdownCreator.new(content, list, options).render
135
135
  end
136
-
137
- def navbar_dropdown(content=nil, list=[], options={})
138
- dropdown(content, list, options.merge({category: :navbar}))
139
- end
140
136
  end
@@ -7,4 +7,12 @@ module FormatHelper
7
7
  def prepend_class(options, *attrs)
8
8
  options[:class] = squeeze_n_strip("#{attrs.join(' ')} #{options[:class]}")
9
9
  end
10
+
11
+ def parse_content_or_options(content_or_options, options)
12
+ if content_or_options.is_a?(Hash)
13
+ [nil, content_or_options]
14
+ else
15
+ [content_or_options, options]
16
+ end
17
+ end
10
18
  end
@@ -9,46 +9,35 @@ module IconHelper
9
9
  attr_accessor :options
10
10
 
11
11
  def initialize(type, options)
12
- @type = type
12
+ @type = type.to_s.tr('_', '-')
13
13
  @options = options
14
14
  end
15
15
 
16
16
  def render
17
- icon_options = {
18
- type: type,
19
- size: options.delete(:size).presence || :normal,
20
- fw: options.delete(:fixed_with).presence,
21
- li: options.delete(:list_icon).presence,
22
- inverse: options.delete(:inverse).presence,
23
- border: options.delete(:border).presence,
24
- pull: options.delete(:pull).presence,
25
- animate: options.delete(:animate).presence,
26
- orientation: options.delete(:orientation).presence
27
-
28
- # TODO add fa-stack support
29
- # stack = options.delete(:stack).presence
30
- }
31
-
32
- prepend_class(options, 'fa', render_fa_class(icon_options))
17
+ render_fa_class(options)
33
18
 
34
19
  content_tag :i, nil, options
35
20
  end
36
21
 
37
22
  private
38
23
  def render_fa_class(options)
39
- type = "fa-#{options[:type]}"
24
+ type = "fa-#{@type}"
40
25
  raise 'Invalid Icon Type!' if ValidIcons::VALID_ICONS.exclude?(type)
41
26
 
42
27
  size = get_icon_size(options.delete(:size))
43
- fw = options[:fw].presence ? 'fa-fw' : nil
44
- li = options[:li].presence ? 'fa-li' : nil
45
- inverse = options[:inverse].presence ? 'fa-inverse' : nil
46
- border = options[:border].presence ? 'fa-border' : nil
47
- pull = get_icon_position(options[:pull])
48
- animate = get_icon_animation(options[:animate])
49
- orientation = get_icon_orientation(options[:orientation])
50
-
51
- "#{type} #{size} #{fw} #{li} #{inverse} #{border} #{pull} #{animate} #{orientation}"
28
+ fw = options.delete(:fw).presence ? 'fa-fw' : nil
29
+ li = options.delete(:li).presence ? 'fa-li' : nil
30
+ inverse = options.delete(:inverse).presence ? 'fa-inverse' : nil
31
+ border = options.delete(:border).presence ? 'fa-border' : nil
32
+ pull = get_icon_position(options.delete(:pull))
33
+ animate = get_icon_animation(options.delete(:animate))
34
+ orientation = get_icon_orientation(options.delete(:orientation))
35
+
36
+ # TODO add fa-stack support
37
+ # stack = options.delete(:stack).presence
38
+
39
+ prepend_class(options, 'fa', type, size, fw, li, inverse, border, pull,
40
+ animate, orientation)
52
41
  end
53
42
 
54
43
  def get_icon_size(size)
@@ -109,4 +98,20 @@ module IconHelper
109
98
 
110
99
  IconCreator.new(type, options).render
111
100
  end
101
+
102
+ def icon_list(options={}, &block)
103
+ prepend_class(options, 'fa-ul')
104
+
105
+ content_tag :ul, options, &block
106
+ end
107
+
108
+ def icon_list_item(content_or_options, options={}, &block)
109
+ content, options = parse_content_or_options(content_or_options, options)
110
+ icon_options = options.delete(:icon_html)
111
+ icon = icon(icon_options.delete(:type), icon_options)
112
+
113
+ content_tag :li, options do
114
+ (icon + (content.presence || capture(&block))).html_safe
115
+ end
116
+ end
112
117
  end
@@ -3,63 +3,76 @@ module ModalHelper
3
3
  include FormatHelper
4
4
 
5
5
  def modal(options={}, &block)
6
- button_options = options.delete(:button) || {}
7
-
8
- caption = button_options.delete(:caption) || 'Modal'
9
- modal_dialog_id = options[:id] || "modal-#{SecureRandom.hex(3)}"
10
- button_options[:data] = (button_options[:data] || {}).merge({toggle: 'modal', target: "##{modal_dialog_id}"})
11
- size = case options.delete(:size).try(:to_sym)
12
- when :xsmall
13
- 'modal-sm'
14
- when :large
15
- 'modal-lg'
16
- else
17
- end
18
-
19
- prepend_class(options, 'modal', 'fade')
20
- options.merge!({id: modal_dialog_id, tabindex: -1, role: 'dialog', aria: {hidden: true}})
6
+ caption,
7
+ button_options,
8
+ modal_dialog_options,
9
+ modal_content_options = parse_modal_options(options)
21
10
 
22
11
  ((button caption, button_options) +
23
12
  (content_tag :div, options do
24
- content_tag :div, class: "modal-dialog #{size}" do
25
- content_tag :div, class: 'modal-content' do
26
- yield if block_given?
27
- end
13
+ content_tag :div, modal_dialog_options do
14
+ content_tag :div, modal_content_options, &block
28
15
  end
29
16
  end)).html_safe
30
17
  end
31
18
 
32
19
  def modal_header(content_or_options=nil, options={}, &block)
33
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
20
+ content, options = parse_content_or_options(content_or_options, options)
34
21
 
35
- prepend_class(options, 'modal-title')
22
+ title_options = options.delete(:title_html) || {}
23
+ prepend_class(options, 'modal-header')
36
24
 
37
- content_tag :div, class: 'modal-header' do
38
- ("<button type='button' class='close' data-dismiss='modal'><span aria-hidden='true'>×</span></button>" +
39
- (content_tag :h3, options do
40
- content.presence || capture(&block)
41
- end)).html_safe
25
+ header_proc = block_given? ? block : proc { modal_title(content, title_options) }
26
+
27
+ content_tag :div, options do
28
+ render_close_btn + capture(&header_proc)
42
29
  end
43
30
  end
44
31
 
45
- def modal_body(content_or_options=nil, options={}, &block)
46
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
32
+ %w(title body footer).each do |part|
33
+ define_method "modal_#{part}" do |content_or_options=nil, options={}, &block|
34
+ content, options = parse_content_or_options(content_or_options, options)
35
+ tag = part == 'title' ? options.delete(:tag).try(:to_sym) || :h4 : :div
47
36
 
48
- prepend_class(options, 'modal-body')
37
+ prepend_class(options, "modal-#{part}")
49
38
 
50
- content_tag :div, options do
51
- content.presence || capture(&block)
39
+ content_tag tag, (content.presence || capture(&block)), options
52
40
  end
53
41
  end
54
42
 
55
- def modal_footer(content_or_options=nil, options={}, &block)
56
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
43
+ private
44
+
45
+ def parse_modal_options(options)
46
+ button_options = options.delete(:button_html) || {}
47
+ modal_dialog_options = options.delete(:modal_dialog_html) || {}
48
+ modal_content_options = options.delete(:modal_content_html) || {}
49
+ caption = button_options.delete(:caption) || 'Modal'
50
+ modal_id = options[:id] || "modal-#{SecureRandom.hex(3)}"
51
+ button_options[:data] = (button_options[:data] || {}).merge({toggle: 'modal', target: "##{modal_id}"})
52
+ size = get_modal_size(options.delete(:size).try(:to_sym))
53
+
54
+ prepend_class(options, 'modal', 'fade')
55
+ prepend_class(modal_dialog_options, 'modal-dialog', size)
56
+ prepend_class(modal_content_options, 'modal-content')
57
57
 
58
- prepend_class(options, 'modal-footer')
58
+ options.deep_merge!({id: modal_id, tabindex: -1, role: 'dialog', aria: {hidden: true}})
59
59
 
60
- content_tag :div, options do
61
- content.presence || capture(&block)
60
+ [caption, button_options, modal_dialog_options, modal_content_options]
61
+ end
62
+
63
+ def get_modal_size(size)
64
+ case size
65
+ when :small
66
+ 'modal-sm'
67
+ when :large
68
+ 'modal-lg'
69
+ else
62
70
  end
63
71
  end
64
72
 
73
+ def render_close_btn
74
+ content_tag :button, type: :button, class: 'close', data: {dismiss: 'modal'} do
75
+ content_tag :span, 'x', aria: {hidden: true}
76
+ end
77
+ end
65
78
  end
@@ -11,7 +11,7 @@ module NavHelper
11
11
  @options = options
12
12
  end
13
13
 
14
- def render
14
+ def render(content)
15
15
  nav_options = {
16
16
  as: options.delete(:as).presence || :tabs,
17
17
  layout: options.delete(:layout).presence
@@ -21,10 +21,9 @@ module NavHelper
21
21
  active = options.delete(:active)
22
22
 
23
23
  prepend_class(options, 'nav', build_nav_class(nav_options))
24
+ options.deep_merge!(data: {bui: 'nav', active_el_locator: active})
24
25
 
25
- options.merge!(data: {bui: 'nav', active_el_locator: active})
26
-
27
- [tag, options]
26
+ content_tag tag, content, options
28
27
  end
29
28
 
30
29
  private
@@ -49,8 +48,6 @@ module NavHelper
49
48
  end
50
49
 
51
50
  def nav(options={}, &block)
52
- tag, options = NavCreator.new(options).render
53
-
54
- content_tag tag, options, &block
51
+ NavCreator.new(options).render capture(&block)
55
52
  end
56
53
  end
@@ -1,5 +1,6 @@
1
1
  module NavbarHelper
2
2
  include ActionView::Helpers
3
+ include FormatHelper
3
4
 
4
5
  # TODO: add navbar form support
5
6
  def navbar(options={}, &block)
@@ -9,8 +10,7 @@ module NavbarHelper
9
10
  position, position_style = parse_position(options.delete(:position), padding)
10
11
 
11
12
  prepend_class(options, style, position)
12
-
13
- options[:data] = (options[:data] || {}).merge(bui: 'navbar')
13
+ options.deep_merge!(data: {bui: 'navbar'})
14
14
 
15
15
  (position_style + (content_tag :nav, options do
16
16
  content_tag :div, class: container, &block
@@ -20,14 +20,16 @@ module NavbarHelper
20
20
  def vertical(options={}, &block)
21
21
  prepend_class(options, 'navbar-header')
22
22
 
23
+ btn_content = ("<span class='icon-bar'></span>" * 3).html_safe
24
+ btn_options = {
25
+ class: 'navbar-toggle collapsed',
26
+ type: :button,
27
+ data: {toggle: 'collapse'},
28
+ aria: {expanded: false}
29
+ }
30
+
23
31
  content_tag :div, options do
24
- (content_tag :button,
25
- class: 'navbar-toggle collapsed',
26
- type: :button,
27
- data: {toggle: 'collapse'},
28
- aria: {expanded: false} do
29
- ("<span class='icon-bar'></span>" * 3).html_safe
30
- end) + capture(&block)
32
+ (content_tag :button, btn_content, btn_options) + capture(&block)
31
33
  end
32
34
  end
33
35
 
@@ -51,6 +53,50 @@ module NavbarHelper
51
53
  content_tag :ul, options, &block
52
54
  end
53
55
 
56
+ def navbar_link_to(name = nil, options = nil, html_options = nil, &block)
57
+ html_options, options, name = options, name, block if block_given?
58
+ options ||= {}
59
+ html_options ||= {}
60
+
61
+ prepend_class(html_options, 'navbar-link')
62
+
63
+ link_to options, html_options do
64
+ block_given? ? (yield name) : name
65
+ end
66
+ end
67
+
68
+ def navbar_link(name = nil, options = nil, html_options = nil, &block)
69
+ html_options, options, name = options, name, block if block_given?
70
+ options ||= {}
71
+ html_options ||= {}
72
+
73
+ prepend_class(html_options, 'navbar-link')
74
+ active = 'active' if html_options.delete(:active)
75
+
76
+
77
+ content_tag :li, class: active do
78
+ link_to options, html_options do
79
+ block_given? ? (yield name) : name
80
+ end
81
+ end
82
+ end
83
+
84
+ def navbar_brand(name = nil, options = nil, html_options = nil, &block)
85
+ html_options, options, name = options, name, block if block_given?
86
+ options ||= {}
87
+ html_options ||= {}
88
+
89
+ prepend_class(html_options, 'navbar-brand')
90
+
91
+ link_to options, html_options do
92
+ block_given? ? (yield name) : name
93
+ end
94
+ end
95
+
96
+ def navbar_dropdown(content=nil, list=[], options={})
97
+ dropdown(content, list, options.merge({category: :navbar}))
98
+ end
99
+
54
100
  private
55
101
 
56
102
  def parse_position(position, padding)
@@ -1,78 +1,42 @@
1
1
  module PanelHelper
2
2
  include ActionView::Helpers
3
3
 
4
- class PanelCreator
5
- include FormatHelper
6
- include ActionView::Helpers
4
+ def panel(options={}, &block)
5
+ tag = options.delete(:tag).try(:to_sym) || :div
6
+ type = get_panel_type(options.delete(:type))
7
7
 
8
- attr_accessor :content
9
- attr_accessor :options
10
- attr_accessor :block
11
- attr_accessor :output_buffer
8
+ prepend_class(options, 'panel', type)
12
9
 
13
- def initialize(content=nil, options, block)
14
- @content = content
15
- @options = options
16
- @block = block
17
- end
18
-
19
- def render
20
- heading = options.delete(:heading)
21
- title = options.delete(:title)
22
- footer = options.delete(:footer)
23
- tag = options.delete(:tag).try(:to_sym).presence || :div
24
- type = get_panel_type(options.delete(:type))
25
-
26
- prepend_class(options, 'panel', type)
27
-
28
- content_tag tag, options do
29
- (panel_header(heading, title) + panel_body(content, block) +
30
- panel_footer(footer)).html_safe
31
- end
32
- end
33
-
34
- private
35
- def panel_header(heading, title)
36
- return '' if heading.blank? && title.blank?
37
-
38
- if title.present?
39
- "<div class='panel-heading'><h3 class='panel-title'>#{title}</h3></div>"
40
- else
41
- "<div class='panel-heading'>#{heading}</div>"
42
- end
43
- end
10
+ content_tag tag, options, &block
11
+ end
44
12
 
45
- def panel_body(content, block)
46
- content_tag :div, class: 'panel-body' do
47
- content.presence || block
48
- end
49
- end
13
+ %w(heading title body footer).each do |part|
14
+ define_method "panel_#{part}" do |content_or_options=nil, options={}, &block|
15
+ content, options = parse_content_or_options(content_or_options, options)
50
16
 
51
- def panel_footer(footer)
52
- footer.present? ? "<div class='panel-footer'>#{footer}</div>" : ''
53
- end
17
+ tag = part == 'title' ? options.delete(:tag).try(:to_sym) || :h3 : :div
18
+ prepend_class(options, "panel-#{part}")
54
19
 
55
- def get_panel_type(type)
56
- case type.try(:to_sym)
57
- when :primary
58
- 'panel-primary'
59
- when :info
60
- 'panel-info'
61
- when :success
62
- 'panel-success'
63
- when :warning
64
- 'panel-warning'
65
- when :danger
66
- 'panel-danger'
67
- else
68
- 'panel-default'
69
- end
20
+ content_tag tag, content || capture(&block), options
70
21
  end
71
22
  end
72
23
 
73
- def panel(content_or_options=nil, options={}, &block)
74
- content_or_options.is_a?(Hash) ? options = content_or_options : content = content_or_options
75
-
76
- PanelCreator.new(content, options, capture(&block)).render
24
+ private
25
+
26
+ def get_panel_type(type)
27
+ case type.try(:to_sym)
28
+ when :primary
29
+ 'panel-primary'
30
+ when :info
31
+ 'panel-info'
32
+ when :success
33
+ 'panel-success'
34
+ when :warning
35
+ 'panel-warning'
36
+ when :danger
37
+ 'panel-danger'
38
+ else
39
+ 'panel-default'
40
+ end
77
41
  end
78
42
  end
@@ -2,9 +2,8 @@ module PanelRowHelper
2
2
 
3
3
  def panel_row(options={}, &block)
4
4
  column_class = options.delete(:column_class) || ''
5
- data = (options[:data] || {}).merge(bui: 'panel_row',
6
- column_class: column_class)
7
- options[:data] = data
5
+
6
+ options.deep_merge!(data: {bui: 'panel_row', column_class: column_class})
8
7
  prepend_class(options, 'row')
9
8
 
10
9
  content_tag :div, options, &block
@@ -17,9 +17,7 @@ module ProgressBarHelper
17
17
  options[:role] = 'progressbar'
18
18
  options[:aria] = {valuemax: 100, valuemin: 0, valuenow: percentage}
19
19
 
20
- content_tag :div, options do
21
- label.present? ? label : (content_tag :span, label, class: 'sr-only')
22
- end
20
+ content_tag :div, label, options
23
21
  end
24
22
 
25
23
  private
data/codeclimate.yml CHANGED
@@ -1,20 +1,4 @@
1
- # This is a sample .codeclimate.yml configured for Engine analysis on Code
2
- # Climate Platform. For an overview of the Code Climate Platform, see here:
3
- # http://docs.codeclimate.com/article/300-the-codeclimate-platform
4
-
5
- # Under the engines key, you can configure which engines will analyze your repo.
6
- # Each key is an engine name. For each value, you need to specify enabled: true
7
- # to enable the engine as well as any other engines-specific configuration.
8
-
9
- # For more details, see here:
10
- # http://docs.codeclimate.com/article/289-configuring-your-repository-via-codeclimate-yml#platform
11
-
12
- # For a list of all available engines, see here:
13
- # http://docs.codeclimate.com/article/296-engines-available-engines
14
-
15
1
  engines:
16
- # to turn on an engine, add it here and set enabled to `true`
17
- # to turn off an engine, set enabled to `false` or remove it
18
2
  rubocop:
19
3
  enabled: true
20
4
  checks:
@@ -33,26 +17,5 @@ engines:
33
17
  enabled: false
34
18
  csslint:
35
19
  enabled: true
36
-
37
- # Engines can analyze files and report issues on them, but you can separately
38
- # decide which files will receive ratings based on those issues. This is
39
- # specified by path patterns under the ratings key.
40
-
41
- # For more details see here:
42
- # http://docs.codeclimate.com/article/289-configuring-your-repository-via-codeclimate-yml#platform
43
-
44
- # Note: If the ratings key is not specified, this will result in a 0.0 GPA on your dashboard.
45
-
46
- # ratings:
47
- # paths:
48
- # - app/**
49
- # - lib/**
50
- # - "**.rb"
51
- # - "**.go"
52
-
53
- # You can globally exclude files from being analyzed by any engine using the
54
- # exclude_paths key.
55
-
56
- #exclude_paths:
57
- #- spec/**/*
58
- #- vendor/**/*
20
+ fixme:
21
+ enabled: false
@@ -1,3 +1,3 @@
1
1
  module BootstrapUiHelper
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap_ui_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sen Zhang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-16 00:00:00.000000000 Z
11
+ date: 2015-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -64,7 +64,6 @@ files:
64
64
  - app/helpers/format_helper.rb
65
65
  - app/helpers/icon_helper.rb
66
66
  - app/helpers/label_helper.rb
67
- - app/helpers/link_helper.rb
68
67
  - app/helpers/modal_helper.rb
69
68
  - app/helpers/nav_helper.rb
70
69
  - app/helpers/navbar_helper.rb
@@ -96,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
95
  version: '0'
97
96
  requirements: []
98
97
  rubyforge_project:
99
- rubygems_version: 2.4.4
98
+ rubygems_version: 2.4.8
100
99
  signing_key:
101
100
  specification_version: 4
102
101
  summary: Bootstrap UI Helper
@@ -1,53 +0,0 @@
1
- module LinkHelper
2
- include FormatHelper
3
-
4
- def navbar_link_to(name = nil, options = nil, html_options = nil, &block)
5
- html_options, options, name = options, name, block if block_given?
6
- options ||= {}
7
- html_options ||= {}
8
-
9
- prepend_class(html_options, 'navbar-link')
10
-
11
- return link_to(name, options, html_options) unless block_given?
12
-
13
- link_to options, html_options do
14
- yield name
15
- end
16
- end
17
-
18
- def navbar_link(name = nil, options = nil, html_options = nil, &block)
19
- html_options, options, name = options, name, block if block_given?
20
- options ||= {}
21
- html_options ||= {}
22
-
23
- prepend_class(html_options, 'navbar-link')
24
- active = 'active' if html_options.delete(:active)
25
-
26
-
27
- content_tag :li, class: active do
28
- if block_given?
29
- link_to options, html_options do
30
- yield name
31
- end
32
- else
33
- link_to name, options, html_options
34
- end
35
- end
36
- end
37
-
38
- def navbar_brand(name = nil, options = nil, html_options = nil, &block)
39
- html_options, options, name = options, name, block if block_given?
40
- options ||= {}
41
- html_options ||= {}
42
-
43
- prepend_class(html_options, 'navbar-brand')
44
-
45
- if block_given?
46
- link_to options, html_options do
47
- yield name
48
- end
49
- else
50
- link_to name, options, html_options
51
- end
52
- end
53
- end