Class: Avo::Fields::BaseField

Inherits:
Object
  • Object
show all
Extended by:
ActiveSupport::DescendantsTracker, FieldExtensions::HasFieldName
Includes:
ActionView::Helpers::UrlHelper, Concerns::HandlesFieldArgs, Concerns::HasHTMLAttributes, Concerns::IsResourceItem, Concerns::HasDefault, Concerns::IsReadonly, Concerns::IsRequired, FieldExtensions::VisibleInDifferentViews
Defined in:
lib/avo/fields/base_field.rb

Instance Attribute Summary collapse

Attributes included from Concerns::HasHTMLAttributes

#html

Attributes included from FieldExtensions::VisibleInDifferentViews

#show_on_edit, #show_on_index, #show_on_new, #show_on_show

Instance Method Summary collapse

Methods included from FieldExtensions::HasFieldName

field_name, get_field_name

Methods included from Concerns::HasDefault

#computed_default_value

Methods included from Concerns::IsReadonly

#is_readonly?

Methods included from Concerns::IsRequired

#is_required?

Methods included from Concerns::HasHTMLAttributes

#get_html

Methods included from FieldExtensions::VisibleInDifferentViews

#except_on, #hide_on, #only_on, #show_on, #show_on_create, #show_on_update, #visible_on?

Methods included from Concerns::IsResourceItem

#is_field?, #is_main_panel?, #is_panel?, #is_sidebar?, #is_tab?, #is_tab_group?, #is_tool?

Constructor Details

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

Returns a new instance of BaseField.



58
59
60
61
62
63
64
65
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
# File 'lib/avo/fields/base_field.rb', line 58

def initialize(id, **args, &block)
  super(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
  @sortable = args[:sortable] || false
  @nullable = args[:nullable] || false
  @null_values = args[:null_values] || [nil, ""]
  @format_using = args[:format_using] || nil
  @placeholder = args[:placeholder]
  @help = args[:help] || nil
  @default = args[:default] || nil
  @visible = args[:visible] || true
  @as_label = args[:as_label] || false
  @as_avatar = args[:as_avatar] || false
  @as_description = args[:as_description] || false
  @index_text_align = args[:index_text_align] || :left
  @html = args[:html] || nil
  @view = args[:view] || nil
  @value = args[:value] || nil
  @stacked = args[:stacked] || nil

  @args = args

  @updatable = !readonly
  @computable = true
  @computed = block.present?
  @computed_value = nil

  # Set the visibility
  show_on args[:show_on] if args[:show_on].present?
  hide_on args[:hide_on] if args[:hide_on].present?
  only_on args[:only_on] if args[:only_on].present?
  except_on args[:except_on] if args[:except_on].present?
end

Instance Attribute Details

#actionObject (readonly)

Returns the value of attribute action.



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

def action
  @action
end

#as_avatarObject (readonly)

Returns the value of attribute as_avatar.



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

def as_avatar
  @as_avatar
end

#as_descriptionObject (readonly)

Returns the value of attribute as_description.



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

def as_description
  @as_description
end

#as_labelObject (readonly)

Returns the value of attribute as_label.



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

def as_label
  @as_label
end

#blockObject (readonly)

Returns the value of attribute block.



25
26
27
# File 'lib/avo/fields/base_field.rb', line 25

def block
  @block
end

#computableObject (readonly)

if allowed to be computable



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

def computable
  @computable
end

#computedObject (readonly)

if block is present



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

def computed
  @computed
end

#computed_valueObject (readonly)

the value after computation



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

def computed_value
  @computed_value
end

#defaultObject (readonly)

Returns the value of attribute default.



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

def default
  @default
end

#format_usingObject (readonly)

Returns the value of attribute format_using.



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

def format_using
  @format_using
end

#helpObject (readonly)

Returns the value of attribute help.



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

def help
  @help
end

#idObject (readonly)

Returns the value of attribute id.



24
25
26
# File 'lib/avo/fields/base_field.rb', line 24

def id
  @id
end

#index_text_alignObject (readonly)

Returns the value of attribute index_text_align.



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

def index_text_align
  @index_text_align
end

#modelObject (readonly)

Hydrated payload



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

def model
  @model
end

#null_valuesObject (readonly)

Returns the value of attribute null_values.



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

def null_values
  @null_values
end

#nullableObject (readonly)

Returns the value of attribute nullable.



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

def nullable
  @nullable
end

#panel_nameObject (readonly)

Returns the value of attribute panel_name.



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

def panel_name
  @panel_name
end

#readonlyObject (readonly)

Returns the value of attribute readonly.



27
28
29
# File 'lib/avo/fields/base_field.rb', line 27

def readonly
  @readonly
end

#requiredObject (readonly)

Returns the value of attribute required.



26
27
28
# File 'lib/avo/fields/base_field.rb', line 26

def required
  @required
end

#resourceObject (readonly)

Returns the value of attribute resource.



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

def resource
  @resource
end

#sortableObject (readonly)

Returns the value of attribute sortable.



28
29
30
# File 'lib/avo/fields/base_field.rb', line 28

def sortable
  @sortable
end

#stackedObject (readonly)

Returns the value of attribute stacked.



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

def stacked
  @stacked
end

#updatableObject (readonly)

Private options



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

def updatable
  @updatable
end

#userObject (readonly)

Returns the value of attribute user.



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

def user
  @user
end

#viewObject (readonly)

Returns the value of attribute view.



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

def view
  @view
end

#visibleObject (readonly)

Returns the value of attribute visible.



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

def visible
  @visible
end

Instance Method Details

#component_for_view(view = :index) ⇒ Object

Try and build the component class or fallback to a blank one



219
220
221
222
223
224
225
226
227
228
229
# File 'lib/avo/fields/base_field.rb', line 219

def component_for_view(view = :index)
  # Use the edit variant for all "update" views
  view = :edit if view.in? [:new, :create, :update]

  component_class = "::Avo::Fields::#{view_component_name}::#{view.to_s.camelize}Component"
  component_class.constantize
rescue
  # When returning nil, a race condition happens and throws an error in some environments.
  # See https://github.com/avo-hq/avo/pull/365
  ::Avo::BlankFieldComponent
end

#custom?Boolean

Returns:

  • (Boolean)


241
242
243
244
245
# File 'lib/avo/fields/base_field.rb', line 241

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

#custom_name?Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/avo/fields/base_field.rb', line 139

def custom_name?
  @name.present?
end

#database_idObject

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



196
197
198
199
200
# File 'lib/avo/fields/base_field.rb', line 196

def database_id
  foreign_key
rescue
  id
end

#default_nameObject



143
144
145
# File 'lib/avo/fields/base_field.rb', line 143

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

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



187
188
189
190
191
192
193
# File 'lib/avo/fields/base_field.rb', line 187

def fill_field(model, key, value, params)
  return model unless model.methods.include? key.to_sym

  model.send("#{key}=", value)

  model
end

#has_own_panel?Boolean

Returns:

  • (Boolean)


202
203
204
# File 'lib/avo/fields/base_field.rb', line 202

def has_own_panel?
  false
end

#hidden_in_reflection?Boolean

Returns:

  • (Boolean)


251
252
253
# File 'lib/avo/fields/base_field.rb', line 251

def hidden_in_reflection?
  !visible_in_reflection?
end

#hydrate(model: nil, resource: nil, action: nil, view: nil, panel_name: nil, user: nil) ⇒ Object



98
99
100
101
102
103
104
105
106
107
# File 'lib/avo/fields/base_field.rb', line 98

def hydrate(model: nil, resource: nil, action: nil, view: nil, panel_name: nil, user: nil)
  @model = model if model.present?
  @view = view if view.present?
  @resource = resource if resource.present?
  @action = action if action.present?
  @user = user if user.present?
  @panel_name = panel_name if panel_name.present?

  self
end

#model_errorsObject



231
232
233
234
235
# File 'lib/avo/fields/base_field.rb', line 231

def model_errors
  return {} if model.nil?

  model.errors
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



119
120
121
122
123
124
125
126
127
# File 'lib/avo/fields/base_field.rb', line 119

def name
  return @name if custom_name?

  if translation_key && ::Avo::App.translation_enabled
    t(translation_key, count: 1, default: default_name).capitalize
  else
    default_name
  end
end

#placeholderObject



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

def placeholder
  if @placeholder.respond_to?(:call)
    return Avo::Hosts::ResourceViewRecordHost.new(block: @placeholder, record: @model, resource: @resource, view: @view).handle
  end

  @placeholder || name
end

#plural_nameObject



129
130
131
132
133
134
135
136
137
# File 'lib/avo/fields/base_field.rb', line 129

def plural_name
  default = name.pluralize

  if translation_key && ::Avo::App.translation_enabled
    t(translation_key, count: 2, default: default).capitalize
  else
    default
  end
end

#resolve_attribute(value) ⇒ Object



206
207
208
# File 'lib/avo/fields/base_field.rb', line 206

def resolve_attribute(value)
  value
end

#to_permitted_paramObject



210
211
212
# File 'lib/avo/fields/base_field.rb', line 210

def to_permitted_param
  id.to_sym
end

#translation_keyObject



109
110
111
112
113
# File 'lib/avo/fields/base_field.rb', line 109

def translation_key
  return @translation_key if @translation_key.present?

  "avo.field_translations.#{@id}"
end

#typeObject



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

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

#value(property = nil) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/avo/fields/base_field.rb', line 163

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

  property ||= id

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

  # On new views and actions modals we need to prefill the fields with the default value
  if 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 = instance_exec(@model, @resource, @view, self, &block)
  end

  # Run the value through resolver if present
  final_value = instance_exec(final_value, &@format_using) if @format_using.present?

  final_value
end

#view_component_nameObject



214
215
216
# File 'lib/avo/fields/base_field.rb', line 214

def view_component_name
  "#{type.camelize}Field"
end

#visible?Boolean

Returns:

  • (Boolean)


155
156
157
158
159
160
161
# File 'lib/avo/fields/base_field.rb', line 155

def visible?
  if visible.present? && visible.respond_to?(:call)
    visible.call resource: @resource
  else
    visible
  end
end

#visible_in_reflection?Boolean

Returns:

  • (Boolean)


247
248
249
# File 'lib/avo/fields/base_field.rb', line 247

def visible_in_reflection?
  true
end