Class: RubyUIAdmin::Fields::BaseField

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_ui_admin/fields/base_field.rb

Overview

Base class for all field types. Fields are pure data/metadata objects; the actual rendering lives in Phlex components (app/components/ruby_ui_admin/fields).

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, resource: nil, **options, &block) ⇒ BaseField

Returns a new instance of BaseField.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 21

def initialize(id, resource: nil, **options, &block)
  @id = id.to_sym
  @resource = resource
  @options = options
  @block = block

  @name = options[:name]
  @required = options.fetch(:required, false)
  @readonly = options.fetch(:readonly, false)
  @sortable = options.fetch(:sortable, false)
  @filterable = options.fetch(:filterable, false)
  @link_to_record = options.fetch(:link_to_record, false)
  @format_using = options[:format_using]
  @help = options[:help]
  @description = options[:description]
  @visible = options[:visible]
  @placeholder = options[:placeholder]
  @default = options[:default]
  @only_on = normalize_views(options[:only_on])
  @hide_on = normalize_views(options[:hide_on])
end

Instance Attribute Details

#blockObject (readonly)

Returns the value of attribute block.



8
9
10
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 8

def block
  @block
end

#idObject (readonly)

Returns the value of attribute id.



8
9
10
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 8

def id
  @id
end

#optionsObject (readonly)

Returns the value of attribute options.



8
9
10
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 8

def options
  @options
end

#resourceObject

Returns the value of attribute resource.



9
10
11
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 9

def resource
  @resource
end

Class Method Details

.field_typeObject



17
18
19
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 17

def self.field_type
  @field_type
end

.register_as(key) ⇒ Object

Registers the field under a DSL symbol, e.g. register_as :text.



12
13
14
15
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 12

def self.register_as(key)
  @field_type = key.to_sym
  Fields.register(key, self)
end

Instance Method Details

#database_idObject

The underlying attribute name on the model (overridable by subclasses, e.g. belongs_to appends _id).



67
68
69
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 67

def database_id
  id
end

#default_hidden_viewsObject

Views where a field type is hidden unless only_on/hide_on say otherwise. Overridden by heavy/association fields (e.g. has_many hides everywhere but show).



182
183
184
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 182

def default_hidden_views
  []
end

#default_value(record = nil) ⇒ Object

The field's default for a new record (literal or a proc evaluated with record, resource and current_user available).



140
141
142
143
144
145
146
147
148
149
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 140

def default_value(record = nil)
  return @default unless @default.respond_to?(:call)

  ExecutionContext.new(
    target: @default,
    record: record,
    resource: resource,
    current_user: resource&.user
  ).handle
end

#descriptionObject



57
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 57

def description = @description

#fill(record, attributes) ⇒ Object

Applies the submitted (permitted) attributes to the record for this field. Default just assigns permitted_param; fields with extra inputs override (e.g. file remove).



129
130
131
132
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 129

def fill(record, attributes)
  key = permitted_param.to_s
  fill_value(record, attributes[key]) if attributes.key?(key)
end

#fill_value(record, value) ⇒ Object

Assigns a submitted value back onto the record.



105
106
107
108
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 105

def fill_value(record, value)
  setter = "#{database_id}="
  record.public_send(setter, value) if record.respond_to?(setter)
end

#filterable?Boolean

Returns:

  • (Boolean)


62
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 62

def filterable? = !!@filterable

#formatted_value(record, view_context: nil) ⇒ Object

Value formatted for display.



90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 90

def formatted_value(record, view_context: nil)
  raw = value(record, view_context: view_context)
  return raw if @format_using.nil?

  ExecutionContext.new(
    target: @format_using,
    value: raw,
    record: record,
    resource: resource,
    current_user: resource&.user,
    view_context: view_context
  ).handle
end

#has_default?Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 134

def has_default?
  !@default.nil?
end

#helpObject



56
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 56

def help = @help

Returns:

  • (Boolean)


63
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 63

def link_to_record? = !!@link_to_record

#nameObject



47
48
49
50
51
52
53
54
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 47

def name
  return @name if @name

  model = resource&.model_class
  # Uses the model's i18n attribute name (activerecord.attributes.*),
  # falling back to a humanized id.
  model.respond_to?(:human_attribute_name) ? model.human_attribute_name(id) : id.to_s.humanize
end

#permit_paramObject

The strong-parameters fragment for this field (scalar by default; fields with hash/array values override, e.g. boolean_group -> { name => {} }, files -> { name => [] }).



117
118
119
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 117

def permit_param
  permitted_param
end

#permit_paramsObject

All strong-params fragments this field contributes. Defaults to a single permit_param; fields that read extra inputs (e.g. a file field's remove checkbox) return more.



123
124
125
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 123

def permit_params
  [permit_param]
end

#permitted_paramObject

Which form param this field reads/writes.



111
112
113
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 111

def permitted_param
  database_id
end

#placeholderObject



58
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 58

def placeholder = @placeholder

#readonly?Boolean

Returns:

  • (Boolean)


60
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 60

def readonly? = !!@readonly

#required?Boolean

Returns:

  • (Boolean)


59
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 59

def required? = !!@required

#sort_lambdaObject

Whether the field can be sorted, and the column/expression to sort by. sortable: true sorts by the database column; sortable: ->{...} is custom.



188
189
190
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 188

def sort_lambda
  @sortable.respond_to?(:call) ? @sortable : nil
end

#sortable?Boolean

Returns:

  • (Boolean)


61
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 61

def sortable? = !!@sortable

#typeObject



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

def type
  self.class.field_type
end

#value(record, view_context: nil) ⇒ Object

Raw value read from the record (or computed via a block). When a view_context is given, the computed block can use view/url helpers (link_to, main_app, …).



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 73

def value(record, view_context: nil)
  return nil if record.nil?

  if block
    ExecutionContext.new(
      target: block,
      record: record,
      resource: resource,
      current_user: resource&.user,
      view_context: view_context
    ).handle
  elsif record.respond_to?(id)
    record.public_send(id)
  end
end

#visible?(view: nil, record: nil) ⇒ Boolean

Conditional visibility (visible: -> { current_user.admin? }), evaluated with view/record/resource/current_user. A literal is used as-is. Defaults to visible.

Returns:

  • (Boolean)


153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 153

def visible?(view: nil, record: nil)
  return true if @visible.nil?

  result =
    if @visible.respond_to?(:call)
      ExecutionContext.new(
        target: @visible,
        view: View.wrap(view),
        record: record,
        resource: resource,
        current_user: resource&.user
      ).handle
    else
      @visible
    end

  !!result
end

#visible_in_view?(view) ⇒ Boolean

Returns:

  • (Boolean)


172
173
174
175
176
177
178
# File 'lib/ruby_ui_admin/fields/base_field.rb', line 172

def visible_in_view?(view)
  view = view.to_sym
  return @only_on.include?(view) if @only_on
  return !@hide_on.include?(view) if @hide_on

  !default_hidden_views.include?(view)
end