SpinaCMS/Spina

View on GitHub
app/models/spina/navigation_item.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Spina
  class NavigationItem < ApplicationRecord
    belongs_to :navigation, touch: true, class_name: "Spina::Navigation"
    belongs_to :page, optional: true, class_name: "Spina::Page"
    
    # NavigationItems can be of two different kinds:
    # - A link to a page
    # - A link to a URL
    enum kind: {page: "page", url: "url"}, _suffix: true

    has_ancestry

    scope :regular_pages, -> { joins(:page).where(spina_pages: {resource_id: nil}) }
    scope :sorted, -> { order("spina_navigation_items.position") }
    scope :live, -> { left_outer_joins(:page).where("spina_pages.draft = ? AND spina_pages.active = ? OR spina_pages.id IS NULL", false, true) }
    scope :in_menu, -> { left_outer_joins(:page).where("spina_pages.show_in_menu = ? OR spina_pages.id IS NULL", true) }
    scope :active, -> { left_outer_joins(:page).where("spina_pages.active = ? OR spina_pages.id IS NULL", true) }

    validates :page, uniqueness: {scope: :navigation}, presence: true, if: :page_kind?
    validates :url, presence: true, if: :url_kind?
    validates :url_title, presence: true, if: :url_kind?

    delegate :draft?, :homepage?, to: :page, allow_nil: true

    def menu_title
      return url_title if url_kind?
      page&.menu_title
    end
    
    def materialized_path
      return url if url_kind?
      page&.materialized_path
    end
  end
end