railsstrap 3.3.1 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -27
  3. data/app/helpers/railsstrap/aside_helper.rb +59 -0
  4. data/app/helpers/railsstrap/badge_label_helper.rb +0 -4
  5. data/app/helpers/railsstrap/bootstrap_flash_helper.rb +1 -1
  6. data/app/helpers/railsstrap/date_picker_helper.rb +16 -8
  7. data/app/helpers/railsstrap/modal_helper.rb +18 -24
  8. data/lib/generators/railsstrap/install/templates/bootstrap_and_overrides.less +42 -26
  9. data/lib/railsstrap/constants.rb +1 -1
  10. data/lib/railsstrap/engine.rb +9 -5
  11. data/spec/lib/railsstrap/aside_helper_spec.rb +140 -0
  12. data/spec/lib/railsstrap/badge_label_helper_spec.rb +42 -0
  13. data/spec/lib/railsstrap/bootstrap_flash_helper_spec.rb +130 -0
  14. data/spec/lib/railsstrap/breadcrumbs_spec.rb +75 -0
  15. data/spec/lib/railsstrap/datepicker_helper_spec.rb +59 -0
  16. data/spec/lib/railsstrap/form_errors_helper_spec.rb +147 -0
  17. data/spec/lib/railsstrap/glyph_helper_spec.rb +24 -0
  18. data/spec/lib/railsstrap/icon_helper_spec.rb +24 -0
  19. data/spec/lib/railsstrap/modal_helper_spec.rb +140 -0
  20. data/spec/lib/railsstrap/navbar_helper_spec.rb +373 -0
  21. data/spec/lib/railsstrap/uri_state_spec.rb +49 -0
  22. data/spec/spec_helper.rb +20 -0
  23. data/vendor/assets/bower_components/bootstrap/Gruntfile.js +45 -8
  24. data/vendor/assets/bower_components/bootstrap/LICENSE +1 -1
  25. data/vendor/assets/bower_components/bootstrap/README.md +12 -9
  26. data/vendor/assets/bower_components/bootstrap/bower.json +1 -1
  27. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css +8 -2
  28. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css.map +1 -1
  29. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +3 -3
  30. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css +257 -23
  31. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css.map +1 -1
  32. data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css +3 -3
  33. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  34. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +273 -214
  35. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  36. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  37. data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  38. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +55 -69
  39. data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.min.js +4 -4
  40. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  41. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg +273 -214
  42. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  43. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  44. data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  45. data/vendor/assets/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js +41 -0
  46. data/vendor/assets/bower_components/bootstrap/grunt/configBridge.json +1 -0
  47. data/vendor/assets/bower_components/bootstrap/grunt/sauce_browsers.yml +4 -4
  48. data/vendor/assets/bower_components/bootstrap/js/affix.js +4 -4
  49. data/vendor/assets/bower_components/bootstrap/js/alert.js +3 -3
  50. data/vendor/assets/bower_components/bootstrap/js/button.js +3 -3
  51. data/vendor/assets/bower_components/bootstrap/js/carousel.js +7 -10
  52. data/vendor/assets/bower_components/bootstrap/js/collapse.js +4 -4
  53. data/vendor/assets/bower_components/bootstrap/js/dropdown.js +3 -3
  54. data/vendor/assets/bower_components/bootstrap/js/modal.js +3 -3
  55. data/vendor/assets/bower_components/bootstrap/js/popover.js +7 -13
  56. data/vendor/assets/bower_components/bootstrap/js/scrollspy.js +3 -3
  57. data/vendor/assets/bower_components/bootstrap/js/tab.js +3 -3
  58. data/vendor/assets/bower_components/bootstrap/js/tooltip.js +10 -16
  59. data/vendor/assets/bower_components/bootstrap/js/transition.js +2 -2
  60. data/vendor/assets/bower_components/bootstrap/less/alerts.less +5 -0
  61. data/vendor/assets/bower_components/bootstrap/less/badges.less +4 -0
  62. data/vendor/assets/bower_components/bootstrap/less/button-groups.less +2 -2
  63. data/vendor/assets/bower_components/bootstrap/less/buttons.less +1 -1
  64. data/vendor/assets/bower_components/bootstrap/less/carousel.less +8 -6
  65. data/vendor/assets/bower_components/bootstrap/less/close.less +1 -0
  66. data/vendor/assets/bower_components/bootstrap/less/dropdowns.less +2 -1
  67. data/vendor/assets/bower_components/bootstrap/less/forms.less +41 -21
  68. data/vendor/assets/bower_components/bootstrap/less/glyphicons.less +67 -0
  69. data/vendor/assets/bower_components/bootstrap/less/jumbotron.less +1 -0
  70. data/vendor/assets/bower_components/bootstrap/less/media.less +14 -0
  71. data/vendor/assets/bower_components/bootstrap/less/mixins/vendor-prefixes.less +1 -1
  72. data/vendor/assets/bower_components/bootstrap/less/navbar.less +1 -0
  73. data/vendor/assets/bower_components/bootstrap/less/panels.less +5 -1
  74. data/vendor/assets/bower_components/bootstrap/less/popovers.less +1 -1
  75. data/vendor/assets/bower_components/bootstrap/less/tables.less +3 -3
  76. data/vendor/assets/bower_components/bootstrap/less/theme.less +3 -2
  77. data/vendor/assets/bower_components/bootstrap/less/tooltip.less +1 -1
  78. data/vendor/assets/bower_components/bootstrap/less/variables.less +3 -2
  79. data/vendor/assets/bower_components/bootstrap/package.json +14 -13
  80. data/vendor/assets/bower_components/jquery/bower.json +2 -2
  81. data/vendor/assets/bower_components/jquery/dist/jquery.js +277 -262
  82. data/vendor/assets/bower_components/jquery/dist/jquery.min.js +4 -4
  83. data/vendor/assets/bower_components/jquery/dist/jquery.min.map +1 -1
  84. data/vendor/assets/bower_components/jquery/src/ajax.js +11 -31
  85. data/vendor/assets/bower_components/jquery/src/ajax/xhr.js +3 -2
  86. data/vendor/assets/bower_components/jquery/src/attributes/attr.js +0 -2
  87. data/vendor/assets/bower_components/jquery/src/attributes/classes.js +4 -4
  88. data/vendor/assets/bower_components/jquery/src/attributes/prop.js +1 -3
  89. data/vendor/assets/bower_components/jquery/src/attributes/support.js +8 -8
  90. data/vendor/assets/bower_components/jquery/src/attributes/val.js +3 -5
  91. data/vendor/assets/bower_components/jquery/src/core.js +6 -7
  92. data/vendor/assets/bower_components/jquery/src/core/init.js +3 -3
  93. data/vendor/assets/bower_components/jquery/src/core/ready.js +1 -1
  94. data/vendor/assets/bower_components/jquery/src/css.js +28 -29
  95. data/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +2 -4
  96. data/vendor/assets/bower_components/jquery/src/css/curCSS.js +1 -1
  97. data/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +1 -1
  98. data/vendor/assets/bower_components/jquery/src/css/support.js +5 -0
  99. data/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +8 -1
  100. data/vendor/assets/bower_components/jquery/src/data.js +10 -11
  101. data/vendor/assets/bower_components/jquery/src/data/Data.js +3 -3
  102. data/vendor/assets/bower_components/jquery/src/deferred.js +2 -2
  103. data/vendor/assets/bower_components/jquery/src/dimensions.js +1 -1
  104. data/vendor/assets/bower_components/jquery/src/effects.js +29 -30
  105. data/vendor/assets/bower_components/jquery/src/effects/Tween.js +7 -7
  106. data/vendor/assets/bower_components/jquery/src/event.js +5 -5
  107. data/vendor/assets/bower_components/jquery/src/event/ajax.js +13 -0
  108. data/vendor/assets/bower_components/jquery/src/exports/global.js +2 -2
  109. data/vendor/assets/bower_components/jquery/src/intro.js +8 -8
  110. data/vendor/assets/bower_components/jquery/src/jquery.js +1 -0
  111. data/vendor/assets/bower_components/jquery/src/manipulation.js +9 -11
  112. data/vendor/assets/bower_components/jquery/src/manipulation/support.js +6 -5
  113. data/vendor/assets/bower_components/jquery/src/offset.js +9 -6
  114. data/vendor/assets/bower_components/jquery/src/queue.js +3 -3
  115. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.js +83 -60
  116. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -3
  117. data/vendor/assets/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -1
  118. data/vendor/assets/bower_components/jquery/src/traversing.js +3 -4
  119. data/vendor/assets/bower_components/jquery/src/wrap.js +1 -0
  120. data/vendor/assets/stylesheets/aside/aside.less +18 -2
  121. data/vendor/assets/stylesheets/bootstrap.less +2 -0
  122. data/vendor/assets/stylesheets/dist/railsstrap.css +28 -6
  123. data/vendor/assets/stylesheets/fontawesome-local.less +15 -0
  124. data/vendor/assets/stylesheets/glyphicons.less +12 -0
  125. 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">&times;</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">&times;</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">&times;</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">&times;</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=\"&#x2713;\"/>
368
+ </div>
369
+ <input id=\"search_stub\" name=\"search[stub]\" type=\"text\"/>
370
+ </form>
371
+ </div>
372
+ </nav>
373
+ HTML