bh 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -58,15 +58,8 @@ module Bh
58
58
  end
59
59
 
60
60
  def button_class(options = {})
61
- context = case options[:context].to_s
62
- when 'primary' then :primary
63
- when 'success' then :success
64
- when 'info' then :info
65
- when 'warning' then :warning
66
- when 'danger' then :danger
67
- when 'link' then :link
68
- else 'default'
69
- end
61
+ valid_contexts = %w(primary success info warning danger link)
62
+ context = context_for options[:context], valid: valid_contexts
70
63
 
71
64
  size = case options[:size].to_s
72
65
  when 'lg', 'large' then 'btn-lg'
@@ -56,14 +56,8 @@ module Bh
56
56
  end
57
57
 
58
58
  def panel_class(context = nil)
59
- context = case context.to_s
60
- when 'primary' then :primary
61
- when 'success' then :success
62
- when 'info' then :info
63
- when 'warning' then :warning
64
- when 'danger' then :danger
65
- else 'default'
66
- end
59
+ valid_contexts = %w(primary success info warning danger)
60
+ context = context_for context, valid: valid_contexts
67
61
  "panel panel-#{context}"
68
62
  end
69
63
 
@@ -0,0 +1,66 @@
1
+ require 'bh/helpers/base_helper'
2
+
3
+ module Bh
4
+ # Provides methods to include progress bars.
5
+ # @see http://getbootstrap.com/components/#progress
6
+ module ProgressBarHelper
7
+ include BaseHelper
8
+
9
+ # Returns an HTML block tag that follows the Bootstrap documentation
10
+ # on how to display *progress bars*.
11
+ # @param [Hash, Array<Hash>] options the display options for the progress
12
+ # bar(s). When options is an Array, a group of stacked progress bars
13
+ # is displayed, with the options specified in each item of the array.
14
+ # @option options [Boolean, #to_s] :label (false) the label to display
15
+ # on top of the progress bar. If set to false, the label is hidden. If
16
+ # set to true, the label is generated from the percentage value. Any
17
+ # other provided value is used directly as the label.
18
+ # @option options [Boolean] :striped (false) whether to display a striped
19
+ # version of the progress bar (rather than solid color).
20
+ # @option options [Boolean] :animated (false) whether to display an
21
+ # animated version of the progress bar (rather than solid color).
22
+ # @option options [#to_s] :context (:default) the contextual alternative to
23
+ # apply to the progress bar depending on its importance. Can be
24
+ # `:success`, `:info`, `:warning` or `:danger`.
25
+ def progress_bar(options = {})
26
+ content_tag :div, class: :progress do
27
+ safe_join Array.wrap(options).map{|bar| progress_bar_string bar}, "\n"
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def progress_bar_string(options = {})
34
+ percentage = options.fetch :percentage, 0
35
+
36
+ attributes = {}.tap do |attrs|
37
+ attrs[:class] = progress_bar_class(options)
38
+ attrs[:role] = 'progressbar'
39
+ attrs[:style] = "width: #{percentage}%"
40
+ attrs['aria-valuenow'] = percentage
41
+ attrs['aria-valuemin'] = 0
42
+ attrs['aria-valuemax'] = 100
43
+ end
44
+
45
+ content_tag :div, progress_bar_label(percentage, options), attributes
46
+ end
47
+
48
+ def progress_bar_label(percentage, options = {})
49
+ text = "#{percentage}%#{" (#{options[:context]})" if options[:context]}"
50
+ case options.fetch(:label, false)
51
+ when true then text
52
+ when false then content_tag(:span, text, class: 'sr-only')
53
+ else options[:label]
54
+ end
55
+ end
56
+
57
+ def progress_bar_class(options = {})
58
+ valid_contexts = %w(success info warning danger)
59
+ context = context_for options[:context], valid: valid_contexts
60
+ context = context.in?(valid_contexts) ? "progress-bar-#{context}" : nil
61
+ striped = 'progress-bar-striped' if options[:striped]
62
+ animated = 'progress-bar-striped active' if options[:animated]
63
+ ['progress-bar', context, striped, animated].compact.join ' '
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,39 @@
1
+ require 'bh/helpers/alert_helper'
2
+ require 'bh/helpers/button_helper'
3
+ require 'bh/helpers/button_to_helper'
4
+ require 'bh/helpers/cdn_helper'
5
+ require 'bh/helpers/dropdown_helper'
6
+ require 'bh/helpers/form_for_helper'
7
+ require 'bh/helpers/glyphicon_helper'
8
+ require 'bh/helpers/icon_helper'
9
+ require 'bh/helpers/link_to_helper'
10
+ require 'bh/helpers/modal_helper'
11
+ require 'bh/helpers/nav_helper'
12
+ require 'bh/helpers/navbar_helper'
13
+ require 'bh/helpers/panel_helper'
14
+ require 'bh/helpers/panel_row_helper'
15
+ require 'bh/helpers/progress_bar_helper'
16
+
17
+ module Bh
18
+ class MiddlemanExtension < Middleman::Extension
19
+ helpers do
20
+ include AlertHelper
21
+ include ButtonHelper
22
+ include ButtonToHelper
23
+ include CdnHelper
24
+ include DropdownHelper
25
+ include FormForHelper
26
+ include GlyphiconHelper
27
+ include IconHelper
28
+ include LinkToHelper
29
+ include ModalHelper
30
+ include NavHelper
31
+ include NavbarHelper
32
+ include PanelHelper
33
+ include PanelRowHelper
34
+ include ProgressBarHelper
35
+ end
36
+ end
37
+ end
38
+
39
+ ::Middleman::Extensions.register(:bh, Bh::MiddlemanExtension)
@@ -1,29 +1,37 @@
1
1
  require 'bh/helpers/alert_helper'
2
+ require 'bh/helpers/button_helper'
2
3
  require 'bh/helpers/button_to_helper'
3
4
  require 'bh/helpers/cdn_helper'
5
+ require 'bh/helpers/dropdown_helper'
4
6
  require 'bh/helpers/form_for_helper'
5
7
  require 'bh/helpers/glyphicon_helper'
8
+ require 'bh/helpers/icon_helper'
6
9
  require 'bh/helpers/link_to_helper'
7
10
  require 'bh/helpers/modal_helper'
8
11
  require 'bh/helpers/nav_helper'
9
12
  require 'bh/helpers/navbar_helper'
10
13
  require 'bh/helpers/panel_helper'
11
14
  require 'bh/helpers/panel_row_helper'
15
+ require 'bh/helpers/progress_bar_helper'
12
16
 
13
17
  module Bh
14
18
  class Railtie < Rails::Railtie
15
19
  initializer 'bh.add_helpers' do
16
20
  ActionView::Base.send :include, AlertHelper
21
+ ActionView::Base.send :include, ButtonHelper
17
22
  ActionView::Base.send :include, ButtonToHelper
18
23
  ActionView::Base.send :include, CdnHelper
24
+ ActionView::Base.send :include, DropdownHelper
19
25
  ActionView::Base.send :include, FormForHelper
20
26
  ActionView::Base.send :include, GlyphiconHelper
27
+ ActionView::Base.send :include, IconHelper
21
28
  ActionView::Base.send :include, LinkToHelper
22
29
  ActionView::Base.send :include, ModalHelper
23
30
  ActionView::Base.send :include, NavHelper
24
31
  ActionView::Base.send :include, NavbarHelper
25
32
  ActionView::Base.send :include, PanelHelper
26
33
  ActionView::Base.send :include, PanelRowHelper
34
+ ActionView::Base.send :include, ProgressBarHelper
27
35
  end
28
36
 
29
37
  initializer 'bh.add_views' do |app|
@@ -1,3 +1,3 @@
1
1
  module Bh
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -0,0 +1,9 @@
1
+ <div class="<%= div_class %>">
2
+ <button class="dropdown-toggle <%= button_class %>" type="button" id="label-<%= id %>" data-toggle="dropdown">
3
+ <%= caption %>
4
+ <span class="caret"></span>
5
+ </button>
6
+ <ul class="<%= list_class %>" role="menu" aria-labelledby="label-<%= id %>">
7
+ <%= yield %>
8
+ </ul>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="<%= div_class %>">
2
+ <button type="button" class="<%= button_class %>"><%= caption %></button>
3
+ <button class="dropdown-toggle <%= button_class %>" type="button" id="label-<%= id %>" data-toggle="dropdown">
4
+ <span class="caret"></span>
5
+ <span class="sr-only">Toggle Dropdown</span>
6
+ </button>
7
+ <ul class="<%= list_class %>" role="menu" aria-labelledby="label-<%= id %>">
8
+ <%= yield %>
9
+ </ul>
10
+ </div>
@@ -0,0 +1,60 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <!-- Edit the code below to see how code looks in a browser -->
5
+ <!-- Note that only *a few* helpers are currently supported by Bh+Middleman,
6
+ so the use of this dummy file is currently limited to the helpers
7
+ listed below. The plan is to make all the helpers look in Middleman
8
+ in the future, as they do in Rails. -->
9
+ <h1>Alerts</h1>
10
+
11
+ <%= alert_box 'You accepted the Terms of service.', context: :success, dismissible: true %>
12
+ <%= alert_box 'You accepted the Terms of service.', context: :info, dismissible: true %>
13
+ <%= alert_box 'You accepted the Terms of service.', context: :warning, dismissible: true %>
14
+ <%= alert_box 'You accepted the Terms of service.', context: :danger, dismissible: true %>
15
+ <%= alert_box 'You accepted the Terms of service.', dismissible: true %>
16
+
17
+
18
+ <p>Alert boxes with HTML content currently not supported in Middleman.</p>
19
+
20
+ <h1>Panels</h1>
21
+
22
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks', context: :primary %>
23
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks', context: :success %>
24
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks', context: :info %>
25
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks', context: :warning %>
26
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks', context: :danger %>
27
+ <%= panel body: 'You accepted the Terms of service.', title: 'Thanks' %>
28
+
29
+
30
+ <p>Panels with HTML content currently not supported in Middleman.</p>
31
+
32
+ <h1>Panel rows</h1>
33
+
34
+ <p>Panel rows currently not supported in Middleman.</p>
35
+
36
+ <h1>Modals</h1>
37
+
38
+ <p>Modals currently not supported in Middleman.</p>
39
+
40
+ <h1>Navs</h1>
41
+
42
+ <p>Navs currently not supported in Middleman.</p>
43
+
44
+ <h1>Navbars</h1>
45
+
46
+ <p>Navbars currently not supported in Middleman.</p>
47
+
48
+ <h1>Forms</h1>
49
+
50
+ <p>Forms currently not supported in Middleman.</p>
51
+
52
+ <h1>Glyphicons</h1>
53
+
54
+ <%= icon :zoom_in %>
55
+
56
+ <h1>Icons</h1>
57
+
58
+ <%= icon :heart %>
59
+ <%= stylesheet_link_tag font_awesome_css %>
60
+ <%= icon :heart, library: :font_awesome, class: 'fa-5x' %>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta content="IE=edge" http-equiv="X-UA-Compatible" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <%= stylesheet_link_tag font_awesome_css, bootstrap_css, bootstrap_theme_css %>
8
+ <title>Bh test page</title>
9
+ </head>
10
+ <body>
11
+ <div class='container'>
12
+ <%= yield %>
13
+ </div>
14
+ <%= javascript_include_tag '//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js' %>
15
+ <%= javascript_include_tag bootstrap_js %>
16
+ </body>
17
+ </html>
@@ -0,0 +1,100 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+ require 'bh/helpers/button_helper'
5
+ include Bh::ButtonHelper
6
+
7
+ describe 'button' do
8
+ describe 'accepts as parameters:' do
9
+ let(:behave) { match %r{^<button class="btn.+?">content</button>} }
10
+
11
+ specify 'a string (content)' do
12
+ expect(button 'content').to behave
13
+ end
14
+
15
+ specify 'a block (content)' do
16
+ expect(button { 'content' }).to behave
17
+ end
18
+
19
+ specify 'a string (content) + a hash (options)' do
20
+ expect(button 'content', context: :danger).to behave
21
+ end
22
+
23
+ specify 'a hash (options) + a block (content)' do
24
+ expect(button(context: :danger) { 'content' }).to behave
25
+ end
26
+ end
27
+
28
+ describe 'with the :context option' do
29
+ let(:html) { button 'content', context: context }
30
+
31
+ describe 'set to :primary, shows a "primary" button' do
32
+ let(:context) { :primary }
33
+ it { expect(html).to include 'btn-primary' }
34
+ end
35
+
36
+ describe 'set to :success, shows a "success" button' do
37
+ let(:context) { :success }
38
+ it { expect(html).to include 'btn-success' }
39
+ end
40
+
41
+ describe 'set to :info, shows a "info" button' do
42
+ let(:context) { :info }
43
+ it { expect(html).to include 'btn-info' }
44
+ end
45
+
46
+ describe 'set to :warning, shows a "warning" button' do
47
+ let(:context) { :warning }
48
+ it { expect(html).to include 'btn-warning' }
49
+ end
50
+
51
+ describe 'set to :danger, shows a "danger" button' do
52
+ let(:context) { :danger }
53
+ it { expect(html).to include 'btn-danger' }
54
+ end
55
+
56
+ describe 'set to :link, shows a "link" button' do
57
+ let(:context) { :link }
58
+ it { expect(html).to include 'btn-link' }
59
+ end
60
+
61
+ describe 'set to any other value, shows a "default" button' do
62
+ let(:context) { :unknown }
63
+ it { expect(html).to include 'btn-default' }
64
+ end
65
+ end
66
+
67
+ describe 'without the :context option, shows a "default" button' do
68
+ let(:html) { button 'content' }
69
+ it { expect(html).to include 'btn-default' }
70
+ end
71
+
72
+ describe 'with the :size option' do
73
+ let(:html) { button 'content', size: size }
74
+
75
+ describe 'set to :large, shows a large button' do
76
+ let(:size) { :large }
77
+ it { expect(html).to include 'btn-lg' }
78
+ end
79
+
80
+ describe 'set to :small, shows a small button' do
81
+ let(:size) { :small }
82
+ it { expect(html).to include 'btn-sm' }
83
+ end
84
+
85
+ describe 'set to :extra_small, shows an extra-small button' do
86
+ let(:size) { :extra_small }
87
+ it { expect(html).to include 'btn-xs' }
88
+ end
89
+ end
90
+
91
+
92
+ describe 'with the :layout option' do
93
+ let(:html) { button 'content', layout: layout }
94
+
95
+ describe 'set to :block, shows a "block" button' do
96
+ let(:layout) { :block }
97
+ it { expect(html).to include 'btn-block' }
98
+ end
99
+ end
100
+ end
@@ -73,4 +73,28 @@ describe 'bootstrap_js' do
73
73
  let(:options) { {scheme: :https, version: '3.1.0'} }
74
74
  it{ expect(file).to be }
75
75
  end
76
- end
76
+ end
77
+
78
+ describe 'font_awesome_css' do
79
+ let(:file) { open font_awesome_css(options), ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE }
80
+
81
+ describe 'with the HTTP scheme, links to an existing file' do
82
+ let(:options) { {scheme: :http} }
83
+ it{ expect(file).to be }
84
+ end
85
+
86
+ describe 'with the HTTPS scheme, links to an existing file' do
87
+ let(:options) { {scheme: :https} }
88
+ it{ expect(file).to be }
89
+ end
90
+
91
+ describe 'non-minified, links to an existing file' do
92
+ let(:options) { {scheme: :http, minified: false} }
93
+ it{ expect(file).to be }
94
+ end
95
+
96
+ describe 'given a legacy version, links to an existing file' do
97
+ let(:options) { {scheme: :https, version: '3.1.0'} }
98
+ it{ expect(file).to be }
99
+ end
100
+ end
@@ -0,0 +1,146 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+ require 'action_dispatch'
5
+ require 'bh/helpers/dropdown_helper'
6
+ include Bh::DropdownHelper
7
+
8
+ describe 'dropdown' do
9
+ let(:views_folder) { File.expand_path('../../../lib/bh/views', __FILE__) }
10
+ let(:lookup_context) { ActionView::LookupContext.new views_folder }
11
+ let(:view_renderer) { ActionView::Renderer.new lookup_context }
12
+ let(:caption) { 'Menu' }
13
+ let(:options) { {} }
14
+ let(:html) { dropdown(caption, options) {} }
15
+
16
+ specify 'uses the caption with a caret as the button caption' do
17
+ expect(html).to match %r{<button .+>.+Menu.+<span class="caret"></span>.+</button>}m
18
+ end
19
+
20
+ describe 'with the :groupable option' do
21
+ specify 'not set, wraps the dropdown in a "btn-group" div' do
22
+ expect(html).to include '<div class="btn-group">'
23
+ end
24
+
25
+ describe 'set to true, wraps the dropdown in a "btn-group" div' do
26
+ let(:options) { {groupable: true} }
27
+ it { expect(html).to include '<div class="btn-group">' }
28
+ end
29
+
30
+ describe 'set to false, wraps the dropdown in a "dropdown" div' do
31
+ let(:options) { {groupable: false} }
32
+ it { expect(html).to include '<div class="dropdown">' }
33
+ end
34
+ end
35
+
36
+ describe 'with the :align option' do
37
+ specify 'not set, wraps the list in a "dropdown-menu" ul' do
38
+ expect(html).to include '<ul class="dropdown-menu"'
39
+ end
40
+
41
+ describe 'set to :left, wraps the dropdown in a dropdown-menu" ul' do
42
+ let(:options) { {align: :left} }
43
+ it { expect(html).to include '<ul class="dropdown-menu"' }
44
+ end
45
+
46
+ describe 'set to :right, adds the dropdown-menu-right class to the ul' do
47
+ let(:options) { {align: :right} }
48
+ it { expect(html).to include '<ul class="dropdown-menu dropdown-menu-right"' }
49
+ end
50
+ end
51
+
52
+ describe 'with the :direction option' do
53
+ specify 'not set, uses the default dropdown direction' do
54
+ expect(html).not_to include 'dropup'
55
+ end
56
+
57
+ describe 'set to :down, uses the default dropdown direction' do
58
+ let(:options) { {direction: :down} }
59
+ it { expect(html).not_to include 'dropup' }
60
+ end
61
+
62
+ describe 'set to :up, adds the dropup class to the div' do
63
+ let(:options) { {direction: :up} }
64
+ it { expect(html).to include 'dropup' }
65
+ end
66
+ end
67
+
68
+ describe 'with the :split option' do
69
+ specify 'not set, uses a single dropdown button' do
70
+ expect(html).not_to match %r{</button>.+</button}m
71
+ end
72
+
73
+ describe 'set to false, uses a single dropdown button' do
74
+ let(:options) { {split: false} }
75
+ it { expect(html).not_to match %r{</button>.+</button}m }
76
+ end
77
+
78
+ describe 'set to true, uses a split dropdown button' do
79
+ let(:options) { {split: true} }
80
+ it { expect(html).to match %r{</button>.+</button}m }
81
+ end
82
+ end
83
+
84
+ describe 'with the :context option' do
85
+ let(:options) { {context: context} }
86
+
87
+ describe 'set to :primary, shows a "primary" dropdown button' do
88
+ let(:context) { :primary }
89
+ it { expect(html).to include 'btn-primary' }
90
+ end
91
+
92
+ describe 'set to :success, shows a "success" dropdown button' do
93
+ let(:context) { :success }
94
+ it { expect(html).to include 'btn-success' }
95
+ end
96
+
97
+ describe 'set to :info, shows a "info" dropdown button' do
98
+ let(:context) { :info }
99
+ it { expect(html).to include 'btn-info' }
100
+ end
101
+
102
+ describe 'set to :warning, shows a "warning" dropdown button' do
103
+ let(:context) { :warning }
104
+ it { expect(html).to include 'btn-warning' }
105
+ end
106
+
107
+ describe 'set to :danger, shows a "danger" dropdown button' do
108
+ let(:context) { :danger }
109
+ it { expect(html).to include 'btn-danger' }
110
+ end
111
+
112
+ describe 'set to :link, shows a "link" dropdown button' do
113
+ let(:context) { :link }
114
+ it { expect(html).to include 'btn-link' }
115
+ end
116
+
117
+ describe 'set to any other value, shows a "default" dropdown button' do
118
+ let(:context) { :unknown }
119
+ it { expect(html).to include 'btn-default' }
120
+ end
121
+ end
122
+
123
+ describe 'without the :context option, shows a "default" dropdown button' do
124
+ let(:options) { {} }
125
+ it { expect(html).to include 'btn-default' }
126
+ end
127
+
128
+ describe 'with the :size option' do
129
+ let(:options) { {size: size} }
130
+
131
+ describe 'set to :large, shows a large dropdown button' do
132
+ let(:size) { :large }
133
+ it { expect(html).to include 'btn-lg' }
134
+ end
135
+
136
+ describe 'set to :small, shows a small dropdown button' do
137
+ let(:size) { :small }
138
+ it { expect(html).to include 'btn-sm' }
139
+ end
140
+
141
+ describe 'set to :extra_small, shows an extra-small dropdown button' do
142
+ let(:size) { :extra_small }
143
+ it { expect(html).to include 'btn-xs' }
144
+ end
145
+ end
146
+ end