Sha256: ce3cd61cdc5125c7693925b3cf8788730b38c27523006e93813ff7dbd37696c4

Contents?: true

Size: 1.75 KB

Versions: 19

Compression:

Stored size: 1.75 KB

Contents

# frozen_string_literal: true

module ActiveElement
  # Provides an interface to available admin routes, used for populating a default navigation bar
  # and detecting available permitted routes if the default root path is not permitted.
  class Routes
    include Enumerable

    def initialize(rails_component:, permissions: [])
      @permissions = permissions
      @rails_component = rails_component
    end

    def permitted
      @permitted ||= available_routes.select(&:permitted?)
    end

    def available
      @available ||= available_routes
    end

    def alternative_routes
      @alternative_routes ||= available.select(&:primary?).reject { |route| route.path == '/' }
    end

    def each(&block)
      available.each(&block)
    end

    private

    attr_reader :permissions, :rails_component

    def available_routes
      @available_routes ||= descendants_with_permissions.map do |descendant, required_permissions|
        action_methods = descendant.public_methods(false)
        ([:index] + action_methods).uniq.map do |action|
          route(descendant, action, required_permissions)
        end
      end.flatten.compact.select(&:rails_route?).sort
    end

    def descendants_with_permissions
      @descendants_with_permissions ||= descendants.map do |controller_class|
        [controller_class.new, controller_class.active_element.permissions]
      end.compact
    end

    def descendants
      @descendants ||= ActiveElement::ApplicationController.descendants
    end

    def route(controller, action, required_permissions)
      Route.new(
        controller: controller,
        action: action,
        required_permissions: required_permissions,
        user_permissions: permissions,
        rails_component: rails_component
      )
    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
active_element-0.0.31 lib/active_element/routes.rb
active_element-0.0.30 lib/active_element/routes.rb
active_element-0.0.29 lib/active_element/routes.rb
active_element-0.0.28 lib/active_element/routes.rb
active_element-0.0.27 lib/active_element/routes.rb
active_element-0.0.26 lib/active_element/routes.rb
active_element-0.0.24 lib/active_element/routes.rb
active_element-0.0.23 lib/active_element/routes.rb
active_element-0.0.22 lib/active_element/routes.rb
active_element-0.0.21 lib/active_element/routes.rb
active_element-0.0.19 lib/active_element/routes.rb
active_element-0.0.18 lib/active_element/routes.rb
active_element-0.0.17 lib/active_element/routes.rb
active_element-0.0.16 lib/active_element/routes.rb
active_element-0.0.15 lib/active_element/routes.rb
active_element-0.0.14 lib/active_element/routes.rb
active_element-0.0.13 lib/active_element/routes.rb
active_element-0.0.12 lib/active_element/routes.rb
active_element-0.0.11 lib/active_element/routes.rb