|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +module Vident |
| 4 | + module ChildElementHelper |
| 5 | + def child_element( |
| 6 | + tag_name, |
| 7 | + stimulus_controllers: nil, |
| 8 | + stimulus_targets: nil, |
| 9 | + stimulus_actions: nil, |
| 10 | + stimulus_outlets: nil, |
| 11 | + stimulus_values: nil, |
| 12 | + stimulus_classes: nil, |
| 13 | + stimulus_controller: nil, |
| 14 | + stimulus_target: nil, |
| 15 | + stimulus_action: nil, |
| 16 | + stimulus_outlet: nil, |
| 17 | + stimulus_value: nil, |
| 18 | + stimulus_class: nil, |
| 19 | + **options, |
| 20 | + &block |
| 21 | + ) |
| 22 | + child_element_attribute_must_be_collection!(stimulus_controllers, "stimulus_controllers") |
| 23 | + child_element_attribute_must_be_collection!(stimulus_targets, "stimulus_targets") |
| 24 | + child_element_attribute_must_be_collection!(stimulus_actions, "stimulus_actions") |
| 25 | + child_element_attribute_must_be_collection!(stimulus_outlets, "stimulus_outlets") |
| 26 | + child_element_attribute_must_be_collection!(stimulus_values, "stimulus_values") |
| 27 | + child_element_attribute_must_be_collection!(stimulus_classes, "stimulus_classes") |
| 28 | + |
| 29 | + stimulus_controllers_collection = send(:stimulus_controllers, *child_element_wrap_single_stimulus_attribute(stimulus_controllers, stimulus_controller)) |
| 30 | + stimulus_targets_collection = send(:stimulus_targets, *child_element_wrap_single_stimulus_attribute(stimulus_targets, stimulus_target)) |
| 31 | + stimulus_actions_collection = send(:stimulus_actions, *child_element_wrap_single_stimulus_attribute(stimulus_actions, stimulus_action)) |
| 32 | + stimulus_outlets_collection = send(:stimulus_outlets, *child_element_wrap_single_stimulus_attribute(stimulus_outlets, stimulus_outlet)) |
| 33 | + stimulus_values_collection = send(:stimulus_values, stimulus_values || stimulus_value) |
| 34 | + stimulus_classes_collection = send(:stimulus_classes, stimulus_classes || stimulus_class) |
| 35 | + |
| 36 | + stimulus_data_attributes = StimulusDataAttributeBuilder.new( |
| 37 | + controllers: stimulus_controllers_collection, |
| 38 | + actions: stimulus_actions_collection, |
| 39 | + targets: stimulus_targets_collection, |
| 40 | + outlets: stimulus_outlets_collection, |
| 41 | + values: stimulus_values_collection, |
| 42 | + classes: stimulus_classes_collection |
| 43 | + ).build |
| 44 | + generate_child_element(tag_name, stimulus_data_attributes, options, &block) |
| 45 | + end |
| 46 | + |
| 47 | + private |
| 48 | + |
| 49 | + def child_element_attribute_must_be_collection!(collection, name) |
| 50 | + return unless collection |
| 51 | + raise ArgumentError, "'#{name}:' must be an enumerable. Did you mean '#{name.to_s.singularize}:'?" unless collection.is_a?(Enumerable) |
| 52 | + end |
| 53 | + |
| 54 | + def child_element_wrap_single_stimulus_attribute(plural, singular) |
| 55 | + return plural if plural |
| 56 | + singular.nil? ? nil : [singular] |
| 57 | + end |
| 58 | + |
| 59 | + def generate_child_element(tag_name, stimulus_data_attributes, options, &block) |
| 60 | + raise NoMethodError, "Not implemented" |
| 61 | + end |
| 62 | + end |
| 63 | +end |
0 commit comments