Class: ActiveScaffold::DataStructures::ActionLinks
- Includes:
- Enumerable
- Defined in:
- lib/active_scaffold/data_structures/action_links.rb
Instance Attribute Summary collapse
-
#css_class ⇒ Object
Returns the value of attribute css_class.
-
#default_type ⇒ Object
Returns the value of attribute default_type.
- #label(record) ⇒ Object
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#weight ⇒ Object
Returns the value of attribute weight.
Instance Method Summary collapse
-
#[](val) ⇒ Object
finds an ActionLink by matching the action.
-
#add(action, options = {}) ⇒ Object
(also: #<<)
adds an ActionLink, creating one from the arguments if need be.
- #add_separator(weight = 0) ⇒ Object
-
#add_to_group(link, group_name = nil) ⇒ Object
adds a link to a specific group groups are represented as a string separated by a dot eg member.crud.
- #add_to_set(link) ⇒ Object
- #collect ⇒ Object
- #delete(val) ⇒ Object
- #delete_group(name) ⇒ Object
-
#each(options = {}, &block) ⇒ Object
iterates over the links, possibly by type.
- #empty? ⇒ Boolean
- #find_duplicate(link) ⇒ Object
-
#initialize(name = :root) ⇒ ActionLinks
constructor
A new instance of ActionLinks.
- #method_missing(name, *args, &block) ⇒ Object
- #respond_to_missing?(name) ⇒ Boolean
- #subgroup(name, label = nil) ⇒ Object
Constructor Details
#initialize(name = :root) ⇒ ActionLinks
Returns a new instance of ActionLinks.
6 7 8 9 10 11 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 6 def initialize(name = :root) @set = [] @name = name @css_class = name.to_s.downcase @weight = 0 end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 163 def method_missing(name, *args, &block) return super if name.match?(/[=!?]$/) return subgroup(name.to_sym, args.first, &block) if frozen? class_eval <<-METHOD, __FILE__, __LINE__ + 1 def #{name}(label = nil) # def group_name(label = nil) @#{name} ||= subgroup(:'#{name}', label) # @group_name ||= subgroup(:'group_name', label) yield @#{name} if block_given? # yield @group_name if block_given? @#{name} # @group_name end # end METHOD send(name, args.first, &block) end |
Instance Attribute Details
#css_class ⇒ Object
Returns the value of attribute css_class.
182 183 184 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 182 def css_class @css_class end |
#default_type ⇒ Object
Returns the value of attribute default_type.
4 5 6 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 4 def default_type @default_type end |
#label(record) ⇒ Object
152 153 154 155 156 157 158 159 160 161 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 152 def label(record) case @label when Symbol ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) } when Proc @label.call(record) else @label end end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
181 182 183 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 181 def name @name end |
#weight ⇒ Object
Returns the value of attribute weight.
182 183 184 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 182 def weight @weight end |
Instance Method Details
#[](val) ⇒ Object
finds an ActionLink by matching the action
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 57 def [](val) links = [] @set.each do |item| next if item == :separator if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) collected = item[val] links << collected unless collected.nil? elsif item.action.to_s == val.to_s links << item end end links.first end |
#add(action, options = {}) ⇒ Object Also known as: <<
adds an ActionLink, creating one from the arguments if need be
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 14 def add(action, = {}) link = if action.is_a?(ActiveScaffold::DataStructures::ActionLink) || action.is_a?(ActiveScaffold::DataStructures::ActionLinks) action else [:type] ||= default_type if default_type ActiveScaffold::DataStructures::ActionLink.new(action, ) end # NOTE: this duplicate check should be done by defining the comparison operator for an Action data structure existing = find_duplicate(link) if existing existing else # That s for backwards compatibility if we are in root of action_links # we have to move actionlink into members or collection subgroup group = (name == :root ? subgroup(link.type, link.type) : self) group.add_to_set(link) link end end |
#add_separator(weight = 0) ⇒ Object
37 38 39 40 41 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 37 def add_separator(weight = 0) raise 'Call add_separator on a group' if name == :root add_to_set ActionLinkSeparator.new(weight) end |
#add_to_group(link, group_name = nil) ⇒ Object
adds a link to a specific group groups are represented as a string separated by a dot eg member.crud
50 51 52 53 54 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 50 def add_to_group(link, group_name = nil) add_to = root add_to = group_name.split('.').inject(root) { |group, name| group.send(name) } if group_name add_to << link unless link.nil? end |
#add_to_set(link) ⇒ Object
43 44 45 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 43 def add_to_set(link) @set << link end |
#collect ⇒ Object
125 126 127 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 125 def collect @set end |
#delete(val) ⇒ Object
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 87 def delete(val) each(include_set: true) do |link, set| next if link == :separator if link.action.to_s == val.to_s set.delete link break end end end |
#delete_group(name) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 98 def delete_group(name) @set.each do |group| next unless group.is_a?(ActiveScaffold::DataStructures::ActionLinks) if group.name == name @set.delete group break else group.delete_group(name) end end end |
#each(options = {}, &block) ⇒ Object
iterates over the links, possibly by type
112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 112 def each( = {}, &block) method = [:reverse] ? :reverse_each : :each @set.sort_by(&:weight).send(method) do |item| if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && ![:groups] item.each(, &block) elsif [:include_set] yield item, @set else yield item end end end |
#empty? ⇒ Boolean
129 130 131 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 129 def empty? @set.empty? end |
#find_duplicate(link) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 72 def find_duplicate(link) links = [] @set.each do |item| next if item == :separator if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) collected = item.find_duplicate(link) links << collected unless collected.nil? elsif item.action == link.action && item.static_controller? && item.controller == link.controller && item.parameters == link.parameters links << item end end links.first end |
#respond_to_missing?(name) ⇒ Boolean
177 178 179 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 177 def respond_to_missing?(name, *) name !~ /[!?]$/ end |
#subgroup(name, label = nil) ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/active_scaffold/data_structures/action_links.rb', line 133 def subgroup(name, label = nil) group = self if name == self.name group ||= @set.find do |item| name == item.name if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) end if group.nil? raise "Can't add new subgroup '#{name}', links are frozen" if frozen? group = ActiveScaffold::DataStructures::ActionLinks.new(name) group.label = label || name group.default_type = self.name == :root ? (name.to_sym if %w[member collection].include?(name.to_s)) : default_type add_to_set group end group end |