Class: PandaCms::MenuComponent

Inherits:
ViewComponent::Base
  • Object
show all
Defined in:
app/components/panda_cms/menu_component.rb

Instance Method Summary collapse

Constructor Details

#initialize(name:, current_path: "", styles: {}, render_page_menu: false, page_menu_styles: {}) ⇒ void

Renders the menu item and its children

Parameters:

  • name (String)

    The name of the menu

  • current_path (String) (defaults to: "")

    The current path of the request (request.path)

  • styles (Hash) (defaults to: {})

    The CSS classes to apply to the menu items, containing “default”, “inactive” and “active” keys. The “default” key is applied to all menu items. “inactive” and “active” are set based on the current path.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/components/panda_cms/menu_component.rb', line 15

def initialize(name:, current_path: "", styles: {}, render_page_menu: false, page_menu_styles: {})
  @menu = PandaCms::Menu.find_by(name: name)
  @menu_items = @menu.menu_items
  @menu_items = @menu_items.where("depth <= ?", @menu.depth) if @menu.depth
  @menu_items = @menu_items.order(:lft)
  @current_path = current_path.to_s
  @render_page_menu = render_page_menu

  @menu_items = @menu_items.order(:lft).map do |menu_item|
    if is_active?(menu_item)
      menu_item.define_singleton_method(:css_classes) { styles[:default] + " " + styles[:active] }
    else
      menu_item.define_singleton_method(:css_classes) { styles[:default] + " " + styles[:inactive] }
    end

    menu_item
  end

  # TODO: Surely don't need this but Current.page isn't working in the component
  if @render_page_menu
    @current_page = PandaCms::Page.find_by(path: @current_path)
    @page_menu_styles = page_menu_styles
  end
end

Instance Method Details

#active_link?(path, match: :starts_with) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
52
53
54
# File 'app/components/panda_cms/menu_component.rb', line 46

def active_link?(path, match: :starts_with)
  if match == :starts_with
    return @current_path.starts_with?(path)
  elsif match == :exact
    return (@current_path == path)
  end

  false
end

#is_active?(menu_item) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
44
# File 'app/components/panda_cms/menu_component.rb', line 40

def is_active?(menu_item)
  return true if @current_path == "/" && active_link?(menu_item.page.path, match: :exact)
  return true if menu_item.page.path != "/" && active_link?(menu_item.page.path, match: :starts_with)
  false
end