railsstrap 3.3.1 → 3.3.2
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.
- 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
|