Class: ActiveScaffold::DataStructures::ActionLink

Inherits:
Object
  • Object
show all
Defined in:
lib/active_scaffold/data_structures/action_link.rb

Constant Summary collapse

NO_OPTIONS =
{}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(action, options = {}) ⇒ ActionLink

provides a quick way to set any property of the object from a hash


6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/active_scaffold/data_structures/action_link.rb', line 6

def initialize(action, options = {})
  # set defaults
  @action = action
  @label = action
  @confirm = false
  @type = :collection
  @method = :get
  @crud_type =
    case action&.to_sym
    when :destroy then :delete
    when :create, :new then :create
    when :update, :edit then :update
    else :read
    end
  @column = nil
  @image = nil
  @controller = nil
  @parameters = nil
  @dynamic_parameters = nil
  @html_options = nil
  @weight = 0
  self.inline = true

  # apply quick properties
  options.each_pair do |k, v|
    setter = "#{k}="
    send(setter, v) if respond_to? setter
  end
  self.toggle = self.action&.to_sym == :index && !position && (parameters.present? || dynamic_parameters) unless options.include? :toggle
end

Instance Attribute Details

#actionObject

the action-path for this link. what page to request? this is required!


46
47
48
# File 'lib/active_scaffold/data_structures/action_link.rb', line 46

def action
  @action
end

#columnObject

nested action_links are referencing a column


204
205
206
# File 'lib/active_scaffold/data_structures/action_link.rb', line 204

def column
  @column
end

#controllerObject


51
52
53
54
# File 'lib/active_scaffold/data_structures/action_link.rb', line 51

def controller
  @controller = @controller.call if @controller.is_a?(Proc)
  @controller
end

#controller_actionsObject

for links in singular associations, copied from column.actions_for_association_links, excluding actions not available in association's controller


215
216
217
# File 'lib/active_scaffold/data_structures/action_link.rb', line 215

def controller_actions
  @controller_actions
end

#crud_typeObject

the crud type of the (eventual?) action. different than :method, because this crud action may not be imminent. this is used to determine record-level authorization (e.g. record.authorized_for?(:crud_type => link.crud_type). options are :create, :read, :update, and :delete


135
136
137
# File 'lib/active_scaffold/data_structures/action_link.rb', line 135

def crud_type
  @crud_type
end

#dhtml_confirmObject

if the action uses a DHTML based (i.e. 2-phase) confirmation


103
104
105
# File 'lib/active_scaffold/data_structures/action_link.rb', line 103

def dhtml_confirm
  @dhtml_confirm
end

#dynamic_parametersObject

a block for dynamic_parameters


73
74
75
# File 'lib/active_scaffold/data_structures/action_link.rb', line 73

def dynamic_parameters
  @dynamic_parameters
end

#html_optionsObject


198
199
200
201
# File 'lib/active_scaffold/data_structures/action_link.rb', line 198

def html_options
  return @html_options || NO_OPTIONS if frozen?
  @html_options ||= NO_OPTIONS.dup
end

#ignore_methodObject

what method to call on the controller to see if this action_link should be visible if method return true, link won't be displayed


130
131
132
# File 'lib/active_scaffold/data_structures/action_link.rb', line 130

def ignore_method
  @ignore_method
end

#imageObject

image to use => 'arrow.png', :size => '16x16'


85
86
87
# File 'lib/active_scaffold/data_structures/action_link.rb', line 85

def image
  @image
end

#keep_open=(value) ⇒ Object (writeonly)

don't close the panel when another action link is open


207
208
209
# File 'lib/active_scaffold/data_structures/action_link.rb', line 207

def keep_open=(value)
  @keep_open = value
end

#labelObject


80
81
82
# File 'lib/active_scaffold/data_structures/action_link.rb', line 80

def label
  @label.is_a?(Symbol) ? ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) } : @label
end

#methodObject

the RESTful method


76
77
78
# File 'lib/active_scaffold/data_structures/action_link.rb', line 76

def method
  @method
end

#parametersObject


62
63
64
65
# File 'lib/active_scaffold/data_structures/action_link.rb', line 62

def parameters
  return @parameters || NO_OPTIONS if frozen?
  @parameters ||= NO_OPTIONS.dup
end

#positionObject


186
187
188
189
190
191
# File 'lib/active_scaffold/data_structures/action_link.rb', line 186

def position
  return @position unless @position.nil? || @position == true
  return :replace if type == :member
  return :top if type == :collection
  raise "what should the default position be for #{type}?"
end

#refresh_on_closeObject

enable it to refresh the parent row when the view is closed


126
127
128
# File 'lib/active_scaffold/data_structures/action_link.rb', line 126

def refresh_on_close
  @refresh_on_close
end

#security_methodObject


117
118
119
# File 'lib/active_scaffold/data_structures/action_link.rb', line 117

def security_method
  @security_method || "#{action}_authorized?"
end

#toggleObject

if active class is added to link when current request matches link enabled automatically for links to index with parameters or dynamic parameters disable when is not needed so current request match check is skipped


70
71
72
# File 'lib/active_scaffold/data_structures/action_link.rb', line 70

def toggle
  @toggle
end

#typeObject

what type of link this is. currently supported values are :collection and :member.


194
195
196
# File 'lib/active_scaffold/data_structures/action_link.rb', line 194

def type
  @type
end

#weightObject

the weight for this link in the action links collection, it will be used to sort the collection


43
44
45
# File 'lib/active_scaffold/data_structures/action_link.rb', line 43

def weight
  @weight
end

Instance Method Details

#confirm(label = '') ⇒ Object


93
94
95
96
# File 'lib/active_scaffold/data_structures/action_link.rb', line 93

def confirm(label = '')
  return @confirm if !confirm? || @confirm.is_a?(String)
  ActiveScaffold::Registry.cache(:translations, @confirm) { as_(@confirm) } % {label: label}
end

#confirm=(value) ⇒ Object

if the action requires confirmation


88
89
90
91
# File 'lib/active_scaffold/data_structures/action_link.rb', line 88

def confirm=(value)
  @dhtml_confirm = nil if value
  @confirm = value
end

#confirm?Boolean

Returns:

  • (Boolean)

98
99
100
# File 'lib/active_scaffold/data_structures/action_link.rb', line 98

def confirm?
  @confirm.present?
end

#dhtml_confirm?Boolean

Returns:

  • (Boolean)

109
110
111
# File 'lib/active_scaffold/data_structures/action_link.rb', line 109

def dhtml_confirm?
  @dhtml_confirm.present?
end

#freezeObject


234
235
236
237
238
# File 'lib/active_scaffold/data_structures/action_link.rb', line 234

def freeze
  # force generating cache_key, except for column's link without action, or polymorphic associations
  name_to_cache if action && !column&.association&.polymorphic?
  super
end

#initialize_copy(action_link) ⇒ Object


37
38
39
40
# File 'lib/active_scaffold/data_structures/action_link.rb', line 37

def initialize_copy(action_link)
  self.parameters = parameters.clone if action_link.instance_variable_get(:@parameters)
  self.html_options = html_options.clone if action_link.instance_variable_get(:@html_options)
end

#inline=(val) ⇒ Object

an “inline” link is inserted into the existing page exclusive with popup? and page?


139
140
141
142
# File 'lib/active_scaffold/data_structures/action_link.rb', line 139

def inline=(val)
  @inline = (val == true)
  self.popup = self.page = false if @inline
end

#inline?Boolean

Returns:

  • (Boolean)

144
145
146
# File 'lib/active_scaffold/data_structures/action_link.rb', line 144

def inline?
  @inline
end

#keep_open?Boolean

Returns:

  • (Boolean)

208
209
210
# File 'lib/active_scaffold/data_structures/action_link.rb', line 208

def keep_open?
  @keep_open
end

#name_to_cacheObject


222
223
224
225
226
227
228
229
230
231
232
# File 'lib/active_scaffold/data_structures/action_link.rb', line 222

def name_to_cache
  return @name_to_cache if defined? @name_to_cache
  [
    controller || 'self',
    type,
    action,
    *parameters.map { |k, v| "#{k}=#{v.is_a?(Array) ? v.join(',') : v}" }
  ].compact.join('_').tap do |name_to_cache|
    @name_to_cache = name_to_cache unless frozen?
  end
end

#nested_link?Boolean

indicates that this a nested_link

Returns:

  • (Boolean)

218
219
220
# File 'lib/active_scaffold/data_structures/action_link.rb', line 218

def nested_link?
  @column || parameters&.dig(:named_scope)
end

#page=(val) ⇒ Object

a “page” link displays by reloading the current page exclusive with inline? and popup?


166
167
168
169
# File 'lib/active_scaffold/data_structures/action_link.rb', line 166

def page=(val)
  @page = (val == true)
  self.inline = self.popup = false if @page
end

#page?Boolean

Returns:

  • (Boolean)

171
172
173
# File 'lib/active_scaffold/data_structures/action_link.rb', line 171

def page?
  @page
end

#popup=(val) ⇒ Object

a “popup” link displays in a separate (browser?) window. this will eventually take arguments. exclusive with inline? and page?


150
151
152
153
154
155
156
157
158
# File 'lib/active_scaffold/data_structures/action_link.rb', line 150

def popup=(val)
  @popup = (val == true)
  return unless @popup
  self.inline = self.page = false

  # the :method parameter doesn't mix with the :popup parameter
  # when/if we start using DHTML popups, we can bring :method back
  self.method = nil
end

#popup?Boolean

Returns:

  • (Boolean)

160
161
162
# File 'lib/active_scaffold/data_structures/action_link.rb', line 160

def popup?
  @popup
end

#security_method_set?Boolean

Returns:

  • (Boolean)

121
122
123
# File 'lib/active_scaffold/data_structures/action_link.rb', line 121

def security_method_set?
  @security_method.present?
end

#static_controller?Boolean

Returns:

  • (Boolean)

56
57
58
# File 'lib/active_scaffold/data_structures/action_link.rb', line 56

def static_controller?
  !(@controller.is_a?(Proc) || (@controller == :polymorph))
end