actionnav 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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/action_nav.rb +5 -0
- data/lib/action_nav/base.rb +71 -0
- data/lib/action_nav/controller_extension.rb +17 -0
- data/lib/action_nav/item.rb +45 -0
- data/lib/action_nav/item_dsl.rb +35 -0
- data/lib/action_nav/item_instance.rb +90 -0
- data/lib/action_nav/railtie.rb +12 -0
- data/lib/action_nav/set.rb +18 -0
- data/lib/action_nav/version.rb +3 -0
- data/lib/actionnav.rb +1 -0
- metadata +95 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3139471d9e398daa9e8e509f374be2077ec99ee8
|
4
|
+
data.tar.gz: da0f5b8f07d8e02e2214261dfa6aafca1f870207
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a5f0b4e891687847b56360cf59f2d4300f42016336680d534061547fff5c85b4dafbeccdf207e671ad7892549da71d9d0b43c3b49a248cb6548feacff782dd10
|
7
|
+
data.tar.gz: e9bf9423862d3465a095485480742fffb6d394cfb1fe77ac53f496fe6fb1aabb5d378cccda5a9e2811ea74666e4e4c0e421719d75ab802cce871d36686f60bf0
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/lib/action_nav.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'action_nav/item'
|
2
|
+
require 'action_nav/item_instance'
|
3
|
+
require 'action_nav/item_dsl'
|
4
|
+
|
5
|
+
module ActionNav
|
6
|
+
class Base
|
7
|
+
|
8
|
+
# Initialize a new navigation
|
9
|
+
#
|
10
|
+
# @param controller [ActionController::Base]
|
11
|
+
# @return [ActionNav::Base]
|
12
|
+
def initialize(controller)
|
13
|
+
@controller = controller
|
14
|
+
@active_paths = []
|
15
|
+
end
|
16
|
+
|
17
|
+
# The controller that initialized this navigation.
|
18
|
+
#
|
19
|
+
# @return [ActionController::Base]
|
20
|
+
attr_reader :controller
|
21
|
+
attr_reader :active_paths
|
22
|
+
|
23
|
+
# Return a full list of items for this instance as
|
24
|
+
# instances.
|
25
|
+
#
|
26
|
+
# @return [Array<ActionNav::ItemInstance>]
|
27
|
+
def items
|
28
|
+
@items ||= self.class.items.each_with_object([]) do |(key, item), array|
|
29
|
+
instance = ItemInstance.new(self, item)
|
30
|
+
unless instance.hidden?
|
31
|
+
array << instance
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add an active navigation by passing the full path to
|
37
|
+
# active item.
|
38
|
+
def activate(*parts)
|
39
|
+
@active_paths.push(parts)
|
40
|
+
end
|
41
|
+
alias_method :active, :activate
|
42
|
+
|
43
|
+
# Is the given active path?
|
44
|
+
#
|
45
|
+
# @return [Boolean]
|
46
|
+
def active_path?(*parts)
|
47
|
+
@active_paths.any? do |path|
|
48
|
+
a = path.size.times.map { |i| path[0, path.size - i] }
|
49
|
+
a.include?(parts)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Add a new item to this navigation
|
54
|
+
#
|
55
|
+
# @param id [Symbol]
|
56
|
+
# @return [ActionNav::Item]
|
57
|
+
def self.item(id, &block)
|
58
|
+
item = Item.new(nil, id)
|
59
|
+
item.dsl(&block) if block_given?
|
60
|
+
items[id] = item
|
61
|
+
end
|
62
|
+
|
63
|
+
# Return all items for this navigation
|
64
|
+
#
|
65
|
+
# @return [Hash]
|
66
|
+
def self.items
|
67
|
+
@items ||= {}
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'action_nav/item_dsl'
|
2
|
+
|
3
|
+
module ActionNav
|
4
|
+
class Item
|
5
|
+
|
6
|
+
def initialize(parent, id)
|
7
|
+
@id = id
|
8
|
+
@parent = parent
|
9
|
+
@children = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :id
|
13
|
+
attr_reader :children
|
14
|
+
attr_accessor :title
|
15
|
+
attr_accessor :url
|
16
|
+
attr_accessor :description
|
17
|
+
attr_accessor :icon
|
18
|
+
attr_accessor :hide_unless
|
19
|
+
|
20
|
+
def path
|
21
|
+
@parent ? [@parent.path, id].flatten : [id]
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_child(id, &block)
|
25
|
+
child_item = Item.new(self, id)
|
26
|
+
block.call(child_item) if block_given?
|
27
|
+
@children[id] = child_item
|
28
|
+
end
|
29
|
+
|
30
|
+
def child(*ids)
|
31
|
+
previous = self
|
32
|
+
ids.each do |id|
|
33
|
+
previous = previous.children[id]
|
34
|
+
return nil if previous.nil?
|
35
|
+
end
|
36
|
+
previous
|
37
|
+
end
|
38
|
+
|
39
|
+
def dsl(&block)
|
40
|
+
ItemDSL.new(self).instance_eval(&block)
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ActionNav
|
2
|
+
class ItemDSL
|
3
|
+
|
4
|
+
def initialize(item)
|
5
|
+
@item = item
|
6
|
+
end
|
7
|
+
|
8
|
+
def title(title = nil, &block)
|
9
|
+
@item.title = block_given? ? block : title
|
10
|
+
end
|
11
|
+
|
12
|
+
def url(url = nil, &block)
|
13
|
+
@item.url = block_given? ? block : url
|
14
|
+
end
|
15
|
+
|
16
|
+
def description(description = nil, &block)
|
17
|
+
@item.description = block_given? ? block : description
|
18
|
+
end
|
19
|
+
|
20
|
+
def icon(icon = nil, &block)
|
21
|
+
@item.icon = block_given? ? block : icon
|
22
|
+
end
|
23
|
+
|
24
|
+
def hide_unless(&block)
|
25
|
+
@item.hide_unless = block
|
26
|
+
end
|
27
|
+
|
28
|
+
def item(id, &block)
|
29
|
+
child = @item.add_child(id)
|
30
|
+
child.dsl(&block)
|
31
|
+
child
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'active_support/inflector/methods'
|
2
|
+
|
3
|
+
module ActionNav
|
4
|
+
class ItemInstance
|
5
|
+
|
6
|
+
attr_reader :item
|
7
|
+
|
8
|
+
def initialize(base, item)
|
9
|
+
@base = base
|
10
|
+
@item = item
|
11
|
+
end
|
12
|
+
|
13
|
+
def id
|
14
|
+
@item.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def path
|
18
|
+
@item.path
|
19
|
+
end
|
20
|
+
|
21
|
+
def items
|
22
|
+
@item.children.each_with_object([]) do |(_, item), array|
|
23
|
+
instance = ItemInstance.new(@base, item)
|
24
|
+
unless instance.hidden?
|
25
|
+
array << instance
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def active?
|
31
|
+
@base.active_path?(*self.path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def title
|
35
|
+
cache(:title) { parse(@item.title, ActiveSupport::Inflector.humanize(@item.id.to_s)) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def description
|
39
|
+
cache(:description) { parse(@item.description) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def description?
|
43
|
+
!!description
|
44
|
+
end
|
45
|
+
|
46
|
+
def url
|
47
|
+
cache(:url) { parse(@item.url, "/")}
|
48
|
+
end
|
49
|
+
|
50
|
+
def icon
|
51
|
+
cache(:icon) { parse(@item.icon) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def icon?
|
55
|
+
!!icon
|
56
|
+
end
|
57
|
+
|
58
|
+
def hidden?
|
59
|
+
cache(:hidden?) do
|
60
|
+
if @item.hide_unless
|
61
|
+
parse(@item.hide_unless, false) == false
|
62
|
+
else
|
63
|
+
false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def parse(item, default = nil)
|
71
|
+
if item.is_a?(Proc)
|
72
|
+
@base.controller.instance_eval(&item)
|
73
|
+
elsif item
|
74
|
+
item.to_s
|
75
|
+
else
|
76
|
+
default
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def cache(name, &block)
|
81
|
+
@cache ||= {}
|
82
|
+
if @cache.keys.include?(name)
|
83
|
+
@cache[name]
|
84
|
+
else
|
85
|
+
@cache[name] = block.call
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActionNav
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
|
4
|
+
initializer 'actionnav.initialize' do |app|
|
5
|
+
ActiveSupport.on_load :action_controller do
|
6
|
+
require 'action_nav/controller_extension'
|
7
|
+
include ActionNav::ControllerExtension
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_support/inflector/inflections'
|
2
|
+
|
3
|
+
module ActionNav
|
4
|
+
class Set
|
5
|
+
|
6
|
+
def initialize(controller)
|
7
|
+
@controller = controller
|
8
|
+
@navigations = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](name)
|
12
|
+
@navigations[name] ||= begin
|
13
|
+
"#{name.to_s}_navigation".classify.constantize.new(@controller)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/actionnav.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'action_nav'
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: actionnav
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIEZDCCAsygAwIBAgIBATANBgkqhkiG9w0BAQsFADA8MQswCQYDVQQDDAJtZTEZ
|
14
|
+
MBcGCgmSJomT8ixkARkWCWFkYW1jb29rZTESMBAGCgmSJomT8ixkARkWAmlvMB4X
|
15
|
+
DTE4MDMwNTE3MzAwNVoXDTE5MDMwNTE3MzAwNVowPDELMAkGA1UEAwwCbWUxGTAX
|
16
|
+
BgoJkiaJk/IsZAEZFglhZGFtY29va2UxEjAQBgoJkiaJk/IsZAEZFgJpbzCCAaIw
|
17
|
+
DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAOH6HpXwjmVYrUQxUHm25mLm9qYK
|
18
|
+
WS66Me1IfMUX3ZREZ/GzqiJZdV6itPuaaaKpbcm2A/KjgGSPOi9FZBneZ5KvbIeK
|
19
|
+
/GsixL98kxB06q9DZwJbFz7Inklxkd/S0anm+PxtWkQP1TLkMsviRcBPEAqSLON9
|
20
|
+
dCKC7+3kibhatdlsbqIQaeEhSoCUipYMi7ZyFHu5Qz+zMwc8JwHvQ4yi8cMa/QZ+
|
21
|
+
s1tN4mkp/6vWWj4G4lF3YjFYyt2txJcK5ELDtyBy7a3vbMImPy9pplFx1/M6SNpn
|
22
|
+
7Pck0LqDprRzJXsGjq3CbC0nUaudFjUPr31KwxMYq1u13aQL9YuO3GeQCQ3gvdlJ
|
23
|
+
TSd7zoGgLwrMGmXqgd392Psr29yp+WBLcvhFUJnNPDV8nlph/cqmRzoIewP1kdPq
|
24
|
+
pEIUIJQdyKJU7gmFlJ1FurarkuT0a2Rgs99WokCoXLxuPmRWQRN1sH2nHL70jgAR
|
25
|
+
UuvyXEtyALHoCn3VqBR7ZvpfDblUzfANQDhBgwIDAQABo3EwbzAJBgNVHRMEAjAA
|
26
|
+
MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUa7gxxSE4SO2Ors4B+y3qANdMpo4wGgYD
|
27
|
+
VR0RBBMwEYEPbWVAYWRhbWNvb2tlLmlvMBoGA1UdEgQTMBGBD21lQGFkYW1jb29r
|
28
|
+
ZS5pbzANBgkqhkiG9w0BAQsFAAOCAYEAkbz/AJwBsRKwgt2BhWqgr/egf/37IS3s
|
29
|
+
utVox7feYutKyFDHXYvCjm64XUJNioG7ipbRwOOGs5bEYfwgkabcAQnxSlkdNjc4
|
30
|
+
JIgL/cF4YRg8uJG7DH+LwpydXHqr7RneDiONuiHlEN/1EZZ8tjwXypdwzhQ2/6ot
|
31
|
+
YOxdSi/mXdoDoFlIebsLyInUZjqnm7dQ9nTTUNSB+1LoOD8ARNhTIPnKCnxwZd56
|
32
|
+
giOxoHuJIOhgi6U2zicZJHv8lUj2Lc3bcirQk5eeOFRPVGQSpLLoqA7dtS7Jy4cv
|
33
|
+
3c5m+HyxSxzlrcVHMAgJYemK0uhVQD9Y6JwHKDroWDH+MPALjlScw8ui1jmNuH31
|
34
|
+
n5JOH/07C4gYcwTjJmtoRSov46Z6Gn5cc6NFkQpA185pbRLqEDKzusXvBOQlAOLh
|
35
|
+
iyQrH6PJ0xgVJNYx+DLq3eFmo2hYJkw/lVhYAK+MdajtYJbD5VvCIEHO0d5RRgV+
|
36
|
+
qnCNZoPPy0UtRmGKZTMZvVJEZiw4g0fY
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
39
|
+
dependencies:
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: activesupport
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
description: A navigation manager for Rails applications.
|
55
|
+
email:
|
56
|
+
- me@adamcooke.io
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/action_nav.rb
|
62
|
+
- lib/action_nav/base.rb
|
63
|
+
- lib/action_nav/controller_extension.rb
|
64
|
+
- lib/action_nav/item.rb
|
65
|
+
- lib/action_nav/item_dsl.rb
|
66
|
+
- lib/action_nav/item_instance.rb
|
67
|
+
- lib/action_nav/railtie.rb
|
68
|
+
- lib/action_nav/set.rb
|
69
|
+
- lib/action_nav/version.rb
|
70
|
+
- lib/actionnav.rb
|
71
|
+
homepage: https://github.com/adamcooke/actionnav
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.5.2.3
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: This gem provides a friendly way to manage application navigation.
|
95
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|