railsstrap 3.3.1 → 3.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -27
- data/app/helpers/railsstrap/aside_helper.rb +59 -0
- data/app/helpers/railsstrap/badge_label_helper.rb +0 -4
- data/app/helpers/railsstrap/bootstrap_flash_helper.rb +1 -1
- data/app/helpers/railsstrap/date_picker_helper.rb +16 -8
- data/app/helpers/railsstrap/modal_helper.rb +18 -24
- data/lib/generators/railsstrap/install/templates/bootstrap_and_overrides.less +42 -26
- data/lib/railsstrap/constants.rb +1 -1
- data/lib/railsstrap/engine.rb +9 -5
- data/spec/lib/railsstrap/aside_helper_spec.rb +140 -0
- data/spec/lib/railsstrap/badge_label_helper_spec.rb +42 -0
- data/spec/lib/railsstrap/bootstrap_flash_helper_spec.rb +130 -0
- data/spec/lib/railsstrap/breadcrumbs_spec.rb +75 -0
- data/spec/lib/railsstrap/datepicker_helper_spec.rb +59 -0
- data/spec/lib/railsstrap/form_errors_helper_spec.rb +147 -0
- data/spec/lib/railsstrap/glyph_helper_spec.rb +24 -0
- data/spec/lib/railsstrap/icon_helper_spec.rb +24 -0
- data/spec/lib/railsstrap/modal_helper_spec.rb +140 -0
- data/spec/lib/railsstrap/navbar_helper_spec.rb +373 -0
- data/spec/lib/railsstrap/uri_state_spec.rb +49 -0
- data/spec/spec_helper.rb +20 -0
- data/vendor/assets/bower_components/bootstrap/Gruntfile.js +45 -8
- data/vendor/assets/bower_components/bootstrap/LICENSE +1 -1
- data/vendor/assets/bower_components/bootstrap/README.md +12 -9
- data/vendor/assets/bower_components/bootstrap/bower.json +1 -1
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css +8 -2
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css.map +1 -1
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +3 -3
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css +257 -23
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css.map +1 -1
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css +3 -3
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +273 -214
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +55 -69
- data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.min.js +4 -4
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg +273 -214
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/vendor/assets/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js +41 -0
- data/vendor/assets/bower_components/bootstrap/grunt/configBridge.json +1 -0
- data/vendor/assets/bower_components/bootstrap/grunt/sauce_browsers.yml +4 -4
- data/vendor/assets/bower_components/bootstrap/js/affix.js +4 -4
- data/vendor/assets/bower_components/bootstrap/js/alert.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/button.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/carousel.js +7 -10
- data/vendor/assets/bower_components/bootstrap/js/collapse.js +4 -4
- data/vendor/assets/bower_components/bootstrap/js/dropdown.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/modal.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/popover.js +7 -13
- data/vendor/assets/bower_components/bootstrap/js/scrollspy.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/tab.js +3 -3
- data/vendor/assets/bower_components/bootstrap/js/tooltip.js +10 -16
- data/vendor/assets/bower_components/bootstrap/js/transition.js +2 -2
- data/vendor/assets/bower_components/bootstrap/less/alerts.less +5 -0
- data/vendor/assets/bower_components/bootstrap/less/badges.less +4 -0
- data/vendor/assets/bower_components/bootstrap/less/button-groups.less +2 -2
- data/vendor/assets/bower_components/bootstrap/less/buttons.less +1 -1
- data/vendor/assets/bower_components/bootstrap/less/carousel.less +8 -6
- data/vendor/assets/bower_components/bootstrap/less/close.less +1 -0
- data/vendor/assets/bower_components/bootstrap/less/dropdowns.less +2 -1
- data/vendor/assets/bower_components/bootstrap/less/forms.less +41 -21
- data/vendor/assets/bower_components/bootstrap/less/glyphicons.less +67 -0
- data/vendor/assets/bower_components/bootstrap/less/jumbotron.less +1 -0
- data/vendor/assets/bower_components/bootstrap/less/media.less +14 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/vendor-prefixes.less +1 -1
- data/vendor/assets/bower_components/bootstrap/less/navbar.less +1 -0
- data/vendor/assets/bower_components/bootstrap/less/panels.less +5 -1
- data/vendor/assets/bower_components/bootstrap/less/popovers.less +1 -1
- data/vendor/assets/bower_components/bootstrap/less/tables.less +3 -3
- data/vendor/assets/bower_components/bootstrap/less/theme.less +3 -2
- data/vendor/assets/bower_components/bootstrap/less/tooltip.less +1 -1
- data/vendor/assets/bower_components/bootstrap/less/variables.less +3 -2
- data/vendor/assets/bower_components/bootstrap/package.json +14 -13
- data/vendor/assets/bower_components/jquery/bower.json +2 -2
- data/vendor/assets/bower_components/jquery/dist/jquery.js +277 -262
- data/vendor/assets/bower_components/jquery/dist/jquery.min.js +4 -4
- data/vendor/assets/bower_components/jquery/dist/jquery.min.map +1 -1
- data/vendor/assets/bower_components/jquery/src/ajax.js +11 -31
- data/vendor/assets/bower_components/jquery/src/ajax/xhr.js +3 -2
- data/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -2
- data/vendor/assets/bower_components/jquery/src/attributes/classes.js +4 -4
- data/vendor/assets/bower_components/jquery/src/attributes/prop.js +1 -3
- data/vendor/assets/bower_components/jquery/src/attributes/support.js +8 -8
- data/vendor/assets/bower_components/jquery/src/attributes/val.js +3 -5
- data/vendor/assets/bower_components/jquery/src/core.js +6 -7
- data/vendor/assets/bower_components/jquery/src/core/init.js +3 -3
- data/vendor/assets/bower_components/jquery/src/core/ready.js +1 -1
- data/vendor/assets/bower_components/jquery/src/css.js +28 -29
- data/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +2 -4
- data/vendor/assets/bower_components/jquery/src/css/curCSS.js +1 -1
- data/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +1 -1
- data/vendor/assets/bower_components/jquery/src/css/support.js +5 -0
- data/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +8 -1
- data/vendor/assets/bower_components/jquery/src/data.js +10 -11
- data/vendor/assets/bower_components/jquery/src/data/Data.js +3 -3
- data/vendor/assets/bower_components/jquery/src/deferred.js +2 -2
- data/vendor/assets/bower_components/jquery/src/dimensions.js +1 -1
- data/vendor/assets/bower_components/jquery/src/effects.js +29 -30
- data/vendor/assets/bower_components/jquery/src/effects/Tween.js +7 -7
- data/vendor/assets/bower_components/jquery/src/event.js +5 -5
- data/vendor/assets/bower_components/jquery/src/event/ajax.js +13 -0
- data/vendor/assets/bower_components/jquery/src/exports/global.js +2 -2
- data/vendor/assets/bower_components/jquery/src/intro.js +8 -8
- data/vendor/assets/bower_components/jquery/src/jquery.js +1 -0
- data/vendor/assets/bower_components/jquery/src/manipulation.js +9 -11
- data/vendor/assets/bower_components/jquery/src/manipulation/support.js +6 -5
- data/vendor/assets/bower_components/jquery/src/offset.js +9 -6
- data/vendor/assets/bower_components/jquery/src/queue.js +3 -3
- data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +83 -60
- data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -3
- data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -1
- data/vendor/assets/bower_components/jquery/src/traversing.js +3 -4
- data/vendor/assets/bower_components/jquery/src/wrap.js +1 -0
- data/vendor/assets/stylesheets/aside/aside.less +18 -2
- data/vendor/assets/stylesheets/bootstrap.less +2 -0
- data/vendor/assets/stylesheets/dist/railsstrap.css +28 -6
- data/vendor/assets/stylesheets/fontawesome-local.less +15 -0
- data/vendor/assets/stylesheets/glyphicons.less +12 -0
- metadata +278 -7
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'action_view'
|
4
|
+
require 'active_support'
|
5
|
+
require_relative '../../../app/helpers/railsstrap/glyph_helper'
|
6
|
+
|
7
|
+
include ActionView::Helpers
|
8
|
+
include ActionView::Context
|
9
|
+
include Railsstrap::GlyphHelper
|
10
|
+
|
11
|
+
describe Railsstrap::GlyphHelper, :type => :helper do
|
12
|
+
it "should return a basic railsstrap glyph" do
|
13
|
+
expect(glyph(:thumbs_up).gsub(/\s/, '').downcase)
|
14
|
+
.to eql(BASIC_GLYPH.gsub(/\s/, '').downcase)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return a railsstrap glyph with span" do
|
18
|
+
expect(glyph(:thumbs_up, {:tag => :span}).gsub(/\s/, '').downcase)
|
19
|
+
.to eql(GLYPH_WITH_SPAN.gsub(/\s/, '').downcase)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
BASIC_GLYPH = %{<iclass=\"glyphiconglyphicon-thumbs-up\"></i>}
|
24
|
+
GLYPH_WITH_SPAN = %{<spanclass=\"glyphiconglyphicon-thumbs-up\"></span>}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'action_view'
|
4
|
+
require 'active_support'
|
5
|
+
require_relative '../../../app/helpers/railsstrap/icon_helper'
|
6
|
+
|
7
|
+
include ActionView::Helpers
|
8
|
+
include ActionView::Context
|
9
|
+
include Railsstrap::IconHelper
|
10
|
+
|
11
|
+
describe Railsstrap::IconHelper, :type => :helper do
|
12
|
+
it "should return a basic fontawesome icon" do
|
13
|
+
expect(icon(:refresh).gsub(/\s/, '').downcase)
|
14
|
+
.to eql(BASIC_ICON.gsub(/\s/, '').downcase)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return a fontawesome icon with span" do
|
18
|
+
expect(icon(:refresh, {:tag => :span}).gsub(/\s/, '').downcase)
|
19
|
+
.to eql(ICON_WITH_SPAN.gsub(/\s/, '').downcase)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
BASIC_ICON = %{<iclass=\"fafa-refresh\"></i>}
|
24
|
+
ICON_WITH_SPAN = %{<spanclass=\"fafa-refresh\"></span>}
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require_relative '../../../app/helpers/railsstrap/modal_helper'
|
4
|
+
|
5
|
+
include ActionView::Helpers
|
6
|
+
include ActionView::Context
|
7
|
+
include Railsstrap::ModalHelper
|
8
|
+
|
9
|
+
describe Railsstrap::ModalHelper, :type => :helper do
|
10
|
+
header_with_close = {:show_close => true, :dismiss => 'modal', :title => 'Modal header'}
|
11
|
+
header_without_close = {:show_close => false, :title => 'Modal header'}
|
12
|
+
options = {:id => "modal",
|
13
|
+
:header => header_with_close,
|
14
|
+
:body => {content: 'This is the body'},
|
15
|
+
:footer => {content: content_tag(:button, 'Save', :class => 'btn')}
|
16
|
+
}
|
17
|
+
|
18
|
+
it 'returns a complete modal' do
|
19
|
+
expect(modal_dialog(options).gsub(/\s/, '')).to eql BASIC_MODAL.gsub(/\s/, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns a centered modal' do
|
23
|
+
options[:class] = 'center'
|
24
|
+
expect(modal_dialog(options).gsub(/\s/, '')).to eql CENTERED_MODAL.gsub(/\s/, '')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns a modal header with a close button if show_close is true' do
|
28
|
+
expect(modal_header(header_with_close).gsub(/\s/, '')).to eql MODAL_HEADER_WITH_CLOSE.gsub(/\s/, '')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'renders a modal header without a close button' do
|
32
|
+
expect(modal_header(header_without_close).gsub(/\s/, '')).to eql MODAL_HEADER_WITHOUT_CLOSE.gsub(/\s/, '')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'renders a modal body' do
|
36
|
+
expect(modal_body(options[:body]).gsub(/\s/, '')).to eql MODAL_BODY.gsub(/\s/, '')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'renders a modal footer' do
|
40
|
+
expect(modal_footer(options[:footer]).gsub(/\s/, '')).to eql MODAL_FOOTER.gsub(/\s/, '')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'renders a close button' do
|
44
|
+
expect(close_button('modal')).to eql CLOSE_BUTTON.gsub(/\n/, '')
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'renders a modal toggle button' do
|
48
|
+
expect(modal_toggle(:content => 'Save', :href => "#modal").gsub(/\s/, '')).to eql MODAL_TOGGLE.gsub(/\s/, '')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'renders a modal toggle button with options changed' do
|
52
|
+
expect(modal_toggle(:content => 'Save', :href => "#modal", :data => {:foo => true, :toggle => 'modal'}).gsub(/\s/, '')).to eql MODAL_TOGGLE_OPTS.gsub(/\s/, '')
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'renders a modal toggle button with a block given' do
|
56
|
+
expect(modal_toggle(:href => "#modal", :data => {:foo => true, :toggle => 'modal'}){ content_tag(:span, 'Blocks Rock', class: "i-added-you") }.gsub(/\s/, '')).to eql MODAL_TOGGLE_BLOCK.gsub(/\s/, '')
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'renders a cancel button' do
|
60
|
+
expect(modal_cancel_button('Cancel', :href => "#modal", :data => {:dismiss => 'modal'}).gsub(/\s/, '')).to eql MODAL_CANCEL_BUTTON.gsub(/\s/, '')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
BASIC_MODAL = <<-HTML
|
65
|
+
<div id="modal" class="railsstrap-modal modal fade">
|
66
|
+
<div class="modal-dialog ">
|
67
|
+
<div class="modal-content">
|
68
|
+
<div class="modal-header">
|
69
|
+
<button class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
70
|
+
<h4 class="modal-title">Modal header</h4>
|
71
|
+
</div>
|
72
|
+
<div class="modal-body">This is the body</div>
|
73
|
+
<div class="modal-footer">
|
74
|
+
<button class="btn">Save</button>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
HTML
|
80
|
+
|
81
|
+
CENTERED_MODAL = <<-HTML
|
82
|
+
<div id="modal" class="railsstrap-modal modal center fade">
|
83
|
+
<div class="modal-dialog ">
|
84
|
+
<div class="modal-content">
|
85
|
+
<div class="modal-header">
|
86
|
+
<button class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
87
|
+
<h4 class="modal-title">Modal header</h4>
|
88
|
+
</div>
|
89
|
+
<div class="modal-body">This is the body</div>
|
90
|
+
<div class="modal-footer">
|
91
|
+
<button class="btn">Save</button>
|
92
|
+
</div>
|
93
|
+
</div>
|
94
|
+
</div>
|
95
|
+
</div>
|
96
|
+
HTML
|
97
|
+
|
98
|
+
MODAL_BODY = <<-HTML
|
99
|
+
<div class="modal-body">This is the body</div>
|
100
|
+
HTML
|
101
|
+
|
102
|
+
MODAL_FOOTER = <<-HTML
|
103
|
+
<div class="modal-footer"><button class="btn">Save</button></div>
|
104
|
+
HTML
|
105
|
+
|
106
|
+
MODAL_HEADER_WITHOUT_CLOSE = <<-HTML
|
107
|
+
<div class="modal-header"><h4 class="modal-title">Modal header</h4></div>
|
108
|
+
HTML
|
109
|
+
|
110
|
+
MODAL_HEADER_WITH_CLOSE = <<-HTML
|
111
|
+
<div class="modal-header">
|
112
|
+
<button class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
113
|
+
<h4 class="modal-title">Modal header</h4>
|
114
|
+
</div>
|
115
|
+
HTML
|
116
|
+
|
117
|
+
MODAL_TOGGLE = <<-HTML
|
118
|
+
<a class="btn btn-default" data-toggle="modal" href="#modal">Save</a>
|
119
|
+
HTML
|
120
|
+
|
121
|
+
MODAL_TOGGLE_OPTS = <<-HTML
|
122
|
+
<a class="btn btn-default" data-foo="true" data-toggle="modal" href="#modal">Save</a>
|
123
|
+
HTML
|
124
|
+
|
125
|
+
MODAL_TOGGLE_BLOCK = <<-HTML
|
126
|
+
<a class="btn btn-default" data-foo="true" data-toggle="modal" href="#modal">
|
127
|
+
<span class="i-added-you">
|
128
|
+
Blocks Rock
|
129
|
+
</span>
|
130
|
+
</a>
|
131
|
+
HTML
|
132
|
+
|
133
|
+
MODAL_CANCEL_BUTTON = <<-HTML
|
134
|
+
<a class="btn railsstrap-modal-cancel-button" href="#modal" data-dismiss="modal">Cancel</a>
|
135
|
+
HTML
|
136
|
+
|
137
|
+
CLOSE_BUTTON = <<-HTML
|
138
|
+
<button class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
139
|
+
HTML
|
140
|
+
|
@@ -0,0 +1,373 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#Credit for this goes to https://github.com/julescopeland/Rails-Bootstrap-Navbar
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'action_view'
|
5
|
+
require 'active_support'
|
6
|
+
require_relative '../../../app/helpers/railsstrap/navbar_helper'
|
7
|
+
|
8
|
+
include ActionView::Helpers
|
9
|
+
include ActionView::Context
|
10
|
+
include Railsstrap::NavbarHelper
|
11
|
+
|
12
|
+
describe Railsstrap::NavbarHelper, :type => :helper do
|
13
|
+
before do
|
14
|
+
allow(self).to receive(:uri_state) { :inactive }
|
15
|
+
allow(self).to receive(:root_url) { '/' }
|
16
|
+
end
|
17
|
+
describe "nav_bar" do
|
18
|
+
it "should return a basic railsstrap navbar" do
|
19
|
+
expect(nav_bar.gsub(/\s/, '').downcase)
|
20
|
+
.to eql(BASIC_NAVBAR.gsub(/\s/, '').downcase)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should set the fixed position to top" do
|
24
|
+
expect(nav_bar(:fixed => :top).gsub(/\s/, '').downcase)
|
25
|
+
.to eql(FIXED_TOP_NAVBAR.gsub(/\s/, '').downcase)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should set the static position to top" do
|
29
|
+
expect(nav_bar(:static => :top).gsub(/\s/, '').downcase)
|
30
|
+
.to eql(STATIC_TOP_NAVBAR.gsub(/\s/, '').downcase)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should set the fixed position to bottom" do
|
34
|
+
expect(nav_bar(:fixed => :bottom).gsub(/\s/, '').downcase)
|
35
|
+
.to eql(FIXED_BOTTOM_NAVBAR.gsub(/\s/, '').downcase)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should set the style to inverse" do
|
39
|
+
expect(nav_bar(:inverse => true).gsub(/\s/, '').downcase)
|
40
|
+
.to eql(INVERSE_NAVBAR.gsub(/\s/, '').downcase)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should add the brand name and link it to the home page" do
|
44
|
+
expect(nav_bar(:brand => "Ninety Ten").gsub(/\s/, '').downcase)
|
45
|
+
.to eql(NAVBAR_WITH_BRAND.gsub(/\s/, '').downcase)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be able to set the brand link url" do
|
49
|
+
expect(nav_bar(:brand => "Ninety Ten", :brand_link => "http://www.ninetyten.com").gsub(/\s/, '').downcase)
|
50
|
+
.to eql(NAVBAR_WITH_BRAND_AND_LINK.gsub(/\s/, '').downcase)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should be able to set the brand link url without a turbolink" do
|
54
|
+
expect(nav_bar(:brand => "Ninety Ten", :brand_link => "http://www.ninetyten.com", :no_turbolink => true).gsub(/\s/, '').downcase)
|
55
|
+
.to eql(NAVBAR_WITH_BRAND_AND_LINK_TBLINK.gsub(/\s/, '').downcase)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should add the buttons etc for a responsive layout with no block passed" do
|
59
|
+
expect(nav_bar(:responsive => true).gsub(/\s/, '').downcase).to eql(RESPONSIVE_NAVBAR.gsub(/\s/, '').downcase)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should add the buttons etc for a responsive layout with block passed" do
|
63
|
+
ele = nav_bar(:responsive => true) do
|
64
|
+
'<p>Passing a block</p>'.html_safe
|
65
|
+
end
|
66
|
+
expect(ele.gsub(/\s/, '').downcase).to eql(RESPONSIVE_NAVBAR_WITH_BLOCK.gsub(/\s/, '').downcase)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should render contained items" do
|
70
|
+
ele = nav_bar do
|
71
|
+
menu_group do
|
72
|
+
menu_item("Home", "/") + menu_item("Products", "/products")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
expect(ele.gsub(/\s/, '').downcase).to eql(PLAIN_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should still render the brand name even with other options turned on" do
|
79
|
+
ele = nav_bar(:brand => "Something") do
|
80
|
+
menu_group do
|
81
|
+
menu_item "Home", "/"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
expect(ele.gsub(/\s/, '').downcase).to eql(BRANDED_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "menu_group" do
|
89
|
+
it "should return a ul with the class 'nav'" do
|
90
|
+
ele = menu_group do
|
91
|
+
menu_item("Home", "/") + menu_item("Products", "/products")
|
92
|
+
end
|
93
|
+
expect(ele).to eql '<ul class="nav navbar-nav "><li><a href="/">Home</a></li><li><a href="/products">Products</a></li></ul>'
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should return a ul with class .navbar-left when passed the {:pull => :left} option" do
|
97
|
+
ele = menu_group(:pull => :left) do
|
98
|
+
menu_item("Home", "/")
|
99
|
+
end
|
100
|
+
expect(ele).to eql('<ul class="nav navbar-nav navbar-left"><li><a href="/">Home</a></li></ul>')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "menu_item" do
|
105
|
+
it "should return a link within an li tag" do
|
106
|
+
allow(self).to receive(:current_page?) { false }
|
107
|
+
expect(menu_item("Home", "/")).to eql('<li><a href="/">Home</a></li>')
|
108
|
+
end
|
109
|
+
it "should return the link with class 'active' if on current page" do
|
110
|
+
allow(self).to receive(:uri_state) { :active }
|
111
|
+
expect(menu_item("Home", "/")).to eql('<li class="active"><a href="/">Home</a></li>')
|
112
|
+
end
|
113
|
+
it "should pass any other options through to the link_to method" do
|
114
|
+
allow(self).to receive_message_chain("uri_state").and_return(:active)
|
115
|
+
expect(menu_item("Log out", "/users/sign_out", :class => "home_link", :method => :delete)).to eql('<li class="active"><a class="home_link" rel="nofollow" data-method="delete" href="/users/sign_out">Log out</a></li>')
|
116
|
+
end
|
117
|
+
it "should pass a block but no name if a block is present" do
|
118
|
+
allow(self).to receive(:current_page?) { false }
|
119
|
+
expect(menu_item("/"){content_tag("i", "", :class => "icon-home") + " Home"}).to eql('<li><a href="/"><i class="icon-home"></i> Home</a></li>')
|
120
|
+
end
|
121
|
+
it "should work with just a block" do
|
122
|
+
allow(self).to receive(:current_page?) { false }
|
123
|
+
expect(menu_item{ content_tag("i", "", :class => "icon-home") + " Home" }).to eql('<li><a href="#"><i class="icon-home"></i> Home</a></li>')
|
124
|
+
end
|
125
|
+
it "should return the link with class 'active' if on current page with a block" do
|
126
|
+
allow(self).to receive(:uri_state) { :active }
|
127
|
+
expect(menu_item("/"){ content_tag("i", "", :class => "icon-home") + " Home" }).to eql('<li class="active"><a href="/"><i class="icon-home"></i> Home</a></li>')
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "drop_down" do
|
132
|
+
it "should do render the proper drop down code" do
|
133
|
+
ele = drop_down "Products" do
|
134
|
+
menu_item "Latest", "/"
|
135
|
+
end
|
136
|
+
expect(ele).to have_tag(:li, with: {class: 'dropdown'})
|
137
|
+
expect(ele).to have_tag(:a, with: {class: 'dropdown-toggle'})
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "drop_down_with_submenu" do
|
142
|
+
it "should do render the proper drop down code" do
|
143
|
+
ele = drop_down_with_submenu "Products" do
|
144
|
+
drop_down_submenu "Latest" do
|
145
|
+
menu_item "Option1", "/"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
expect(ele).to have_tag(:li, with: {class: 'dropdown'})
|
149
|
+
expect(ele).to have_tag(:a, with: {class: 'dropdown-toggle'})
|
150
|
+
expect(ele).to have_tag(:ul, with: {class: 'dropdown-menu'})
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "drop_down_divider" do
|
155
|
+
it "should render <li class='divider-vertical'></li>" do
|
156
|
+
expect(drop_down_divider).to match '<li class="divider"></li>'
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "drop_down_header" do
|
161
|
+
it "should render <li class='divider-vertical'></li>" do
|
162
|
+
expect(drop_down_header('Home')).to match '<li class="nav-header">Home</li>'
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "menu_divider" do
|
167
|
+
it "should render <li class='divider-vertical'></li>" do
|
168
|
+
expect(menu_divider).to match '<li class="divider-vertical"></li>'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "menu_text" do
|
173
|
+
it "should render text within p tags with class 'navbar-text" do
|
174
|
+
expect(menu_text("Strapline!")).to match("<p class=\"navbar-text\">Strapline!</p>")
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should be able to be pulled right or left" do
|
178
|
+
expect(menu_text("I am being pulled right", :pull => :right)).to match("<p class=\"pull-right navbar-text\">I am being pulled right</p>")
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should be able to cope with arbitrary options being passed to the p tag" do
|
182
|
+
expect(menu_text("I am classy!", :class => "classy", :id => "classy_text")).to match("<p class=\"classy navbar-text\" id=\"classy_text\">I am classy!</p>")
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should be able to cope with a block too" do
|
186
|
+
ele = menu_text("I have been rendered programmatically!")
|
187
|
+
expect(ele).to have_tag(:p, with: {class: "navbar-text"})
|
188
|
+
expect(ele).to match "I have been rendered programmatically!"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "rendering forms ok" do
|
193
|
+
it "should not escape anything unexpectedly" do
|
194
|
+
expect(
|
195
|
+
nav_bar do
|
196
|
+
form_tag "/", :method => 'get' do |f|
|
197
|
+
f.text_field :search, "stub"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
).to have_tag(:form)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "default navbar" do
|
205
|
+
it "renders a navbar" do
|
206
|
+
expect(nav_bar { 'foo' }).to have_tag(:nav, with: { class: 'navbar navbar-default', role: 'navigation' }, text: /foo/)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
# HTML output
|
213
|
+
|
214
|
+
BASIC_NAVBAR = <<-HTML
|
215
|
+
<nav class="navbar navbar-default" role="navigation">
|
216
|
+
<div class="container">
|
217
|
+
</div>
|
218
|
+
</nav>
|
219
|
+
HTML
|
220
|
+
|
221
|
+
FIXED_TOP_NAVBAR = <<-HTML
|
222
|
+
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
|
223
|
+
<div class="container">
|
224
|
+
</div>
|
225
|
+
</nav>
|
226
|
+
HTML
|
227
|
+
|
228
|
+
STATIC_TOP_NAVBAR = <<-HTML
|
229
|
+
<nav class="navbar navbar-default navbar-static-top" role="navigation">
|
230
|
+
<div class="container">
|
231
|
+
</div>
|
232
|
+
</nav>
|
233
|
+
HTML
|
234
|
+
|
235
|
+
FIXED_BOTTOM_NAVBAR = <<-HTML
|
236
|
+
<nav class="navbar navbar-default navbar-fixed-bottom" role="navigation">
|
237
|
+
<div class="container">
|
238
|
+
</div>
|
239
|
+
</nav>
|
240
|
+
HTML
|
241
|
+
|
242
|
+
INVERSE_NAVBAR = <<-HTML
|
243
|
+
<nav class="navbar navbar-default navbar-inverse" role="navigation">
|
244
|
+
<div class="container">
|
245
|
+
</div>
|
246
|
+
</nav>
|
247
|
+
HTML
|
248
|
+
|
249
|
+
NAVBAR_WITH_BRAND = <<-HTML
|
250
|
+
<nav class="navbar navbar-default" role="navigation">
|
251
|
+
<div class="container">
|
252
|
+
<a class="navbar-brand" href="/">
|
253
|
+
Ninety Ten
|
254
|
+
</a>
|
255
|
+
</div>
|
256
|
+
</nav>
|
257
|
+
HTML
|
258
|
+
|
259
|
+
NAVBAR_WITH_BRAND_AND_LINK = <<-HTML
|
260
|
+
<nav class="navbar navbar-default" role="navigation">
|
261
|
+
<div class="container">
|
262
|
+
<a class="navbar-brand" href="http://www.ninetyten.com">
|
263
|
+
Ninety Ten
|
264
|
+
</a>
|
265
|
+
</div>
|
266
|
+
</nav>
|
267
|
+
HTML
|
268
|
+
|
269
|
+
NAVBAR_WITH_BRAND_AND_LINK_TBLINK = <<-HTML
|
270
|
+
<nav class="navbar navbar-default" role="navigation">
|
271
|
+
<div class="container">
|
272
|
+
<a class="navbar-brand" data-no-turbolink="true" href="http://www.ninetyten.com">
|
273
|
+
Ninety Ten
|
274
|
+
</a>
|
275
|
+
</div>
|
276
|
+
</nav>
|
277
|
+
HTML
|
278
|
+
|
279
|
+
RESPONSIVE_NAVBAR = <<-HTML
|
280
|
+
<nav class="navbar navbar-default" role="navigation">
|
281
|
+
<div class="container">
|
282
|
+
<div class="navbar-header">
|
283
|
+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
284
|
+
<span class="sr-only">Toggle Navigation</span>
|
285
|
+
<span class="icon-bar"></span>
|
286
|
+
<span class="icon-bar"></span>
|
287
|
+
<span class="icon-bar"></span>
|
288
|
+
</button>
|
289
|
+
</div>
|
290
|
+
<div class="navbar-collapse collapse">
|
291
|
+
</div>
|
292
|
+
</div>
|
293
|
+
</nav>
|
294
|
+
HTML
|
295
|
+
|
296
|
+
RESPONSIVE_NAVBAR_WITH_BLOCK = <<-HTML
|
297
|
+
<nav class="navbar navbar-default" role="navigation">
|
298
|
+
<div class="container">
|
299
|
+
<div class="navbar-header">
|
300
|
+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
301
|
+
<span class="sr-only">Toggle Navigation</span>
|
302
|
+
<span class="icon-bar"></span>
|
303
|
+
<span class="icon-bar"></span>
|
304
|
+
<span class="icon-bar"></span>
|
305
|
+
</button>
|
306
|
+
</div>
|
307
|
+
<div class="navbar-collapse collapse">
|
308
|
+
<p>Passing a block</p>
|
309
|
+
</div>
|
310
|
+
</div>
|
311
|
+
</nav>
|
312
|
+
HTML
|
313
|
+
|
314
|
+
PLAIN_NAVBAR_WITH_ITEM = <<-HTML
|
315
|
+
<nav class="navbar navbar-default" role="navigation">
|
316
|
+
<div class="container">
|
317
|
+
<ul class="nav navbar-nav">
|
318
|
+
<li>
|
319
|
+
<a href="/">Home</a>
|
320
|
+
</li>
|
321
|
+
<li>
|
322
|
+
<a href="/products">Products</a>
|
323
|
+
</li>
|
324
|
+
</ul>
|
325
|
+
</div>
|
326
|
+
</nav>
|
327
|
+
HTML
|
328
|
+
|
329
|
+
BRANDED_NAVBAR_WITH_ITEM = <<-HTML
|
330
|
+
<nav class="navbar navbar-default" role="navigation">
|
331
|
+
<div class="container">
|
332
|
+
<a class="navbar-brand" href="/">
|
333
|
+
Something
|
334
|
+
</a>
|
335
|
+
<ul class="nav navbar-nav">
|
336
|
+
<li>
|
337
|
+
<a href="/">Home</a>
|
338
|
+
</li>
|
339
|
+
</ul>
|
340
|
+
</div>
|
341
|
+
</nav>
|
342
|
+
HTML
|
343
|
+
|
344
|
+
DROPDOWN_MENU = <<-HTML
|
345
|
+
<li class="dropdown"> <a class="dropdown-toggle"data-toggle="dropdown"href="#"> Products <b class="caret"></b> </a> <ul class="dropdown-menu"> <li><a href="/">Latest</a></li> </ul> </li>
|
346
|
+
HTML
|
347
|
+
|
348
|
+
DROPDOWN_MENU_WITH_SUBMENU = <<-HTML
|
349
|
+
<li class="dropdown">
|
350
|
+
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Products <b class="caret"></b></a>
|
351
|
+
<ul class="dropdown-menu">
|
352
|
+
<li class="dropdown-submenu">
|
353
|
+
<a href="">Latest</a>
|
354
|
+
<ul class="dropdown-menu">
|
355
|
+
<li><a href="/">Option1</a></li>
|
356
|
+
</ul>
|
357
|
+
</li>
|
358
|
+
</ul>
|
359
|
+
</li>
|
360
|
+
HTML
|
361
|
+
|
362
|
+
PLAIN_NAVBAR_WITH_FORM = <<-HTML
|
363
|
+
<nav class=\"navbar navbar-default\"role=\"navigation\">
|
364
|
+
<div class=\"container\">
|
365
|
+
<form accept-charset=\"utf-8\" action=\"/\" method=\"get\">
|
366
|
+
<div style=\"display:none\">
|
367
|
+
<input name=\"utf8\" type=\"hidden\" value=\"✓\"/>
|
368
|
+
</div>
|
369
|
+
<input id=\"search_stub\" name=\"search[stub]\" type=\"text\"/>
|
370
|
+
</form>
|
371
|
+
</div>
|
372
|
+
</nav>
|
373
|
+
HTML
|