Sha256: aae5496d6c2b03cbbd07c4d21f173d176b8a1bccfe1c3742962bad25682e054f

Contents?: true

Size: 1.61 KB

Versions: 3

Compression:

Stored size: 1.61 KB

Contents

module Seiten
  module HTML
    class Navigation
      attr_reader :body

      def initialize(view_context, navigation:, parent_id: nil, current_page: nil, deep: 2, html: {})
        @view_context = view_context
        @start_depth = deep
        @html_options = Seiten.config[:html].deep_merge(html || {})
        @current_page = current_page
        @body = build_navigation(navigation, parent_id: parent_id, deep: deep)
      end

      private

      def build_navigation(navigation, parent_id:, deep:)
        wrapper_class = @start_depth != deep ? :nodes : nil

        return unless deep.positive?

        @view_context.content_tag(:ul, class: Seiten::HTML::Helpers.build_classes(wrapper_class, class_options: @html_options[:navigation], modifier_options: @html_options[:modifier])) do
          pages = navigation.pages.where(parent_id: parent_id).map do |page|
            children = build_navigation(navigation, parent_id: page.id, deep: deep - 1) if page.children?
            build_page_element(page, children)
          end
          @view_context.safe_join(pages)
        end
      end

      def build_page_element(page, children)
        modifiers = Seiten::HTML::Helpers.build_page_modifiers(page, @current_page)
        classes   = Seiten::HTML::Helpers.build_classes(:item, modifiers: modifiers, merge: page.html_options[:class], class_options: @html_options[:navigation], modifier_options: @html_options[:modifier])
        @view_context.content_tag(:li, page.html_options.merge(class: classes)) do
          @view_context.safe_join([@view_context.link_to_seiten_page(page), children])
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
seiten-1.0.2 lib/seiten/html/navigation.rb
seiten-1.0.1 lib/seiten/html/navigation.rb
seiten-1.0.0 lib/seiten/html/navigation.rb