Sha256: cae8f827cd4fa511122e5b8f1726295ec62b95262e4848e214a5381b4c56062e

Contents?: true

Size: 1.99 KB

Versions: 3

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

module PandaCms
  class MenuComponent < ViewComponent::Base
    #
    # Renders the menu item and its children
    #
    # @param [String] name The name of the menu
    # @param [String] current_path The current path of the request (request.path)
    # @param [Hash] styles
    #  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.
    # @return [void]
    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

    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

    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
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
panda_cms-0.6.3 app/components/panda_cms/menu_component.rb
panda_cms-0.6.2 app/components/panda_cms/menu_component.rb
panda_cms-0.6.1 app/components/panda_cms/menu_component.rb