Class: Optics::ApplicationViewComponent

Inherits:
ViewComponent::Base
  • Object
show all
Defined in:
app/components/optics/application_view_component.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**attributes) ⇒ ApplicationViewComponent

Returns a new instance of ApplicationViewComponent.



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/components/optics/application_view_component.rb', line 33

def initialize(**attributes)
  super

  initialize_instance_variables(required_attributes, attributes) do |key, _default|
    raise ArgumentError, "Missing keyword: :#{key}"
  end

  initialize_instance_variables(optional_attributes, attributes) do |key, default|
    instance_variable_set("@#{key}", default)
  end

  @attributes = attributes.except(*optional_attributes.keys, *required_attributes.keys)
end

Class Attribute Details

.allow_db_queriesObject Also known as: allow_db_queries?

To allow DB queries, put this in the class definition: self.allow_db_queries = true



11
12
13
# File 'app/components/optics/application_view_component.rb', line 11

def allow_db_queries
  @allow_db_queries
end

Class Method Details

.accepts(parameter, default: nil) ⇒ Object



20
21
22
23
24
# File 'app/components/optics/application_view_component.rb', line 20

def accepts(parameter, default: nil)
  optional_attributes[parameter] = default

  attr_reader parameter
end

.inherited(subclass) ⇒ Object



26
27
28
29
30
# File 'app/components/optics/application_view_component.rb', line 26

def inherited(subclass)
  subclass.optional_attributes = optional_attributes.dup
  subclass.required_attributes = required_attributes.dup
  super
end

.requires(parameter, default: nil) ⇒ Object



14
15
16
17
18
# File 'app/components/optics/application_view_component.rb', line 14

def requires(parameter, default: nil)
  required_attributes[parameter] = default

  attr_reader parameter
end

Instance Method Details

#class_for(name) ⇒ Object



47
48
49
# File 'app/components/optics/application_view_component.rb', line 47

def class_for(name)
  "c--#{identifier}--#{name}"
end

#class_names(*args) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'app/components/optics/application_view_component.rb', line 60

def class_names(*args) # rubocop:disable Metrics/MethodLength
  [].tap do |classes|
    args.each do |class_name|
      case class_name
      when String
        classes << class_name
      when Hash
        class_name.each do |key, val|
          classes << key if val
        end
      end
    end

    classes.compact!
    classes.uniq!
  end
end

#class_names_for(*args) ⇒ Object



55
56
57
# File 'app/components/optics/application_view_component.rb', line 55

def class_names_for(*args)
  class_names(*args).map { |name| class_for(name) }.join(' ')
end

#container_classObject



51
52
53
# File 'app/components/optics/application_view_component.rb', line 51

def container_class
  "c--#{identifier}"
end

#data_for(method:, target:) ⇒ Object

Helper for Stimulus data attributes



84
85
86
# File 'app/components/optics/application_view_component.rb', line 84

def data_for(method:, target:)
  data_method(method).merge(data_target(target))
end

#data_method(method, event: 'click') ⇒ Object

Helper for Stimulus controller method



89
90
91
# File 'app/components/optics/application_view_component.rb', line 89

def data_method(method, event: 'click')
  { action: "#{event}->#{identifier}##{method}" }
end

#data_target(target) ⇒ Object

Helper for Stimulus controller target



94
95
96
# File 'app/components/optics/application_view_component.rb', line 94

def data_target(target)
  { "#{identifier}": { target: } }
end

#data_values(values) ⇒ Object

Helper for Stimulus controller value



99
100
101
102
103
# File 'app/components/optics/application_view_component.rb', line 99

def data_values(values)
  values.transform_keys do |key|
    "#{identifier}-#{key}-value"
  end
end

#identifierObject

Used by Stimulus. E.g. data-controller=identifier => data-controller=‘dynamic-form–field’



79
80
81
# File 'app/components/optics/application_view_component.rb', line 79

def identifier
  @identifier ||= self.class.name.sub('::Component', '').underscore.gsub('_', '-').gsub('/', '--')
end