programandoarg/pg_rails

View on GitHub
pg_layout/app/lib/navbar.rb

Summary

Maintainability
A
0 mins
Test Coverage
B
85%
class Navbar
  include Rails.application.routes.url_helpers

  attr_reader :extensiones
  attr_accessor :logo, :logo_xl, :logo_xl_url

  def initialize(user)
    @user = user
    @yaml_data = YAML.load_file("#{Rails.application.root}/config/pg_rails.yml")
    @yaml_data = ActiveSupport::HashWithIndifferentAccess.new(@yaml_data)
    @extensiones = []
  end

  def add_html(html)
    @extensiones << html
  end

  def add_item(key, obj)
    @yaml_data[key] ||= []
    @yaml_data[key] << ActiveSupport::HashWithIndifferentAccess.new(obj)
  end

  def sidebar
    ret = bar(@user.present? ? 'sidebar.signed_in' : 'sidebar.not_signed_in')
    ret.push(*bar('sidebar.developer')) if @user.present? && @user.developer?
    ret
  end

  def bar(key)
    bar_data = @yaml_data[key]
    return [] if bar_data.blank?

    # rubocop:disable Security/Eval
    bar_data.map do |item|
      {
        title: item['name'],
        attributes: item['attributes']&.html_safe, # rubocop:disable Rails/OutputSafety
        path: eval(item['path']),
        show: item['policy'] ? eval(item['policy']) : true
      }
    rescue StandardError => e
      # FIXME: que rompa los tests
      # TODO!: testear
      pg_err e, item
      return []
    end
    # rubocop:enable Security/Eval
  end

  def all_children_hidden?(entry)
    entry[:children].all? { |child| child[:show] == false }
  end

  def any_children_active?(entry, request)
    entry[:children].any? { |child| active_entry?(child, request) }
    true
    # TODO: quitar
  end

  def hide_entry?(entry)
    if entry[:children].present?
      all_children_hidden?(entry)
    else
      entry[:show] == false
    end
  end

  def custom_current_page?(path, request)
    current_route = Rails.application.routes.recognize_path(request.env['PATH_INFO'])
    test_route = Rails.application.routes.recognize_path(path)
    current_route[:controller] == test_route[:controller] && current_route[:action] == test_route[:action]
  rescue ActionController::RoutingError
    false
  end

  def active_entry?(entry, request)
    if entry[:children].present?
      any_children_active?(entry, request)
    elsif entry[:path].present?
      custom_current_page?(entry[:path], request)
    end
  end

  private

  def policy(clase)
    Pundit.policy(@user, clase)
  end
end