partial_menu 0.3.0 → 1.0.0
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/lib/generators/views/templates/_item.html.erb +6 -6
- data/lib/generators/views/templates/_menu.html.erb +9 -7
- data/lib/generators/views/templates/_separator.html.erb +1 -0
- data/lib/generators/views/templates/_submenu.html.erb +12 -4
- data/lib/generators/views/templates/_submenu_item.html.erb +5 -5
- data/lib/generators/yaml/templates/menu.yml +1 -0
- data/lib/partial_menu/menu.rb +16 -6
- data/lib/partial_menu/menu_item.rb +87 -23
- data/lib/partial_menu/railtie.rb +2 -2
- data/lib/partial_menu/version.rb +1 -1
- data/lib/partial_menu/view_helpers.rb +54 -35
- data/lib/partial_menu.rb +3 -6
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51707929a107b5a59d3fc4ccce357f1a8833ec79
|
4
|
+
data.tar.gz: cc8327e327f9ab7fcc716003d320dd2f5133408b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e811b68b27e208262c1d56a3928b33cae54492b2fc0d6b66dbb878e8d82e5c075b467141b99cd12375da9dbd3eacbf470af04e5d0c4adc30ccef8f1d20c97824
|
7
|
+
data.tar.gz: 32c9fd3d571ac174e7f63c5e8dd3b1e3824dd0e08fcb97085eaed7c961b7dde4d1dbad6c75a40653d89fbf26cc025a826a16be11c813e200078ad2835f359c7e
|
@@ -1,12 +1,12 @@
|
|
1
|
-
<li <%= '
|
2
|
-
<% if item.try(:icon).present?
|
3
|
-
<i class="fa fa
|
4
|
-
<% end
|
5
|
-
<% if item.uri.present?
|
1
|
+
<li class="<%= 'active' if is_active_link?(url_for(item.uri), :inclusive) %>">
|
2
|
+
<% if item.try(:icon).present? -%>
|
3
|
+
<i class="<%= item.try(:icontype) || 'fa' %> <%= item.try(:icontype) || 'fa'%>-fw <%= item.icon %>"></i>
|
4
|
+
<% end -%>
|
5
|
+
<% if item.uri.present? -%>
|
6
6
|
<%= link_to item.uri do -%>
|
7
7
|
<%= item.title %>
|
8
8
|
<% end -%>
|
9
|
-
<% else
|
9
|
+
<% else -%>
|
10
10
|
<%= item.title %>
|
11
11
|
<% end -%>
|
12
12
|
</li>
|
@@ -1,9 +1,11 @@
|
|
1
1
|
<ul>
|
2
|
-
<% menu.items.each do |item|
|
3
|
-
<% if item.
|
4
|
-
<%= render "#{menu.
|
5
|
-
<%
|
6
|
-
<%= render "#{menu.
|
7
|
-
<%
|
8
|
-
|
2
|
+
<% menu.items.each do |item| -%>
|
3
|
+
<% if item.submenu? -%>
|
4
|
+
<%= render "#{menu.layout}_menu/submenu", menu: item.submenu -%>
|
5
|
+
<% elsif item.separator?%>
|
6
|
+
<%= render "#{menu.layout}_menu/separator", item: item -%>
|
7
|
+
<% else -%>
|
8
|
+
<%= render "#{menu.layout}_menu/item", item: item -%>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
9
11
|
</ul>
|
@@ -0,0 +1 @@
|
|
1
|
+
<li><hr/></li>
|
@@ -1,12 +1,20 @@
|
|
1
1
|
<li class="nav-item" title="<%= menu.parent.title %>" data-original-title="<%= menu.parent.title %>">
|
2
2
|
<a class="nav-link nav-link-collapse collapsed" data-toggle="collapse"
|
3
|
-
href="#collapse<%= menu.id %>" data-parent="#<%= menu.
|
3
|
+
href="#collapse<%= menu.id %>" data-parent="#<%= menu.layout %>">
|
4
4
|
<% if menu.parent.try(:icon).present? %>
|
5
|
-
<i class="fa fa
|
5
|
+
<i class="<%= menu.parent.try(:icontype) || 'fa'%> <%= menu.parent.try(:icontype) || 'fa'%>-fw <%= menu.parent.icon %>"></i>
|
6
6
|
<% end -%>
|
7
7
|
<span class="nav-link-text"><%= menu.parent.title %></span>
|
8
8
|
</a>
|
9
|
+
<ul id="#<%= menu.layout %>">
|
9
10
|
<% menu.items.each do |item| %>
|
10
|
-
|
11
|
+
<% if item.submenu? -%>
|
12
|
+
<%= render "#{menu.layout}_menu/submenu", menu: item.submenu -%>
|
13
|
+
<% elsif item.separator?%>
|
14
|
+
<%= render "#{menu.layout}_menu/separator", item: item -%>
|
15
|
+
<% else -%>
|
16
|
+
<%= render "#{menu.layout}_menu/submenu_item", item: item -%>
|
17
|
+
<% end -%>
|
11
18
|
<% end %>
|
12
|
-
</
|
19
|
+
</ul>
|
20
|
+
</li>
|
@@ -1,12 +1,12 @@
|
|
1
|
-
<li <%= '
|
2
|
-
<% if item.try(:icon).present?
|
1
|
+
<li class="<%= 'active' if is_active_link?(item.uri, :inclusive) %>">
|
2
|
+
<% if item.try(:icon).present? -%>
|
3
3
|
<i class="fa fa-fw <%= item.icon %>"></i>
|
4
|
-
<% end
|
5
|
-
<% if item.uri.present?
|
4
|
+
<% end -%>
|
5
|
+
<% if item.uri.present? -%>
|
6
6
|
<%= link_to item.uri do -%>
|
7
7
|
<%= item.title %>
|
8
8
|
<% end -%>
|
9
|
-
<% else
|
9
|
+
<% else -%>
|
10
10
|
<%= item.title %>
|
11
11
|
<% end -%>
|
12
12
|
</li>
|
data/lib/partial_menu/menu.rb
CHANGED
@@ -3,20 +3,30 @@ require 'partial_menu/menu_item'
|
|
3
3
|
module PartialMenu
|
4
4
|
# Represents a menu with menu items
|
5
5
|
class Menu
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :layout
|
7
7
|
attr_reader :items
|
8
8
|
attr_reader :parent
|
9
9
|
attr_reader :id
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# rubocop:disable Metrics/MethodLength
|
12
|
+
def initialize(props, layout = 'main', parent = nil)
|
13
|
+
unless props.is_a? Array
|
14
|
+
raise ::ArgumentError, "Expected an Array, got #{props.class}"
|
15
|
+
end
|
16
|
+
unless layout.is_a? String
|
17
|
+
raise ::ArgumentError, "Expected a String, got #{layout.class}"
|
18
|
+
end
|
19
|
+
unless parent.nil? || (parent.is_a? PartialMenu::MenuItem)
|
20
|
+
raise ::ArgumentError, "Expected MenuItem or nil, got #{parent.class}"
|
21
|
+
end
|
22
|
+
@props = props
|
23
|
+
@layout = layout
|
15
24
|
@items = []
|
16
25
|
@parent = parent
|
17
26
|
set_id
|
18
27
|
add_items(props)
|
19
28
|
end
|
29
|
+
# rubocop:enable Metrics/MethodLength
|
20
30
|
|
21
31
|
private
|
22
32
|
|
@@ -30,7 +40,7 @@ module PartialMenu
|
|
30
40
|
@id = if @parent.try(:class) == 'PartialMenu::MenuItem'
|
31
41
|
@parent.id + '_submenu'
|
32
42
|
else
|
33
|
-
@
|
43
|
+
@layout + '_menu'
|
34
44
|
end
|
35
45
|
end
|
36
46
|
end
|
@@ -1,80 +1,144 @@
|
|
1
|
+
require 'active_link_to'
|
2
|
+
|
1
3
|
module PartialMenu
|
2
4
|
# Represents menu item in a menu
|
3
5
|
class MenuItem
|
6
|
+
include ActiveLinkTo
|
7
|
+
|
4
8
|
attr_reader :type
|
5
9
|
attr_reader :parent
|
6
10
|
attr_reader :uri
|
7
11
|
attr_reader :title
|
8
12
|
attr_reader :submenu
|
9
13
|
attr_reader :id
|
14
|
+
attr_reader :options
|
10
15
|
|
16
|
+
##
|
17
|
+
# Contructor which check parameter types and start setup
|
18
|
+
#
|
19
|
+
# @param [Hash] props The menu list propertiess from the yaml file.
|
20
|
+
# @param [PartialMenu::Menu] parent The parent Menu of the item
|
21
|
+
#
|
22
|
+
# Throws ArgumentError if parameters are not expected type
|
23
|
+
#
|
11
24
|
def initialize(props, parent)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
25
|
+
unless props.is_a? Hash
|
26
|
+
raise ::ArgumentError, "Expected Hash, got #{prop.class}"
|
27
|
+
end
|
28
|
+
unless parent.is_a? PartialMenu::Menu
|
29
|
+
raise ::ArgumentError, "Expected PartialMenu::Menu, got #{parent.class}"
|
30
|
+
end
|
16
31
|
@parent = parent
|
17
32
|
@props = props
|
18
33
|
setup
|
19
34
|
end
|
20
35
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
set_submenu
|
27
|
-
set_other_attr
|
28
|
-
end
|
29
|
-
|
36
|
+
##
|
37
|
+
# True if menu item has submenu
|
38
|
+
#
|
39
|
+
# @return [boolean]
|
40
|
+
#
|
30
41
|
def submenu?
|
31
42
|
@submenu != nil
|
32
43
|
end
|
33
44
|
|
45
|
+
##
|
46
|
+
# True if menu item is a separator
|
47
|
+
#
|
48
|
+
# @ return [boolean]
|
49
|
+
#
|
34
50
|
def separator?
|
35
51
|
@type == :separator
|
36
52
|
end
|
37
53
|
|
38
|
-
def active?
|
39
|
-
false
|
40
|
-
end
|
41
|
-
|
42
54
|
private
|
43
55
|
|
56
|
+
##
|
57
|
+
# Manage parsing order of yaml properties
|
58
|
+
#
|
59
|
+
def setup
|
60
|
+
set_first_entry
|
61
|
+
set_type
|
62
|
+
set_id
|
63
|
+
set_title
|
64
|
+
set_uri
|
65
|
+
set_submenu
|
66
|
+
set_other_attr
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Check if there is a +:menu+ property for the menu item and intantiate a
|
71
|
+
# new <tt>PartialMenu::Menu</tt> to parse it's content.
|
72
|
+
#
|
44
73
|
def set_submenu
|
45
74
|
@submenu = nil
|
46
|
-
return
|
75
|
+
return unless @props.key?(:menu)
|
47
76
|
@submenu = PartialMenu::Menu.new(
|
48
77
|
@props[:menu],
|
49
|
-
@parent.
|
78
|
+
@parent.layout,
|
50
79
|
self
|
51
80
|
)
|
52
81
|
end
|
53
82
|
|
83
|
+
##
|
84
|
+
# Sets type property
|
85
|
+
# * +:separator+ - if menu item is has +separator+ entry only
|
86
|
+
# * +:link+ - any other occasion
|
87
|
+
#
|
54
88
|
def set_type
|
55
|
-
@_first_entry = @props.shift
|
56
89
|
@type = :item
|
57
90
|
@type = @_first_entry[1].to_sym if @_first_entry[1] == 'separator'
|
58
91
|
end
|
59
92
|
|
93
|
+
##
|
94
|
+
# Gets and first entry in the yaml file for this particular menu item as it
|
95
|
+
# could hold esential information about the entry
|
96
|
+
#
|
97
|
+
def set_first_entry
|
98
|
+
@_first_entry = @props.shift
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# Set the title of the menu item based ont the +title+ property from the
|
103
|
+
# yaml file or if that not exists, use the yaml entry's name titlelized. If
|
104
|
+
# menu item is a separator, :title will be an empty string.
|
105
|
+
#
|
60
106
|
def set_title
|
61
107
|
@title = ''
|
62
|
-
return
|
108
|
+
return if @type == :separator
|
63
109
|
@title = @props[:title] if @props.key?(:title)
|
64
|
-
@title = @
|
110
|
+
@title = @id.titleize if @title.blank?
|
65
111
|
end
|
66
112
|
|
113
|
+
##
|
114
|
+
# Sets the menu item id to the entry's name in the yaml
|
115
|
+
#
|
67
116
|
def set_id
|
68
117
|
@id = @_first_entry[0].to_s
|
69
118
|
end
|
70
119
|
|
120
|
+
##
|
121
|
+
# Set the URL of the menu item if it is not a separator.
|
122
|
+
#
|
71
123
|
def set_uri
|
72
124
|
@uri = nil
|
73
125
|
@uri = @props[:uri] if @type != :separator
|
74
126
|
end
|
75
127
|
|
128
|
+
##
|
129
|
+
# Parse additional attributes from yaml
|
130
|
+
#
|
131
|
+
# If a menu entry defines any addtional attributes above the list below,
|
132
|
+
# it will be parsed to an instance variable of the MenuItem.
|
133
|
+
#
|
134
|
+
# Built-in properties:
|
135
|
+
# * +:id+
|
136
|
+
# * +:uri+
|
137
|
+
# * +:title+
|
138
|
+
# * +:menu+
|
139
|
+
#
|
76
140
|
def set_other_attr
|
77
|
-
@props.except(
|
141
|
+
@props.except(:id, :uri, :title, :menu).each do |name, value|
|
78
142
|
instance_variable_set('@' + name.to_s, value)
|
79
143
|
define_singleton_method(name) { instance_variable_get("@#{name}") }
|
80
144
|
end
|
data/lib/partial_menu/railtie.rb
CHANGED
@@ -4,8 +4,8 @@ module PartialMenu
|
|
4
4
|
# Binding to Rails
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
6
|
initializer 'partial_menu.view_helpers' do
|
7
|
-
ActiveSupport.on_load
|
8
|
-
PartialMenu::ViewHelpers
|
7
|
+
ActiveSupport.on_load :action_view do
|
8
|
+
include PartialMenu::ViewHelpers
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
data/lib/partial_menu/version.rb
CHANGED
@@ -6,51 +6,70 @@ module PartialMenu
|
|
6
6
|
# This module serves for availability in ActionView templates. It also adds a
|
7
7
|
# new view helper: +partial_menu+.
|
8
8
|
#
|
9
|
-
# == Using the helper without arguments
|
10
|
-
# If the helper is called without passing in the type, it will
|
11
|
-
# render the default menu using the default view partials.
|
12
|
-
#
|
13
|
-
# Example:
|
14
|
-
#
|
15
|
-
# <%= partial_menu %>
|
16
|
-
#
|
17
|
-
# ... will result in <tt>menu.yaml</tt> getting displayed using partials
|
18
|
-
# from +app/views/partial_menu+:
|
19
|
-
#
|
20
|
-
# <ul>
|
21
|
-
# <li><a href="/">First item</a></li>
|
22
|
-
# ...
|
23
|
-
# </ul>
|
24
|
-
#
|
25
|
-
# Any options defined in the call will be send to +render+ as local variables
|
26
|
-
#
|
27
|
-
# Example:
|
28
|
-
#
|
29
|
-
# <%= partial_menu 'menu', {menu_id:'sidemenu'} %>
|
30
|
-
#
|
31
|
-
# You can leave out menu type parameter:
|
32
|
-
#
|
33
|
-
# Example:
|
34
|
-
#
|
35
|
-
# <%= partial_menu {menu_id:'sidemenu'} %>
|
36
|
-
#
|
37
9
|
module ViewHelpers
|
38
|
-
|
10
|
+
# rubocop:disable Metrics/MethodLength
|
11
|
+
# == Using the helper
|
12
|
+
# If the helper is called without passing in the type, it will
|
13
|
+
# render the default menu using the default view partials.
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# <%= partial_menu %>
|
18
|
+
#
|
19
|
+
# ... will result in <tt>menu.yaml</tt> getting displayed using partials
|
20
|
+
# from +app/views/partial_menu+:
|
21
|
+
#
|
22
|
+
# <ul>
|
23
|
+
# <li><a href="/">First item</a></li>
|
24
|
+
# ...
|
25
|
+
# </ul>
|
26
|
+
#
|
27
|
+
# Any options defined in the call will be send to +render+ as
|
28
|
+
# local variables
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
#
|
32
|
+
# <%= partial_menu 'menu', {menu_id:'sidemenu'} %>
|
33
|
+
#
|
34
|
+
# You can leave out menu type parameter:
|
35
|
+
#
|
36
|
+
# Example:
|
37
|
+
#
|
38
|
+
# <%= partial_menu {menu_id:'sidemenu'} %>
|
39
|
+
#
|
40
|
+
def partial_menu(type = 'main', options = {})
|
41
|
+
unless (type.is_a? String) || (type.is_a? Hash)
|
42
|
+
raise ::ArgumentError, "Expected a String or Hash, got #{type.class}"
|
43
|
+
end
|
44
|
+
unless options.is_a? Hash
|
45
|
+
raise ::ArgumentError, "Expected a Hash, got #{options.class}"
|
46
|
+
end
|
39
47
|
if type.is_a? Hash
|
40
48
|
options = type
|
41
49
|
type = 'main'
|
42
50
|
end
|
43
|
-
options[:menu] = PartialMenu::Menu.new(load_menu_from_yaml(type))
|
44
|
-
options.
|
51
|
+
options[:menu] = PartialMenu::Menu.new(load_menu_from_yaml(type), type)
|
52
|
+
options.deep_symbolize_keys!
|
45
53
|
render partial: "#{type}_menu/menu", locals: options
|
46
54
|
end
|
47
|
-
|
48
|
-
def current_menu?(path)
|
49
|
-
request.path == URI(path).path unless path.blank?
|
50
|
-
end
|
55
|
+
# rubocop:enable Metrics/MethodLength
|
51
56
|
|
52
57
|
private
|
53
58
|
|
59
|
+
##
|
60
|
+
# Load yaml file from config
|
61
|
+
#
|
62
|
+
# The +type+ parameter is used to create te actual file name. It is
|
63
|
+
# expected to:
|
64
|
+
# * be in the Rails apps config/ folder
|
65
|
+
# * have a name like +type>_menu.yml+
|
66
|
+
#
|
67
|
+
# All keys are symbolized after loading hte file.
|
68
|
+
#
|
69
|
+
# @param [String] type The menu type, which identifies the file too
|
70
|
+
#
|
71
|
+
# @return [Hash] The parsed YAML as hash of objects
|
72
|
+
#
|
54
73
|
def load_menu_from_yaml(type)
|
55
74
|
Psych.load_file(
|
56
75
|
Rails.root.join("config/#{type}_menu.yml")
|
data/lib/partial_menu.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
+
require 'partial_menu/version'
|
2
|
+
|
1
3
|
# PartailMenu implementation class
|
2
4
|
module PartialMenu
|
3
|
-
|
4
|
-
|
5
|
-
if defined?(Rails::Railtie)
|
6
|
-
require 'partial_menu/railtie'
|
7
|
-
elsif defined?(Rails::Initializer)
|
8
|
-
raise 'partial_menu is not compatible with Rails 2.3 or older'
|
5
|
+
require 'partial_menu/railtie' if defined?(Rails)
|
9
6
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: partial_menu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Nagy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: active_link_to
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rails
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,20 @@ dependencies:
|
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0.58'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: sqlite3
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +152,7 @@ files:
|
|
124
152
|
- lib/generators/views/USAGE
|
125
153
|
- lib/generators/views/templates/_item.html.erb
|
126
154
|
- lib/generators/views/templates/_menu.html.erb
|
155
|
+
- lib/generators/views/templates/_separator.html.erb
|
127
156
|
- lib/generators/views/templates/_submenu.html.erb
|
128
157
|
- lib/generators/views/templates/_submenu_item.html.erb
|
129
158
|
- lib/generators/views/views_generator.rb
|