Completed
Push — master ( c94e19...3d0615 )
by Yoh
53s
created

client/hyalite/event_plugin/change_event_plugin.rb (2 issues)

1
module Hyalite
2
  class ChangeEventPlugin
3
    EVENT_TYPES = {
4
      change: {
5
        phasedRegistrationNames: {
6
          bubbled: "onChange",
7
          captured: "onChangeCapture"
8
        },
9
        dependencies: [
10
          :topBlur,
11
          :topChange,
12
          :topClick,
13
          :topFocus,
14
          :topInput,
15
          :topKeyDown,
16
          :topKeyUp,
17
          :topSelectionChange
18
        ]
19
      }
20
    }
21
22
    SUPPORTED_INPUT_TYPES = [
23
      'color',
24
      'date',
25
      'datetime',
26
      'datetime-local',
27
      'email',
28
      'month',
29
      'number',
30
      'password',
31
      'range',
32
      'search',
33
      'tel',
34
      'text',
35
      'time',
36
      'url',
37
      'week'
38
    ]
39
40
    def event_types
41
      EVENT_TYPES
42
    end
43
44 View Code Duplication
    def is_text_input_element(elem)
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
45
      node_name = elem.node_name.downcase
46
      (node_name == 'input' && SUPPORTED_INPUT_TYPES.include?(elem.input_type)) || node_name == 'textarea'
47
    end
48
49
    def should_use_change_event(elem)
50
      node_name = elem.node_name.downcase
51
      node_name == 'select' || (node_name == 'input' && elem.input_type == 'file')
52
    end
53
54 View Code Duplication
    def should_use_click_event(elem)
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
55
      elem.node_name.downcase == 'input' && %w(checkbox radio).include?(elem.input_type)
56
    end
57
58
    def extract_event(top_level_type, top_level_target, top_level_target_id, event)
59
      if should_use_change_event(top_level_target)
60
        target_id = top_level_target_id if top_level_type == :topChange
61
      elsif is_text_input_element(top_level_target)
62
        target_id = top_level_target_id if top_level_type == :topInput
63
      elsif should_use_click_event(top_level_target)
64
        target_id = top_level_target_id if top_level_type == :topClick
65
      end
66
67
      if target_id
68
        SyntheticEvent.new(event).tap do |synthetic_event|
69
          InstanceHandles.traverse_two_phase(target_id) do |target_id, upwards|
70
            listener = BrowserEvent.listener_at_phase(target_id, EVENT_TYPES[:change], upwards ? :bubbled : :captured)
71
            synthetic_event.add_listener(listener, target_id) if listener
72
          end
73
        end
74
      end
75
    end
76
  end
77
end
78