Class: UI::Dropdown

Inherits:
Base
  • Object
show all
Defined in:
app/views/ui/dropdown.rb

Defined Under Namespace

Classes: Item

Constant Summary

Constants inherited from Base

Base::TAILWIND_MERGER

Instance Method Summary collapse

Methods inherited from Base

#before_template

Constructor Details

#initialize(**props) ⇒ Dropdown

Returns a new instance of Dropdown.



10
11
12
13
14
15
# File 'app/views/ui/dropdown.rb', line 10

def initialize(**props)
  super
  @items = []
  @trigger_block = nil
  @action_block = nil
end

Instance Method Details

#action(&block) ⇒ Object



22
23
24
25
# File 'app/views/ui/dropdown.rb', line 22

def action(&block)
  @action_block = block if block_given?
  nil
end

#item(href:, icon: nil, trailing_icon: nil, method: :get, &block) ⇒ Object



17
18
19
20
# File 'app/views/ui/dropdown.rb', line 17

def item(href:, icon: nil, trailing_icon: nil, method: :get, &block)
  @items << {href:, icon:, trailing_icon:, method:, block:}
  nil
end

#trigger(class: nil, &block) ⇒ Object



27
28
29
30
31
# File 'app/views/ui/dropdown.rb', line 27

def trigger(class: nil, &block)
  @trigger_block = block
  @trigger_classes = grab(class:)
  nil
end

#view_template(&block) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/views/ui/dropdown.rb', line 33

def view_template(&block)
  vanish(&block) if block_given?

  div(data: {controller: "dropdown", dropdown_offset_value: offset, dropdown_placement_value: placement}, class: classes) do
    render_trigger

    div(
      data: {
        dropdown_target: "menu",
        transition_enter_from: "opacity-0 scale-95",
        transition_enter_to: "opacity-100 scale-100",
        transition_leave_from: "opacity-100 scale-100",
        transition_leave_to: "opacity-0 scale-95"
      },
      class:
        "hidden transition transform origin-top-left absolute left-0 top-0 z-50"
    ) do
      div(class: "w-64 bg-white shadow-xs border border-gray-300
      inline-flex flex-col justify-start items-start overflow-hidden") do
        render_heading

        div(class: "w-full flex flex-col justify-start items-start gap-1") do
          @items.each do |item_data|
            render Dropdown::Item.new(
              **item_data.except(:block),
              &item_data[:block]
            )
          end
        end
      end
    end
  end
end