Sha256: 6c813412a48d6d7b5dce2e3ce274302a25bf4e302df1d2ca33a40db8cecd8130

Contents?: true

Size: 1.93 KB

Versions: 3

Compression:

Stored size: 1.93 KB

Contents

# frozen_string_literal: true

module Decidim
  # A presenter to render menu items
  class MenuItemPresenter
    #
    # Initializes a menu item for presentation
    #
    # @param menu_item [MenuItem] The menu item itself
    # @param view [ActionView::Base] The view instance to help rendering the item
    # @param options [Hash] The rendering options for the item
    #
    # @option options [String] :element_class
    #         The CSS class to be used for the item
    #
    # @option options [String] :active_class
    #         The CSS class to be used for the active item
    #
    def initialize(menu_item, view, options = {})
      @menu_item = menu_item
      @view = view
      @options = OpenStruct.new(options)
    end

    delegate :label, :url, :active, :icon_name, to: :@menu_item
    delegate :content_tag, :safe_join, :link_to, :active_link_to_class, :is_active_link?, :icon, to: :@view

    def render
      content_tag :li, role: :menuitem, class: link_wrapper_classes do
        output = if url == "#"
                   [content_tag(:span, composed_label, class: "sidebar-menu__item-disabled")]
                 else
                   [link_to(composed_label, url, link_options)]
                 end
        output.push(@view.send(:simple_menu, **@menu_item.submenu).render) if @menu_item.submenu

        safe_join(output)
      end
    end

    def active?
      is_active_link?(url, active)
    end

    private

    def link_options
      if active?
        { aria: { current: "page" } }
      else
        {}
      end
    end

    def composed_label
      icon_name.present? ? icon(icon_name) + label : label
    end

    def link_wrapper_classes
      return @options.element_class unless is_active_link?(url, active)

      [@options.element_class, active_class].compact.join(" ")
    end

    def active_class
      active_link_to_class(
        url,
        active:,
        class_active: @options.active_class
      )
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
decidim-core-0.29.1 app/presenters/decidim/menu_item_presenter.rb
decidim-core-0.28.4 app/presenters/decidim/menu_item_presenter.rb
decidim-core-0.29.0 app/presenters/decidim/menu_item_presenter.rb