kadmin 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -44
  3. data/Rakefile +146 -146
  4. data/app/assets/javascripts/modular/app.js +1388 -1388
  5. data/app/assets/javascripts/modular/application.js +3 -3
  6. data/app/assets/javascripts/modular/vendor.js +57671 -57671
  7. data/app/assets/stylesheets/kadmin/typeahead-select.scss +2 -0
  8. data/app/assets/stylesheets/modular/app-blue.css +2795 -2795
  9. data/app/assets/stylesheets/modular/app-custom.css +2795 -2795
  10. data/app/assets/stylesheets/modular/app-green.css +2795 -2795
  11. data/app/assets/stylesheets/modular/app-orange.css +2795 -2795
  12. data/app/assets/stylesheets/modular/app-purple.css +2795 -2795
  13. data/app/assets/stylesheets/modular/app-red.css +2795 -2795
  14. data/app/assets/stylesheets/modular/app-seagreen.css +2795 -2795
  15. data/app/assets/stylesheets/modular/app.css +2795 -2795
  16. data/app/assets/stylesheets/modular/custom.css +51 -19
  17. data/app/assets/stylesheets/modular/vendor.css +12999 -12999
  18. data/app/controllers/kadmin/application_controller.rb +64 -64
  19. data/app/controllers/kadmin/auth_controller.rb +98 -98
  20. data/app/controllers/kadmin/concerns/authorized_user.rb +67 -67
  21. data/app/controllers/kadmin/dash_controller.rb +19 -19
  22. data/app/decorators/kadmin/finder_decorator.rb +50 -50
  23. data/app/decorators/kadmin/pager_decorator.rb +33 -33
  24. data/app/helpers/kadmin/alert_helper.rb +59 -59
  25. data/app/helpers/kadmin/application_helper.rb +4 -4
  26. data/app/helpers/kadmin/bootstrap_helper.rb +23 -23
  27. data/app/helpers/kadmin/form_builder.rb +9 -9
  28. data/app/helpers/kadmin/forms/inverted_check_box.rb +10 -10
  29. data/app/helpers/kadmin/navigation_helper.rb +28 -28
  30. data/app/helpers/kadmin/pagination_helper.rb +95 -95
  31. data/app/views/kadmin/auth/login.html.erb +4 -4
  32. data/app/views/kadmin/components/_finder.html.erb +14 -18
  33. data/app/views/kadmin/components/finder/_empty.html.erb +3 -3
  34. data/app/views/kadmin/components/finder/_form.erb +10 -10
  35. data/app/views/kadmin/components/finder/_header.html.erb +14 -11
  36. data/app/views/kadmin/dash/index.html.erb +5 -5
  37. data/app/views/kadmin/error.html.erb +5 -5
  38. data/app/views/kadmin/helpers/_alerts.html.erb +4 -4
  39. data/app/views/kadmin/helpers/_form_errors.html.erb +10 -10
  40. data/app/views/layouts/modular/application.html.erb +134 -132
  41. data/config/initializers/action_view.rb +2 -2
  42. data/config/initializers/assets.rb +5 -5
  43. data/config/locales/de.yml +25 -25
  44. data/config/locales/en.yml +24 -24
  45. data/config/routes.rb +12 -12
  46. data/lib/kadmin.rb +22 -22
  47. data/lib/kadmin/auth.rb +31 -31
  48. data/lib/kadmin/auth/configuration.rb +66 -66
  49. data/lib/kadmin/auth/unauthorized_error.rb +14 -14
  50. data/lib/kadmin/auth/user.rb +15 -15
  51. data/lib/kadmin/auth/user_store.rb +21 -21
  52. data/lib/kadmin/configuration.rb +18 -18
  53. data/lib/kadmin/engine.rb +15 -15
  54. data/lib/kadmin/error.rb +7 -7
  55. data/lib/kadmin/errors/authorization.rb +15 -15
  56. data/lib/kadmin/finder.rb +66 -66
  57. data/lib/kadmin/form.rb +179 -179
  58. data/lib/kadmin/pager.rb +93 -93
  59. data/lib/kadmin/version.rb +3 -3
  60. data/test/dummy/README.rdoc +28 -28
  61. data/test/dummy/Rakefile +6 -6
  62. data/test/dummy/app/assets/javascripts/application.js +13 -13
  63. data/test/dummy/app/assets/stylesheets/application.css +15 -15
  64. data/test/dummy/app/controllers/admin/application_controller.rb +11 -11
  65. data/test/dummy/app/controllers/admin/people_controller.rb +89 -89
  66. data/test/dummy/app/controllers/admin_controller.rb +4 -4
  67. data/test/dummy/app/controllers/application_controller.rb +5 -5
  68. data/test/dummy/app/controllers/authorized_controller.rb +8 -8
  69. data/test/dummy/app/helpers/application_helper.rb +2 -2
  70. data/test/dummy/app/models/group.rb +8 -8
  71. data/test/dummy/app/models/group_person.rb +6 -6
  72. data/test/dummy/app/models/person.rb +20 -20
  73. data/test/dummy/app/views/admin/index.html.erb +1 -1
  74. data/test/dummy/app/views/admin/people/_form.html.erb +34 -34
  75. data/test/dummy/app/views/admin/people/_table.html.erb +33 -33
  76. data/test/dummy/app/views/admin/people/edit.html.erb +4 -4
  77. data/test/dummy/app/views/admin/people/index.html.erb +3 -3
  78. data/test/dummy/app/views/admin/people/new.html.erb +5 -5
  79. data/test/dummy/app/views/admin/people/show.html.erb +3 -3
  80. data/test/dummy/app/views/authorized/index.html.erb +1 -1
  81. data/test/dummy/app/views/layouts/application.html.erb +14 -14
  82. data/test/dummy/bin/bundle +3 -3
  83. data/test/dummy/bin/rails +4 -4
  84. data/test/dummy/bin/rake +4 -4
  85. data/test/dummy/bin/setup +29 -29
  86. data/test/dummy/config.ru +4 -4
  87. data/test/dummy/config/application.rb +39 -39
  88. data/test/dummy/config/boot.rb +5 -5
  89. data/test/dummy/config/database.yml +22 -22
  90. data/test/dummy/config/environment.rb +5 -5
  91. data/test/dummy/config/environments/development.rb +41 -41
  92. data/test/dummy/config/environments/production.rb +79 -79
  93. data/test/dummy/config/environments/test.rb +42 -42
  94. data/test/dummy/config/initializers/assets.rb +10 -10
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -7
  96. data/test/dummy/config/initializers/cookies_serializer.rb +3 -3
  97. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -4
  98. data/test/dummy/config/initializers/inflections.rb +16 -16
  99. data/test/dummy/config/initializers/kadmin.rb +24 -24
  100. data/test/dummy/config/initializers/mime_types.rb +4 -4
  101. data/test/dummy/config/initializers/session_store.rb +3 -3
  102. data/test/dummy/config/initializers/wrap_parameters.rb +14 -14
  103. data/test/dummy/config/locales/en.yml +17 -17
  104. data/test/dummy/config/routes.rb +13 -13
  105. data/test/dummy/config/secrets.yml +22 -22
  106. data/test/dummy/db/migrate/20161006114509_create_people.rb +11 -11
  107. data/test/dummy/db/migrate/20161006134459_create_groups.rb +11 -11
  108. data/test/dummy/db/migrate/20161006134746_create_group_people.rb +11 -11
  109. data/test/dummy/db/schema.rb +43 -43
  110. data/test/dummy/lib/forms/group_form.rb +16 -16
  111. data/test/dummy/lib/forms/person_form.rb +19 -19
  112. data/test/dummy/public/404.html +67 -67
  113. data/test/dummy/public/422.html +67 -67
  114. data/test/dummy/public/500.html +66 -66
  115. data/test/dummy/test/fixtures/children.yml +11 -11
  116. data/test/dummy/test/fixtures/group_people.yml +11 -11
  117. data/test/dummy/test/fixtures/groups.yml +11 -11
  118. data/test/dummy/test/fixtures/people.yml +11 -11
  119. data/test/dummy/test/models/group_person_test.rb +7 -7
  120. data/test/dummy/test/models/group_test.rb +7 -7
  121. data/test/kadmin/form_test.rb +6 -6
  122. data/test/test_helper.rb +32 -32
  123. metadata +54 -53
@@ -1,19 +1,19 @@
1
- module Kadmin
2
- class DashController < Kadmin::ApplicationController
3
- # @!group Endpoints
4
-
5
- # GET /
6
- def index
7
- end
8
-
9
- # @!endgroup
10
-
11
- # @!group Helpers
12
-
13
- def set_navbar_links
14
- @layout_navbar_links = Kadmin.config.navbar_links
15
- end
16
-
17
- # @!endgroup
18
- end
19
- end
1
+ module Kadmin
2
+ class DashController < Kadmin::ApplicationController
3
+ # @!group Endpoints
4
+
5
+ # GET /
6
+ def index
7
+ end
8
+
9
+ # @!endgroup
10
+
11
+ # @!group Helpers
12
+
13
+ def set_navbar_links
14
+ @layout_navbar_links = Kadmin.config.navbar_links
15
+ end
16
+
17
+ # @!endgroup
18
+ end
19
+ end
@@ -1,50 +1,50 @@
1
- module Kadmin
2
- class FinderDecorator
3
- # @return [Kadmin::Finder] underlying finder model
4
- attr_reader :finder
5
-
6
- delegate :filters, :scope, :results, to: :finder
7
-
8
- def initialize(finder)
9
- @finder = finder
10
- end
11
-
12
- # @return [Boolean] true if no results, false otherwise
13
- def empty?
14
- return finder.results.count.zero?
15
- end
16
-
17
- # @return [String] how many resources are being displayed (along with indices)
18
- def currently_showing
19
- resource = resource_name.downcase
20
- displayed = empty? ? 0 : pager.displayed_items
21
-
22
- currently_showing_phrase = "#{displayed} #{resource}"
23
- currently_showing_phrase = "#{currently_showing_phrase} (#{pager.page_start} - #{pager.page_end})" if finder.results.count > 1
24
-
25
- return currently_showing_phrase
26
- end
27
-
28
- # @return [String] human readable, singular/plural form of the finder's model
29
- def resource_name
30
- return @finder.scope.model_name.human(count: pager.displayed_items)
31
- end
32
-
33
- # @return [String] a description of the current applied filters
34
- def applied_filters
35
- applied_filters = ''
36
- filters = @finder.filters.reduce([]) do |acc, (name, filter)|
37
- next(acc) if filter.value.blank?
38
- acc << %(<strong>#{filter.value}</strong> on <em>#{name}</em>)
39
- end
40
- applied_filters = "(filtering: #{filters.join('; ')})" unless filters.empty?
41
-
42
- return applied_filters.html_safe
43
- end
44
-
45
- # @return [Kadmin::PagerDecorator] decorated pager of the underlying finder
46
- def pager
47
- return @pager ||= Kadmin::PagerDecorator.new(@finder.pager)
48
- end
49
- end
50
- end
1
+ module Kadmin
2
+ class FinderDecorator
3
+ # @return [Kadmin::Finder] underlying finder model
4
+ attr_reader :finder
5
+
6
+ delegate :filters, :scope, :results, to: :finder
7
+
8
+ def initialize(finder)
9
+ @finder = finder
10
+ end
11
+
12
+ # @return [Boolean] true if no results, false otherwise
13
+ def empty?
14
+ return finder.results.count.zero?
15
+ end
16
+
17
+ # @return [String] how many resources are being displayed (along with indices)
18
+ def currently_showing
19
+ resource = resource_name.downcase
20
+ displayed = empty? ? 0 : pager.displayed_items
21
+
22
+ currently_showing_phrase = "#{displayed} #{resource}"
23
+ currently_showing_phrase = "#{currently_showing_phrase} (#{pager.page_start} - #{pager.page_end})" if finder.results.count > 1
24
+
25
+ return currently_showing_phrase
26
+ end
27
+
28
+ # @return [String] human readable, singular/plural form of the finder's model
29
+ def resource_name
30
+ return @finder.scope.model_name.human(count: pager.displayed_items)
31
+ end
32
+
33
+ # @return [String] a description of the current applied filters
34
+ def applied_filters
35
+ applied_filters = ''
36
+ filters = @finder.filters.reduce([]) do |acc, (name, filter)|
37
+ next(acc) if filter.value.blank?
38
+ acc << %(<strong>#{filter.value}</strong> on <em>#{name}</em>)
39
+ end
40
+ applied_filters = "(filtering: #{filters.join('; ')})" unless filters.empty?
41
+
42
+ return applied_filters.html_safe
43
+ end
44
+
45
+ # @return [Kadmin::PagerDecorator] decorated pager of the underlying finder
46
+ def pager
47
+ return @pager ||= Kadmin::PagerDecorator.new(@finder.pager)
48
+ end
49
+ end
50
+ end
@@ -1,33 +1,33 @@
1
- module Kadmin
2
- class PagerDecorator
3
- # @return [Kadmin::Pager] underlying pager model
4
- attr_reader :pager
5
-
6
- delegate :total, :size, :offset, :pages, :current_page, :contains?, :next_page?,
7
- :previous_page?, :offset_at, :current_page?,
8
- to: :pager
9
-
10
- def initialize(pager)
11
- @pager = pager
12
- end
13
-
14
- # @return [Integer] the current number of items displayed for this page
15
- def displayed_items
16
- return page_end - offset
17
- end
18
-
19
- # @return [Integer] the index number of the last item for this page
20
- def page_end
21
- return [next_page_offset, total].min
22
- end
23
-
24
- # @return [Integer] the index number of the start item for this page
25
- def page_start
26
- return offset + 1
27
- end
28
-
29
- def next_page_offset
30
- return @pager.offset_at(current_page + 1)
31
- end
32
- end
33
- end
1
+ module Kadmin
2
+ class PagerDecorator
3
+ # @return [Kadmin::Pager] underlying pager model
4
+ attr_reader :pager
5
+
6
+ delegate :total, :size, :offset, :pages, :current_page, :contains?, :next_page?,
7
+ :previous_page?, :offset_at, :current_page?,
8
+ to: :pager
9
+
10
+ def initialize(pager)
11
+ @pager = pager
12
+ end
13
+
14
+ # @return [Integer] the current number of items displayed for this page
15
+ def displayed_items
16
+ return page_end - offset
17
+ end
18
+
19
+ # @return [Integer] the index number of the last item for this page
20
+ def page_end
21
+ return [next_page_offset, total].min
22
+ end
23
+
24
+ # @return [Integer] the index number of the start item for this page
25
+ def page_start
26
+ return offset + 1
27
+ end
28
+
29
+ def next_page_offset
30
+ return @pager.offset_at(current_page + 1)
31
+ end
32
+ end
33
+ end
@@ -1,59 +1,59 @@
1
- # frozen_string_literal: true
2
- module Kadmin
3
- # Provide helpers for displaying alerts, as well as matching those alerts to
4
- # different flash keys.
5
- module AlertHelper
6
- # Generates HTML for a bootstrap alert message, optionally closable.
7
- # @param [String] type the type of the alert: danger, success, info, warning, or any alert-<TYPE> defined in your CSS
8
- # @param [Hash] options options to customize the alert
9
- # @option options [String] content ('') text to show if you're not going to pass a block
10
- # @option options [Boolean] dismissible (true) if true, adds a close button to the alert. Requires JS enabled
11
- # @param [Proc] block optional block to pass if you want add more complex HTML inside
12
- def alert(type, options = {}, &block)
13
- dismissible = options.fetch(:dismissible, true)
14
- text_content = options.fetch(:content, '')
15
-
16
- css_classes = %W(alert alert-#{type})
17
- css_classes << 'alert-dismissible' if options.fetch(:dismissible, true)
18
- block_content = capture(&block) if block_given?
19
-
20
- return content_tag(:div, '', class: css_classes.join(' '), role: 'alert') do
21
- content = text_content.html_safe
22
-
23
- if dismissible
24
- button = button_tag(type: 'button', class: 'close', 'data-dismiss': 'alert') do
25
- content_tag(:span, '&times', {}, false)
26
- end
27
- content.concat(button)
28
- end
29
-
30
- content.concat(block_content.html_safe) unless block_content.blank?
31
- content
32
- end
33
- end
34
-
35
- Type = Struct.new(:flash_keys, :css_class, :glyphicon)
36
- TYPES = [
37
- Type.new(['danger', 'alert'], 'danger', 'exclamation-sign'),
38
- Type.new(['success'], 'success', 'ok-sign'),
39
- Type.new(['notice', 'info'], 'info', 'info-sign'),
40
- Type.new(['warn', 'warning'], 'warning', 'question-sign')
41
- ].freeze
42
- def render_flash_alerts
43
- alerts = AlertHelper::TYPES.map do |type|
44
- next unless type.flash_keys.any? { |key| flash[key].present? }
45
- render_flash_alert(type)
46
- end.compact
47
-
48
- return safe_join(alerts)
49
- end
50
-
51
- def render_flash_alert(type, &block)
52
- messages = type.flash_keys.map { |key| Array.wrap(flash[key]).compact }.flatten
53
- return '' if messages.blank?
54
-
55
- wrapped = messages.map { |message| content_tag(:p, glyphicon(type.glyphicon) + " #{message}") }.join('')
56
- return alert(type.css_class, content: wrapped)
57
- end
58
- end
59
- end
1
+ # frozen_string_literal: true
2
+ module Kadmin
3
+ # Provide helpers for displaying alerts, as well as matching those alerts to
4
+ # different flash keys.
5
+ module AlertHelper
6
+ # Generates HTML for a bootstrap alert message, optionally closable.
7
+ # @param [String] type the type of the alert: danger, success, info, warning, or any alert-<TYPE> defined in your CSS
8
+ # @param [Hash] options options to customize the alert
9
+ # @option options [String] content ('') text to show if you're not going to pass a block
10
+ # @option options [Boolean] dismissible (true) if true, adds a close button to the alert. Requires JS enabled
11
+ # @param [Proc] block optional block to pass if you want add more complex HTML inside
12
+ def alert(type, options = {}, &block)
13
+ dismissible = options.fetch(:dismissible, true)
14
+ text_content = options.fetch(:content, '')
15
+
16
+ css_classes = %W(alert alert-#{type})
17
+ css_classes << 'alert-dismissible' if options.fetch(:dismissible, true)
18
+ block_content = capture(&block) if block_given?
19
+
20
+ return content_tag(:div, '', class: css_classes.join(' '), role: 'alert') do
21
+ content = text_content.html_safe
22
+
23
+ if dismissible
24
+ button = button_tag(type: 'button', class: 'close', 'data-dismiss': 'alert') do
25
+ content_tag(:span, '&times', {}, false)
26
+ end
27
+ content.concat(button)
28
+ end
29
+
30
+ content.concat(block_content.html_safe) unless block_content.blank?
31
+ content
32
+ end
33
+ end
34
+
35
+ Type = Struct.new(:flash_keys, :css_class, :glyphicon)
36
+ TYPES = [
37
+ Type.new(['danger', 'alert'], 'danger', 'exclamation-sign'),
38
+ Type.new(['success'], 'success', 'ok-sign'),
39
+ Type.new(['notice', 'info'], 'info', 'info-sign'),
40
+ Type.new(['warn', 'warning'], 'warning', 'question-sign')
41
+ ].freeze
42
+ def render_flash_alerts
43
+ alerts = AlertHelper::TYPES.map do |type|
44
+ next unless type.flash_keys.any? { |key| flash[key].present? }
45
+ render_flash_alert(type)
46
+ end.compact
47
+
48
+ return safe_join(alerts)
49
+ end
50
+
51
+ def render_flash_alert(type, &block)
52
+ messages = type.flash_keys.map { |key| Array.wrap(flash[key]).compact }.flatten
53
+ return '' if messages.blank?
54
+
55
+ wrapped = messages.map { |message| content_tag(:p, glyphicon(type.glyphicon) + " #{message}") }.join('')
56
+ return alert(type.css_class, content: wrapped)
57
+ end
58
+ end
59
+ end
@@ -1,4 +1,4 @@
1
- module Kadmin
2
- module ApplicationHelper
3
- end
4
- end
1
+ module Kadmin
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -1,23 +1,23 @@
1
- module Kadmin
2
- # Collection of Bootstrap helpers
3
- module BootstrapHelper
4
- # @see http://getbootstrap.com/components/#glyphicons-glyphs
5
- # @param [String] icon the part after glyphicon-
6
- def glyphicon(icon)
7
- return content_tag(:span, ' ', class: "glyphicon glyphicon-#{icon}", 'aria-hidden': 'true')
8
- end
9
-
10
- # @param [Boolean] condition condition of evaluate
11
- # @param [String] icon_true the glyphicon to use if true
12
- # @param [String] icon_false the glyphicon to use if false
13
- def glyphicon_if_else(condition, icon_true, icon_false)
14
- return condition ? glyphicon(icon_true) : glyphicon(icon_false)
15
- end
16
-
17
- # @param [Hash, String] url_options anything accepted by link_to and image_tag
18
- # @param [Integer] max_height maximum height of the thumbnail
19
- def thumbnail_link(url_options, max_height)
20
- return link_to(image_tag(url_options), url_options, class: 'thumbnail', style: "max-height: #{max_height}px", target: 'new')
21
- end
22
- end
23
- end
1
+ module Kadmin
2
+ # Collection of Bootstrap helpers
3
+ module BootstrapHelper
4
+ # @see http://getbootstrap.com/components/#glyphicons-glyphs
5
+ # @param [String] icon the part after glyphicon-
6
+ def glyphicon(icon)
7
+ return content_tag(:span, ' ', class: "glyphicon glyphicon-#{icon}", 'aria-hidden': 'true')
8
+ end
9
+
10
+ # @param [Boolean] condition condition of evaluate
11
+ # @param [String] icon_true the glyphicon to use if true
12
+ # @param [String] icon_false the glyphicon to use if false
13
+ def glyphicon_if_else(condition, icon_true, icon_false)
14
+ return condition ? glyphicon(icon_true) : glyphicon(icon_false)
15
+ end
16
+
17
+ # @param [Hash, String] url_options anything accepted by link_to and image_tag
18
+ # @param [Integer] max_height maximum height of the thumbnail
19
+ def thumbnail_link(url_options, max_height)
20
+ return link_to(image_tag(url_options), url_options, class: 'thumbnail', style: "max-height: #{max_height}px", target: 'new')
21
+ end
22
+ end
23
+ end
@@ -1,9 +1,9 @@
1
- module Kadmin
2
- class FormBuilder < ActionView::Helpers::FormBuilder
3
- # Creates a checkbox where the value is 0 when checked, 1 when unchecked.
4
- # @see Kadmin::Forms::InvertedCheckBox
5
- def inverted_check_box(method, options = {})
6
- Kadmin::Forms::InvertedCheckBox.new(@object_name, method, @template, '0', '1', objectify_options(options)).render
7
- end
8
- end
9
- end
1
+ module Kadmin
2
+ class FormBuilder < ActionView::Helpers::FormBuilder
3
+ # Creates a checkbox where the value is 0 when checked, 1 when unchecked.
4
+ # @see Kadmin::Forms::InvertedCheckBox
5
+ def inverted_check_box(method, options = {})
6
+ Kadmin::Forms::InvertedCheckBox.new(@object_name, method, @template, '0', '1', objectify_options(options)).render
7
+ end
8
+ end
9
+ end
@@ -1,10 +1,10 @@
1
- module Kadmin
2
- module Forms
3
- class InvertedCheckBox < ActionView::Helpers::Tags::CheckBox
4
- # Overload how it gets the value and return the invert
5
- def value(*args)
6
- return !super
7
- end
8
- end
9
- end
10
- end
1
+ module Kadmin
2
+ module Forms
3
+ class InvertedCheckBox < ActionView::Helpers::Tags::CheckBox
4
+ # Overload how it gets the value and return the invert
5
+ def value(*args)
6
+ return !super
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,28 +1,28 @@
1
- module Kadmin
2
- module NavigationHelper
3
- # Generates HTML for a bootstrap navigation link
4
- # @param [String] title the navigation text
5
- # @param [Hash, String] path the path for the link
6
- # @param [Proc] block optional block to include content within the link
7
- def nav_link_to(title, path, &block)
8
- css_classes = []
9
- css_classes << 'active' if request.path.starts_with?(path)
10
- return content_tag(:li, link_to(title, path, &block), class: css_classes.join(' '))
11
- end
12
-
13
- # Generates a navigation drop down for bootstrap
14
- # @param [String] prompt dropdown prompt
15
- # @param [Array<Hash,String>] links list of links to add within the dropdown
16
- def dropdown(prompt, links = [])
17
- button_content = content_tag(:span, '', class: 'caret').prepend(prompt)
18
- button = button_tag(button_content, type: 'button', data: { toggle: 'dropdown' }, class: 'btn btn-default')
19
- list = content_tag(:ul, '', class: 'dropdown-menu') do
20
- links.reduce(ActiveSupport::SafeBuffer.new) do |buffer, link|
21
- buffer + content_tag(:li, link)
22
- end
23
- end
24
-
25
- return content_tag(:div, button + list, class: 'dropdown', style: 'display: inline-block;')
26
- end
27
- end
28
- end
1
+ module Kadmin
2
+ module NavigationHelper
3
+ # Generates HTML for a bootstrap navigation link
4
+ # @param [String] title the navigation text
5
+ # @param [Hash, String] path the path for the link
6
+ # @param [Proc] block optional block to include content within the link
7
+ def nav_link_to(title, path, &block)
8
+ css_classes = []
9
+ css_classes << 'active' if request.path.starts_with?(path)
10
+ return content_tag(:li, link_to(title, path, &block), class: css_classes.join(' '))
11
+ end
12
+
13
+ # Generates a navigation drop down for bootstrap
14
+ # @param [String] prompt dropdown prompt
15
+ # @param [Array<Hash,String>] links list of links to add within the dropdown
16
+ def dropdown(prompt, links = [])
17
+ button_content = content_tag(:span, '', class: 'caret').prepend(prompt)
18
+ button = button_tag(button_content, type: 'button', data: { toggle: 'dropdown' }, class: 'btn btn-sm')
19
+ list = content_tag(:ul, '', class: 'dropdown-menu') do
20
+ links.reduce(ActiveSupport::SafeBuffer.new) do |buffer, link|
21
+ buffer + content_tag(:li, link)
22
+ end
23
+ end
24
+
25
+ return content_tag(:div, button + list, class: 'dropdown', style: 'display: inline-block;')
26
+ end
27
+ end
28
+ end