menuizer 0.1.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +105 -85
- data/lib/menuizer/menu/item.rb +5 -7
- data/lib/menuizer/menu.rb +68 -36
- data/lib/menuizer.rb +15 -4
- data/version-dump.sh +1 -1
- data/version.txt +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDRiOGYzNzI1NjcyZTg1NmE2YjJiZjcwN2MwZWYwOGE5YWI0OWNhZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWRhY2RmODdlZDIwNmYyYzgyYTg2ODE3MTdiZWIyN2RhZTNlNGEyMA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YzIyOGZhNjdiZjI4YWIwZGQ1NzZhNzBmN2YxNDQ4MjFhYWIwNGYyNDJlZjE2
|
10
|
+
ZGU0MGYyYjA4ODY1MDE1MWEzMWM5Zjk1ZjQ5NGMzYmUyOGUzMjMzYTI1YTMx
|
11
|
+
MGE0OTAyZWEwM2I0NGRhZTMyNzg2NmUwYTY5OTc4ZTg3ZDkzMWY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OThlNTIyZDQ1YWJiNzFiYzNmMmMzZTZmODQ2MzYxOGVjMzk2MmUyOTEyYmU3
|
14
|
+
NTI2OTA2MWRhYjczMjBjMTIzMjMzYjBkZmM0NzU2ZWQ5ZTU4ZTIwMWIwZmJk
|
15
|
+
NDg1MWM0NmYyYzYyNmQzZjE5OTFkYjgxNjZiNGY3NTY1NDVkYzc=
|
data/README.md
CHANGED
@@ -25,38 +25,68 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
```ruby
|
27
27
|
# config/initializers/menuizer.rb
|
28
|
-
Menuizer.configure do |
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
28
|
+
Menuizer.configure do |config|
|
29
|
+
config.file_path = Rails.root.join("config/menuizer.yml")
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
```yaml
|
34
|
+
# config/menuizer.yml
|
35
|
+
- header: MAIN NAVIGATION
|
36
|
+
- item: Dashboard
|
37
|
+
icon: fa fa-dashboard
|
38
|
+
children:
|
39
|
+
- item: Dashboard v1
|
40
|
+
icon: fa fa-circle-o
|
41
|
+
- item: Dashboard v2
|
42
|
+
icon: fa fa-circle-o
|
43
|
+
|
44
|
+
- item: :Widget
|
45
|
+
icon: fa fa-th
|
46
|
+
|
47
|
+
- item: Settings
|
48
|
+
icon: fa fa-cog
|
49
|
+
children:
|
50
|
+
- item: :Admin
|
51
|
+
icon: fa fa-circle-o
|
52
|
+
- item: :User
|
53
|
+
icon: fa fa-circle-o
|
54
|
+
notice:
|
55
|
+
class: :User
|
56
|
+
method: :main_menu_notices
|
57
|
+
|
58
|
+
- item: nested
|
59
|
+
children:
|
60
|
+
- item: nested item
|
61
|
+
path: :path_to_somewhere
|
62
|
+
icon: fa fa-circle-o
|
63
|
+
```
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
# app/controllers/application_controller.rb
|
67
|
+
class ApplicationController < ActionController::Base
|
68
|
+
before_action :set_menuizer
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def set_menuizer
|
73
|
+
@menuizer = Menuizer.menu
|
74
|
+
end
|
75
|
+
helper_method def menuizer
|
76
|
+
@menuizer
|
46
77
|
end
|
47
|
-
end
|
48
78
|
end
|
49
79
|
```
|
50
80
|
|
51
81
|
```erb
|
52
82
|
<%# app/views/admins/index.html.erb %>
|
53
|
-
<%
|
54
|
-
<% content_for :title do %><%=
|
83
|
+
<% menuizer.activate :Admin # item's value %>
|
84
|
+
<% content_for :title do %><%= menuizer.active_item.try(:title) %><% end %>
|
55
85
|
|
56
86
|
...
|
57
87
|
|
58
88
|
<ol class="breadcrumb">
|
59
|
-
<%
|
89
|
+
<% menuizer.active_items.each do |item| %>
|
60
90
|
<li><%= link_to item.path || "#" do %><i class="<%= item.icon %>"></i> <%= item.title %><% end %></li>
|
61
91
|
<% end %>
|
62
92
|
</ol>
|
@@ -64,21 +94,18 @@ end
|
|
64
94
|
|
65
95
|
```erb
|
66
96
|
<%# app/views/layouts/application.html.erb %>
|
67
|
-
<% Menuizer.menu.activate @active_menu %>
|
68
|
-
<title><%= yield :title %></title>
|
69
|
-
|
70
97
|
...
|
71
|
-
|
72
98
|
<ul class="sidebar-menu">
|
73
|
-
<%
|
99
|
+
<% menuizer.items.each do |item| %>
|
74
100
|
<%= render "menu", item: item %>
|
75
101
|
<% end %>
|
76
102
|
</ul>
|
103
|
+
...
|
77
104
|
```
|
78
105
|
|
79
106
|
```erb
|
80
107
|
<%
|
81
|
-
item #
|
108
|
+
item # menuizer.items's item
|
82
109
|
%>
|
83
110
|
<% case item.type %>
|
84
111
|
<% when :header %>
|
@@ -112,32 +139,49 @@ end
|
|
112
139
|
<% end %>
|
113
140
|
```
|
114
141
|
|
115
|
-
##
|
142
|
+
## Converters
|
116
143
|
|
117
|
-
|
144
|
+
```ruby
|
145
|
+
# config/initializers/menuizer.rb
|
146
|
+
Menuizer.configure do |config|
|
147
|
+
config.converter = {
|
148
|
+
icon: ->(icon,opts){
|
149
|
+
case
|
150
|
+
when icon.blank? || icon.starts_with?("fa") then icon
|
151
|
+
when icon then "fa fa-#{icon}"
|
152
|
+
else
|
153
|
+
"fa fa-circle-o"
|
154
|
+
end
|
155
|
+
},
|
156
|
+
}
|
157
|
+
end
|
158
|
+
```
|
118
159
|
|
119
160
|
```ruby
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
# other keys pass-through to item.*
|
125
|
-
icon: "fa fa-icon",
|
126
|
-
notices: [
|
127
|
-
->{ [:info, count] },
|
128
|
-
],
|
129
|
-
)
|
161
|
+
menuizer.items.each do |item|
|
162
|
+
item.icon #=> call converter
|
163
|
+
end
|
130
164
|
```
|
131
165
|
|
132
|
-
|
166
|
+
icon, opts is yaml's original value
|
167
|
+
opts: all key-value hash
|
168
|
+
|
133
169
|
|
134
|
-
|
170
|
+
### convert `model`
|
171
|
+
|
172
|
+
* set `:model` key if title is `Symbol` and respond to `model_name` ( ActiveRecord )
|
173
|
+
|
174
|
+
|
175
|
+
### convert `title`
|
176
|
+
|
177
|
+
* convert `model.model_name.human` if model respond to `model_name.huuman`
|
135
178
|
* or, leave `title`
|
136
179
|
|
137
180
|
|
138
|
-
|
181
|
+
### convert `path`
|
139
182
|
|
140
|
-
*
|
183
|
+
* leave `path` if not `nil`
|
184
|
+
* convert `:"#{namespace}#{model.model_name.plural}"` if title respond to `model_name.plural`
|
141
185
|
* or, leave `nil`
|
142
186
|
|
143
187
|
**what namespace is?**
|
@@ -146,61 +190,37 @@ menu.item(
|
|
146
190
|
|
147
191
|
## Multiple namespaces
|
148
192
|
|
149
|
-
|
193
|
+
If your rails application has multiple namespaces, and required multiple menues, pass `:namespace` to Menuizer methods.
|
150
194
|
|
151
195
|
```ruby
|
152
196
|
# config/initializers/menuizer.rb
|
153
|
-
Menuizer.configure(:namespace) do |
|
154
|
-
|
197
|
+
Menuizer.configure(:namespace) do |config|
|
198
|
+
config.file_path = Rails.root.join("config/menuizer/namespace.yml")
|
155
199
|
end
|
156
200
|
```
|
157
201
|
|
158
|
-
```
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
...
|
164
|
-
|
165
|
-
<ol class="breadcrumb">
|
166
|
-
<% Menuizer.menu(:namespace).active_items.each do |item| %>
|
167
|
-
<li><%= link_to item.path || "#" do %><i class="<%= item.icon %>"></i> <%= item.title %><% end %></li>
|
168
|
-
<% end %>
|
169
|
-
</ol>
|
202
|
+
```yaml
|
203
|
+
# config/menuizer/namespace.yml
|
204
|
+
- header: NAMESPACE MENU
|
205
|
+
- item: :Admin
|
170
206
|
```
|
171
207
|
|
172
|
-
```
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
...
|
178
|
-
|
179
|
-
<ul class="sidebar-menu">
|
180
|
-
<% Menuizer.menu(:namespace).items.each do |item| %>
|
181
|
-
<%= render "menu", item: item %>
|
182
|
-
<% end %>
|
183
|
-
</ul>
|
184
|
-
```
|
208
|
+
```ruby
|
209
|
+
# app/controllers/application_controller.rb
|
210
|
+
class ApplicationController < ActionController::Base
|
211
|
+
before_action :set_menuizer
|
185
212
|
|
186
|
-
|
213
|
+
private
|
187
214
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
when icon.blank? || icon.starts_with?("fa") then icon
|
194
|
-
when icon then "fa fa-#{icon.to_s.gsub("_","-")}"
|
195
|
-
else
|
196
|
-
"fa fa-circle-o"
|
215
|
+
def set_menuizer
|
216
|
+
@menuizer = Menuizer.menu(:namespace)
|
217
|
+
end
|
218
|
+
helper_method def menuizer
|
219
|
+
@menuizer
|
197
220
|
end
|
198
|
-
end
|
199
221
|
end
|
200
222
|
```
|
201
223
|
|
202
|
-
second argument `opts` : original key-value hash
|
203
|
-
|
204
224
|
## Development
|
205
225
|
|
206
226
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/menuizer/menu/item.rb
CHANGED
@@ -5,20 +5,18 @@ class Menuizer::Menu::Item < OpenStruct
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def title
|
8
|
-
|
9
|
-
|
10
|
-
title.model_name.human
|
8
|
+
if model && model.model_name.respond_to?(:human)
|
9
|
+
model.model_name.human
|
11
10
|
else
|
12
|
-
title
|
11
|
+
@opts[:title]
|
13
12
|
end
|
14
13
|
end
|
15
14
|
def path
|
16
15
|
if path = @opts[:path]
|
17
16
|
path
|
18
17
|
else
|
19
|
-
|
20
|
-
|
21
|
-
:"#{namespace}#{title.model_name.plural}"
|
18
|
+
if model && model.model_name.respond_to?(:plural)
|
19
|
+
:"#{namespace}#{model.model_name.plural}"
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
data/lib/menuizer/menu.rb
CHANGED
@@ -2,7 +2,12 @@ class Menuizer::Menu
|
|
2
2
|
def initialize(namespace)
|
3
3
|
if namespace
|
4
4
|
@namespace = "#{namespace}_"
|
5
|
-
|
5
|
+
item_class = :"Item_#{namespace}"
|
6
|
+
if self.class.const_defined?(item_class)
|
7
|
+
@item_class = self.class.const_get(item_class)
|
8
|
+
else
|
9
|
+
@item_class = self.class.const_set(item_class, Class.new(Item))
|
10
|
+
end
|
6
11
|
else
|
7
12
|
@namespace = nil
|
8
13
|
@item_class = Item
|
@@ -41,41 +46,17 @@ class Menuizer::Menu
|
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
type: :item,
|
56
|
-
parent: @parent,
|
57
|
-
namespace: @namespace,
|
58
|
-
title: title,
|
59
|
-
path: path,
|
60
|
-
**opts,
|
61
|
-
)
|
62
|
-
map[title] = item
|
63
|
-
current << item
|
64
|
-
else
|
65
|
-
owner = @parent
|
66
|
-
parents = @current
|
67
|
-
item = @parent = @item_class.new(
|
68
|
-
type: :tree,
|
69
|
-
children: [],
|
70
|
-
parent: owner,
|
71
|
-
namespace: @namespace,
|
72
|
-
title: title,
|
73
|
-
**opts,
|
74
|
-
)
|
75
|
-
@current = item.children
|
76
|
-
yield
|
77
|
-
children, @current, @parent = @current, parents, owner
|
78
|
-
current << item
|
49
|
+
def load(data)
|
50
|
+
return unless data.respond_to?(:each)
|
51
|
+
data.each do |item|
|
52
|
+
if item.respond_to?(:map) && item.respond_to?(:delete)
|
53
|
+
item = item.map{|k,v| [k.to_sym,v]}.to_h
|
54
|
+
if title = item.delete(:header)
|
55
|
+
add_header title
|
56
|
+
else
|
57
|
+
add_item item.delete(:item), item
|
58
|
+
end
|
59
|
+
end
|
79
60
|
end
|
80
61
|
end
|
81
62
|
|
@@ -85,6 +66,57 @@ class Menuizer::Menu
|
|
85
66
|
|
86
67
|
private
|
87
68
|
|
69
|
+
def add_header(title)
|
70
|
+
current << @item_class.new(
|
71
|
+
type: :header,
|
72
|
+
namespace: @namespace,
|
73
|
+
title: title,
|
74
|
+
)
|
75
|
+
end
|
76
|
+
def add_item(title, opts)
|
77
|
+
model = to_model title
|
78
|
+
|
79
|
+
unless children = opts.delete(:children)
|
80
|
+
item = @item_class.new(
|
81
|
+
type: :item,
|
82
|
+
parent: @parent,
|
83
|
+
namespace: @namespace,
|
84
|
+
title: title,
|
85
|
+
model: model,
|
86
|
+
**opts,
|
87
|
+
)
|
88
|
+
map[title] = item
|
89
|
+
current << item
|
90
|
+
else
|
91
|
+
owner = @parent
|
92
|
+
parents = @current
|
93
|
+
item = @parent = @item_class.new(
|
94
|
+
type: :tree,
|
95
|
+
children: [],
|
96
|
+
parent: owner,
|
97
|
+
namespace: @namespace,
|
98
|
+
title: title,
|
99
|
+
model: model,
|
100
|
+
**opts,
|
101
|
+
)
|
102
|
+
@current = item.children
|
103
|
+
self.load children
|
104
|
+
@current, @parent = parents, owner
|
105
|
+
current << item
|
106
|
+
end
|
107
|
+
end
|
108
|
+
def to_model(title)
|
109
|
+
return unless title.is_a?(Symbol)
|
110
|
+
parent = Object
|
111
|
+
title.to_s.split("::").each do |tip|
|
112
|
+
return unless parent.const_defined?(tip)
|
113
|
+
parent = parent.const_get(tip)
|
114
|
+
end
|
115
|
+
if parent.respond_to?(:model_name)
|
116
|
+
parent
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
88
120
|
def current
|
89
121
|
@current ||= items
|
90
122
|
end
|
data/lib/menuizer.rb
CHANGED
@@ -5,16 +5,27 @@ require "menuizer/menu/item"
|
|
5
5
|
module Menuizer
|
6
6
|
class << self
|
7
7
|
def configure(namespace=nil)
|
8
|
-
yield (
|
8
|
+
yield (config[namespace] ||= OpenStruct.new)
|
9
9
|
end
|
10
10
|
def menu(namespace=nil)
|
11
|
-
|
11
|
+
Menu.new(namespace).tap{|menu|
|
12
|
+
c = config[namespace]
|
13
|
+
if c.respond_to?(:converter)
|
14
|
+
c.converter.each do |key,block|
|
15
|
+
menu.set_converter key, &block
|
16
|
+
end
|
17
|
+
end
|
18
|
+
if c.respond_to?(:file_path) && path = c.file_path
|
19
|
+
require "yaml"
|
20
|
+
menu.load YAML.load_file(path)
|
21
|
+
end
|
22
|
+
}
|
12
23
|
end
|
13
24
|
|
14
25
|
private
|
15
26
|
|
16
|
-
def
|
17
|
-
@
|
27
|
+
def config
|
28
|
+
@config ||= {}
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
data/version-dump.sh
CHANGED
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|