fiedl/your_platform

View on GitHub
app/models/horizontal_nav.rb

Summary

Maintainability
A
45 mins
Test Coverage
class HorizontalNav
  def initialize(args)
    @user = args[:user]
    @current_navable = args[:current_navable]
    @current_home_page = args[:current_home_page]
  end

  def self.for_user(user, args = {})
    self.new(args.merge({ user: user }))
  end

  def link_objects
    navables.to_a
  end

  def navables
    if logged_in?
      intranet_navables
    else
      public_navables.select { |navable| not navable.nav_node.hidden_menu? }
    end
  end

  def intranet_navables
    [ Page.find_intranet_root ] + (@user.try(:current_corporations) || [])
  end

  def public_navables
    if current_home_page
      pages = [current_home_page]
      if current_home_page.respond_to? :horizontal_nav_child_pages
        pages += current_home_page.horizontal_nav_child_pages
      else
        pages += current_home_page.child_pages.where(type: [nil, 'Page', 'Blog'])
      end

      # Sort by the persisted order.
      # http://stackoverflow.com/a/7790994/2066546
      if current_home_page.respond_to?(:settings) && current_home_page.settings.horizontal_nav_page_id_order.kind_of?(Array)
        pages_by_id = Hash[pages.map { |p| [p.id, p] }]
        pages = (pages_by_id.values_at(*current_home_page.settings.horizontal_nav_page_id_order) + pages).uniq
      end

      # Filter "new page" element (id: nil) and hidden pages.
      pages = pages.select { |page| page.try(:id) && page.show_in_menu? }

      return pages
    else
      return []
    end
  end

  def currently_in_intranet?
    current_navable.try(:in_intranet?)
  end

  def current_navable
    @current_navable
  end

  def current_home_page
    @current_home_page || Page.root
  end

  def breadcrumb_root
    @breadcrumb_root ||= current_navable.try(:nav_node).try(:breadcrumb_root).try(:reload)
  end

  def logged_in?
    return true if @user
  end
end