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.
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