Class: Avo::Fields::BaseField

Instance Attribute Summary collapse

Attributes included from Concerns::IsDisabled

#disabled

Attributes included from Concerns::HasHTMLAttributes

#html

Attributes included from Concerns::VisibleInDifferentViews

#show_on_edit, #show_on_index, #show_on_new, #show_on_preview, #show_on_show

Attributes included from Concerns::IsVisible

#visible

Attributes included from Concerns::IsResourceItem

#resource, #view

Instance Method Summary collapse

Methods included from Concerns::UseViewComponents

#component_for_view, #view_component_name, #view_component_namespace

Methods included from Concerns::IsRequired

#is_required?

Methods included from Concerns::IsDisabled

#is_disabled?

Methods included from Concerns::IsReadonly

#is_readonly?

Methods included from Concerns::HasHTMLAttributes

#get_html

Methods included from Concerns::HasDefault

#computed_default_value

Methods included from Concerns::HasHelpers

#helpers

Methods included from Concerns::VisibleInDifferentViews

#except_on, #hide_on, #initialize_views, #only_on, #post_initialize, #show_on, #show_on_create, #show_on_update, #visible_in_view?

Methods included from Concerns::IsVisible

#visible?

Methods included from Concerns::HasItemType

#is_collaboration?, #is_field?, #is_heading?, #is_main_panel?, #is_panel?, #is_row?, #is_sidebar?, #is_tab?, #is_tab_group?, #is_tool?

Methods included from Concerns::IsResourceItem

#visible?

Methods included from Concerns::Hydration

#hydrate

Constructor Details

#initialize(id, **args, &block) ⇒ BaseField

Returns a new instance of BaseField.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/avo/fields/base_field.rb', line 66

def initialize(id, **args, &block)
  @id = id
  @name = args[:name]
  @translation_key = args[:translation_key]
  @block = block
  @required = args.dig(:required) # Value if :required present on args, nil otherwise
  @readonly = args[:readonly] || false
  @disabled = args[:disabled] || false
  @sortable = args[:sortable] || false
  @summarizable = args[:summarizable] || false
  @nullable = args[:nullable] || false
  @null_values = args[:null_values] || [nil, ""]
  @format_using = args[:format_using]
  @format_display_using = args[:format_display_using] || args[:decorate]

  unless Rails.env.production?
    if args[:decorate].present?
      puts "[Avo DEPRECATION WARNING]: The `decorate` field configuration option is nolonger supported and will be removed in future versions. Please discontinue its use and solely utilize `format_display_using` instead."
    end
  end

  @format_index_using = args[:format_index_using]
  @format_show_using = args[:format_show_using]
  @format_edit_using = args[:format_edit_using]
  @format_new_using = args[:format_new_using]
  @format_form_using = args[:format_form_using]
  @update_using = args[:update_using]
  @decorate = args[:decorate]
  @placeholder = args[:placeholder]
  @autocomplete = args[:autocomplete]
  @help = args[:help]
  @default = args[:default]
  @visible = args[:visible]
  @html = args[:html]
  @view = Avo::ViewInquirer.new(args[:view])
  @value = args[:value]
  @stacked = args[:stacked]
  @for_presentation_only = args[:for_presentation_only] || false
  @resource = args[:resource]
  @action = args[:action]
  @components = args[:components] || {}
  @for_attribute = args[:for_attribute]
  @meta = args[:meta]
  @copyable = args[:copyable] || false

  @args = args

  @computable = true
  @computed = block.present?
  @computed_value = nil

  post_initialize if respond_to?(:post_initialize)
end

Instance Attribute Details

#actionObject

Returns the value of attribute action.



60
61
62
# File 'lib/avo/fields/base_field.rb', line 60

def action
  @action
end

#autocompleteObject (readonly)

Returns the value of attribute autocomplete.



45
46
47
# File 'lib/avo/fields/base_field.rb', line 45

def autocomplete
  @autocomplete
end

#blockObject (readonly)

Returns the value of attribute block.



31
32
33
# File 'lib/avo/fields/base_field.rb', line 31

def block
  @block
end

#computableObject (readonly)

Private options



53
54
55
# File 'lib/avo/fields/base_field.rb', line 53

def computable
  @computable
end

#computedObject (readonly)

if block is present



54
55
56
# File 'lib/avo/fields/base_field.rb', line 54

def computed
  @computed
end

#computed_valueObject (readonly)

the value after computation



55
56
57
# File 'lib/avo/fields/base_field.rb', line 55

def computed_value
  @computed_value
end

#copyableObject (readonly)

if allowed to be copyable



56
57
58
# File 'lib/avo/fields/base_field.rb', line 56

def copyable
  @copyable
end

#defaultObject (readonly)

Returns the value of attribute default.



47
48
49
# File 'lib/avo/fields/base_field.rb', line 47

def default
  @default
end

#for_attributeObject (readonly)

Returns the value of attribute for_attribute.



50
51
52
# File 'lib/avo/fields/base_field.rb', line 50

def for_attribute
  @for_attribute
end

#for_presentation_onlyObject (readonly)

Returns the value of attribute for_presentation_only.



49
50
51
# File 'lib/avo/fields/base_field.rb', line 49

def for_presentation_only
  @for_presentation_only
end

#format_display_usingObject (readonly)

Returns the value of attribute format_display_using.



39
40
41
# File 'lib/avo/fields/base_field.rb', line 39

def format_display_using
  @format_display_using
end

#format_edit_usingObject (readonly)

Returns the value of attribute format_edit_using.



42
43
44
# File 'lib/avo/fields/base_field.rb', line 42

def format_edit_using
  @format_edit_using
end

#format_form_usingObject (readonly)

Returns the value of attribute format_form_using.



44
45
46
# File 'lib/avo/fields/base_field.rb', line 44

def format_form_using
  @format_form_using
end

#format_index_usingObject (readonly)

Returns the value of attribute format_index_using.



40
41
42
# File 'lib/avo/fields/base_field.rb', line 40

def format_index_using
  @format_index_using
end

#format_new_usingObject (readonly)

Returns the value of attribute format_new_using.



43
44
45
# File 'lib/avo/fields/base_field.rb', line 43

def format_new_using
  @format_new_using
end

#format_show_usingObject (readonly)

Returns the value of attribute format_show_using.



41
42
43
# File 'lib/avo/fields/base_field.rb', line 41

def format_show_using
  @format_show_using
end

#format_usingObject (readonly)

Returns the value of attribute format_using.



38
39
40
# File 'lib/avo/fields/base_field.rb', line 38

def format_using
  @format_using
end

#helpObject (readonly)

Returns the value of attribute help.



46
47
48
# File 'lib/avo/fields/base_field.rb', line 46

def help
  @help
end

#idObject (readonly)

Returns the value of attribute id.



30
31
32
# File 'lib/avo/fields/base_field.rb', line 30

def id
  @id
end

#null_valuesObject (readonly)

Returns the value of attribute null_values.



37
38
39
# File 'lib/avo/fields/base_field.rb', line 37

def null_values
  @null_values
end

#nullableObject (readonly)

Returns the value of attribute nullable.



36
37
38
# File 'lib/avo/fields/base_field.rb', line 36

def nullable
  @nullable
end

#panel_nameObject

Returns the value of attribute panel_name.



62
63
64
# File 'lib/avo/fields/base_field.rb', line 62

def panel_name
  @panel_name
end

#readonlyObject (readonly)

Returns the value of attribute readonly.



33
34
35
# File 'lib/avo/fields/base_field.rb', line 33

def readonly
  @readonly
end

#recordObject

Hydrated payload



59
60
61
# File 'lib/avo/fields/base_field.rb', line 59

def record
  @record
end

#requiredObject (readonly)

Returns the value of attribute required.



32
33
34
# File 'lib/avo/fields/base_field.rb', line 32

def required
  @required
end

#sortableObject (readonly)

Returns the value of attribute sortable.



34
35
36
# File 'lib/avo/fields/base_field.rb', line 34

def sortable
  @sortable
end

#stackedObject (readonly)

Returns the value of attribute stacked.



48
49
50
# File 'lib/avo/fields/base_field.rb', line 48

def stacked
  @stacked
end

#summarizableObject (readonly)

Returns the value of attribute summarizable.



35
36
37
# File 'lib/avo/fields/base_field.rb', line 35

def summarizable
  @summarizable
end

#userObject

Returns the value of attribute user.



61
62
63
# File 'lib/avo/fields/base_field.rb', line 61

def user
  @user
end

Instance Method Details

#apply_update_using(record, key, value, resource) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/avo/fields/base_field.rb', line 224

def apply_update_using(record, key, value, resource)
  return value if @update_using.nil?

  Avo::ExecutionContext.new(
    target: @update_using,
    record:,
    key:,
    value:,
    resource:,
    field: self,
    include: self.class.included_modules
  ).handle
end

#assign_value(record:, value:) ⇒ Object

Used by Avo to fill the record with the default value on :new and :edit views



292
293
294
295
296
297
298
# File 'lib/avo/fields/base_field.rb', line 292

def assign_value(record:, value:)
  id = (type == "belongs_to") ? foreign_key : database_id

  if record.send(id).nil?
    record.send(:"#{id}=", value)
  end
end

#attribute_idObject



172
# File 'lib/avo/fields/base_field.rb', line 172

def attribute_id = (@attribure_id ||= @for_attribute || @id)

#custom?Boolean

Returns:

  • (Boolean)


269
270
271
272
273
# File 'lib/avo/fields/base_field.rb', line 269

def custom?
  !method(:initialize).source_location.first.include?("lib/avo/field")
rescue
  true
end

#custom_name?Boolean

Returns:

  • (Boolean)


160
161
162
# File 'lib/avo/fields/base_field.rb', line 160

def custom_name?
  !@name.nil?
end

#database_idObject

Try to see if the field has a different database ID than it’s name



243
244
245
246
247
# File 'lib/avo/fields/base_field.rb', line 243

def database_id
  foreign_key
rescue
  id
end

#default_nameObject



164
165
166
# File 'lib/avo/fields/base_field.rb', line 164

def default_name
  @id.to_s.humanize(keep_id_suffix: true)
end

#execute_context(target, **extra_args) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
# File 'lib/avo/fields/base_field.rb', line 202

def execute_context(target, **extra_args)
  Avo::ExecutionContext.new(
    target:,
    record: @record,
    resource: @resource,
    view: @view,
    field: self,
    include: self.class.included_modules,
    **extra_args
  ).handle
end

#fill_field(record, key, value, params) ⇒ Object

Fills the record with the received value on create and update actions.



215
216
217
218
219
220
221
222
# File 'lib/avo/fields/base_field.rb', line 215

def fill_field(record, key, value, params)
  key = @for_attribute.to_s if @for_attribute.present?
  return record unless has_attribute?(record, key)

  record.public_send(:"#{key}=", apply_update_using(record, key, value, resource))

  record
end

#form_field_labelObject



300
301
302
# File 'lib/avo/fields/base_field.rb', line 300

def form_field_label
  id
end

#has_attribute?(record, attribute) ⇒ Boolean

Returns:

  • (Boolean)


238
239
240
# File 'lib/avo/fields/base_field.rb', line 238

def has_attribute?(record, attribute)
  record.methods.include? attribute.to_sym
end

#has_own_panel?Boolean

Returns:

  • (Boolean)


249
250
251
# File 'lib/avo/fields/base_field.rb', line 249

def has_own_panel?
  false
end

#hidden_in_reflection?Boolean

Returns:

  • (Boolean)


279
280
281
# File 'lib/avo/fields/base_field.rb', line 279

def hidden_in_reflection?
  !visible_in_reflection?
end

#metaObject



304
305
306
# File 'lib/avo/fields/base_field.rb', line 304

def meta
  Avo::ExecutionContext.new(target: @meta, record: record, resource: @resource, view: @view).handle
end

#nameObject

Getting the name of the resource (user/users, post/posts) We’ll first check to see if the user passed a name Secondly we’ll try to find a translation key We’ll fallback to humanizing the id



136
137
138
139
140
141
142
143
144
# File 'lib/avo/fields/base_field.rb', line 136

def name
  if custom_name?
    Avo::ExecutionContext.new(target: @name).handle
  elsif translation_key
    translated_name default: default_name
  else
    default_name
  end
end

#options_for_filterObject



283
284
285
# File 'lib/avo/fields/base_field.rb', line 283

def options_for_filter
  options
end

#parentObject



308
309
310
# File 'lib/avo/fields/base_field.rb', line 308

def parent
  @parent ||= fetch_parent
end

#placeholderObject



168
169
170
# File 'lib/avo/fields/base_field.rb', line 168

def placeholder
  Avo::ExecutionContext.new(target: @placeholder || name, record: record, resource: @resource, view: @view).handle
end

#plural_nameObject



146
147
148
149
150
151
152
153
154
# File 'lib/avo/fields/base_field.rb', line 146

def plural_name
  default = name.pluralize

  if translation_key
    translated_plural_name default: default
  else
    default
  end
end

#record_errorsObject



261
262
263
# File 'lib/avo/fields/base_field.rb', line 261

def record_errors
  record.present? ? record.errors : {}
end

#resolve_attribute(value) ⇒ Object



253
254
255
# File 'lib/avo/fields/base_field.rb', line 253

def resolve_attribute(value)
  value
end

#table_header_labelObject



156
157
158
# File 'lib/avo/fields/base_field.rb', line 156

def table_header_label
  @table_header_label ||= name
end

#to_permitted_paramObject



257
258
259
# File 'lib/avo/fields/base_field.rb', line 257

def to_permitted_param
  id.to_sym
end

#translated_name(default:) ⇒ Object



124
125
126
# File 'lib/avo/fields/base_field.rb', line 124

def translated_name(default:)
  t(translation_key, count: 1, default: default).humanize
end

#translated_plural_name(default:) ⇒ Object



128
129
130
# File 'lib/avo/fields/base_field.rb', line 128

def translated_plural_name(default:)
  t(translation_key, count: 2, default: default).humanize
end

#translation_keyObject



120
121
122
# File 'lib/avo/fields/base_field.rb', line 120

def translation_key
  @translation_key || "avo.field_translations.#{@id}"
end

#typeObject



265
266
267
# File 'lib/avo/fields/base_field.rb', line 265

def type
  @type ||= self.class.name.demodulize.to_s.underscore.gsub("_field", "")
end

#updatableObject



287
288
289
# File 'lib/avo/fields/base_field.rb', line 287

def updatable
  !is_disabled? && visible?
end

#value(property = nil) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/avo/fields/base_field.rb', line 174

def value(property = nil)
  return @value if @value.present?

  property ||= attribute_id

  # Get record value
  final_value = @record.send(property) if is_model?(@record) && @record.respond_to?(property)

  # On new views and actions modals we need to prefill the fields with the default value if value is nil
  if final_value.nil? && should_fill_with_default_value? && @default.present?
    final_value = computed_default_value
  end

  # Run computable callback block if present
  if computable && @block.present?
    final_value = execute_context(@block)
  end

  # Format value based on available formatter
  final_value = format_value(final_value)

  if @decorate.present? && @view.display?
    final_value = execute_context(@decorate, value: final_value)
  end

  final_value
end

#visible_in_reflection?Boolean

Returns:

  • (Boolean)


275
276
277
# File 'lib/avo/fields/base_field.rb', line 275

def visible_in_reflection?
  true
end