Sha256: 7b29d44ccac3151a05c018ad653ff7531896f320861c48d5dc61ef10b1eadcd8

Contents?: true

Size: 1.99 KB

Versions: 3

Compression:

Stored size: 1.99 KB

Contents

module Tienda
  class NavigationManager
    def self.managers
      @managers ||= []
    end

    def self.create(identifier)
      managers << new(identifier.to_s)
    end

    def self.build(identifier, &block)
      manager = new(identifier.to_s)
      manager.instance_eval(&block) if block_given?
      managers << manager
    end

    def self.find(identifier)
      managers.select { |m| m.identifier == identifier.to_s }.first
    end

    def self.render(identifier)
      find(identifier).try(:to_html)
    end

    attr_reader :identifier

    def initialize(identifier)
      @identifier = identifier
    end

    def items
      @items ||= []
    end

    def add_item(identifier, options = {}, &block)
      item                  = NavigationItem.new
      item.manager          = self
      item.identifier       = identifier.to_s
      item.url              = options[:url]            if options[:url]
      item.link_options     = options[:link_options]   if options[:link_options]
      item.active_if        = block                    if block_given?
      items << item
    end

    def remove_item(identifier)
      items.remote_if { |i| i.identifier.to_s == identifier.to_s }
    end

    class NavigationItem
      attr_accessor :manager
      attr_accessor :identifier
      attr_accessor :url
      attr_accessor :link_options
      attr_accessor :active_if

      def description
        I18n.translate("tienda.navigation.#{manager.identifier}.#{identifier}")
      end

      def url(request = nil)
        (@url.is_a?(Proc) && request && request.instance_eval(&@url)) ||
          @url ||
          Tienda::Engine.routes.url_helpers.send("#{identifier}_path")
      end

      def active?(request)
        if active_if.is_a?(Proc)
          request.instance_eval(&active_if) == true
        elsif active_nav_var = request.instance_variable_get('@active_nav')
          active_nav_var.to_s == identifier
        end
      end

      def link_options
        @link_options ||= {}
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tienda-1.1.2 lib/tienda/navigation_manager.rb
tienda-1.1.1 lib/tienda/navigation_manager.rb
tienda-1.1.0 lib/tienda/navigation_manager.rb