menuable 0.1.0 → 0.1.1
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/menuable/version.rb +1 -1
- data/lib/menuable.rb +78 -39
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0c4ea54013a825585c4b87cdf3e25e54d82c04b1b6aab36b436ac2cc588a3d1
|
4
|
+
data.tar.gz: 2b635cf422c7eed2068b5e1fad5fcb0518ca1f8402f7237a04971dab84f5ca0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 650d34d9d2699828ea17994775f6f9230e1229bb853c2bbd87d354871a4e7d7ce83e26f4bc897e91e5a61e3663264511240a4a0fbeee400dd6351b20e7e30759
|
7
|
+
data.tar.gz: c5625b3c58e74e01a09f803088cd9b443113284d769fe6987bea16e3f461d9a5b73b4dad95c400c75132eabcdac028852b614441ae04e552d93bc186e672bf7a
|
data/lib/menuable/version.rb
CHANGED
data/lib/menuable.rb
CHANGED
@@ -7,44 +7,48 @@ module Menuable
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
9
|
class_methods do
|
10
|
-
def
|
11
|
-
|
10
|
+
def resource(resource_name, **options, &block)
|
11
|
+
resources(resource_name, single: true, **options, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def resources(resource_name, single: false, **options, &block)
|
15
|
+
namespace = name.to_s.deconstantize.constantize
|
12
16
|
|
13
17
|
menu = Class.new(MenuDefinition)
|
14
|
-
menu.
|
15
|
-
|
16
|
-
token.shift
|
17
|
-
token.pop
|
18
|
-
token.first&.underscore
|
19
|
-
end
|
18
|
+
menu.options = options
|
19
|
+
menu.single = single
|
20
20
|
menu.resource_name = resource_name
|
21
21
|
menu.model_name = ActiveModel::Name.new(nil, nil, "#{namespace}/#{resource_name.to_s.classify}")
|
22
22
|
menu.instance_eval(&block) if block
|
23
23
|
|
24
|
-
|
24
|
+
class_eval do
|
25
25
|
class_attribute :menu, default: menu
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
class MenuDefinition
|
31
|
-
class_attribute :
|
31
|
+
class_attribute :options
|
32
32
|
class_attribute :resource_name
|
33
33
|
class_attribute :model_name
|
34
|
-
class_attribute :
|
34
|
+
class_attribute :single
|
35
35
|
|
36
36
|
NOTHING = ->(_) { true }
|
37
37
|
|
38
|
+
def self.single?
|
39
|
+
single
|
40
|
+
end
|
41
|
+
|
38
42
|
def self.loyalty(&value)
|
39
43
|
return (@loyalty || NOTHING) if value.nil?
|
40
44
|
|
41
45
|
@loyalty = value
|
42
46
|
end
|
43
47
|
|
44
|
-
def self.
|
45
|
-
return
|
48
|
+
def self.actions(&value)
|
49
|
+
return @actions if value.nil?
|
46
50
|
|
47
|
-
@
|
51
|
+
@actions = value
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
@@ -56,14 +60,15 @@ module Menuable
|
|
56
60
|
@context = context
|
57
61
|
end
|
58
62
|
|
59
|
-
def each
|
63
|
+
def each # rubocop:todo Metrics/MethodLength
|
64
|
+
return enum_for(:each) unless block_given?
|
65
|
+
|
60
66
|
@menus.each do |config|
|
61
67
|
case config
|
62
68
|
in divider:
|
63
69
|
yield config
|
64
|
-
in
|
65
|
-
|
66
|
-
yield menu({ **config, items: })
|
70
|
+
in items:
|
71
|
+
yield menu({ **config, items: items.filter_map { |item| menu(item) } })
|
67
72
|
else
|
68
73
|
menu(config).try { yield _1 }
|
69
74
|
end
|
@@ -111,17 +116,33 @@ module Menuable
|
|
111
116
|
end
|
112
117
|
|
113
118
|
class Menu
|
114
|
-
def initialize(namespace, path)
|
115
|
-
|
119
|
+
def initialize(namespace, path) # rubocop:todo Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
120
|
+
extract_namespace = lambda do |name|
|
121
|
+
if name
|
122
|
+
namespaces = name.split("/")
|
123
|
+
namespaces.pop
|
124
|
+
namespaces
|
125
|
+
else
|
126
|
+
[]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
@controllers = {}
|
116
131
|
@menus = YAML.load_file(path).map do |config|
|
117
132
|
config.deep_symbolize_keys!
|
118
|
-
|
119
|
-
|
133
|
+
namespaces = extract_namespace.call(config[:name])
|
134
|
+
controller = "#{namespace}/#{config[:name]&.pluralize}_controller".classify.safe_constantize
|
135
|
+
@controllers[namespaces] ||= []
|
136
|
+
@controllers[namespaces] << controller if controller
|
137
|
+
|
120
138
|
config[:items]&.each do |item|
|
121
|
-
item[:controller] = "#{namespace}/#{item[:name]}_controller".classify.safe_constantize
|
122
|
-
|
139
|
+
item[:controller] = "#{namespace}/#{item[:name]&.pluralize}_controller".classify.safe_constantize
|
140
|
+
item_namespaces = extract_namespace.call(item[:name])
|
141
|
+
@controllers[item_namespaces] ||= []
|
142
|
+
@controllers[item_namespaces] << item[:controller] if item[:controller]
|
123
143
|
end
|
124
|
-
|
144
|
+
|
145
|
+
{ **config, controller:, namespaces: }
|
125
146
|
end
|
126
147
|
end
|
127
148
|
|
@@ -134,29 +155,47 @@ module Menuable
|
|
134
155
|
end
|
135
156
|
|
136
157
|
def first(current_user:)
|
137
|
-
@controllers.each do |controller|
|
158
|
+
@controllers.values.flatten.each do |controller|
|
138
159
|
break controller.menu if controller.menu.loyalty.call(current_user)
|
139
160
|
end
|
140
161
|
end
|
141
162
|
|
142
|
-
def routes(routing)
|
143
|
-
|
144
|
-
routing.instance_eval do
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
163
|
+
def routes(routing) # rubocop:todo Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
|
164
|
+
controller_mappings = @controllers
|
165
|
+
routing.instance_eval do # rubocop:todo Metrics/BlockLength
|
166
|
+
controller_mappings.each do |namespaces, controllers| # rubocop:todo Metrics/BlockLength
|
167
|
+
define =
|
168
|
+
controllers.map do |controller|
|
169
|
+
if controller.menu.single?
|
170
|
+
lambda do |router|
|
171
|
+
router.resource controller.menu.resource_name do
|
172
|
+
router.instance_eval(&controller.menu.actions) if controller.menu.actions
|
173
|
+
end
|
174
|
+
end
|
175
|
+
else
|
176
|
+
lambda do |router|
|
177
|
+
router.resources controller.menu.resource_name do
|
178
|
+
router.instance_eval(&controller.menu.actions) if controller.menu.actions
|
179
|
+
end
|
151
180
|
end
|
152
181
|
end
|
153
182
|
end
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
183
|
+
|
184
|
+
case namespaces.length
|
185
|
+
when 3
|
186
|
+
namespace namespaces[0] do
|
187
|
+
namespace namespaces[1] do
|
188
|
+
namespace namespaces[2] { define.each { _1.call(self) } }
|
158
189
|
end
|
159
190
|
end
|
191
|
+
when 2
|
192
|
+
namespace namespaces[0] do
|
193
|
+
namespace(namespaces[1]) { define.each { _1.call(self) } }
|
194
|
+
end
|
195
|
+
when 1
|
196
|
+
namespace(namespaces[0]) { define.each { _1.call(self) } }
|
197
|
+
when 0
|
198
|
+
define.each { _1.call(self) }
|
160
199
|
end
|
161
200
|
end
|
162
201
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: menuable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masa (Aileron inc)
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'This library provides menu.yml and controller macros to manage routes
|
14
14
|
and sidebar implementations when implementing management functions in rails.
|