Sha256: 1aa53bdb362dfb2691c6b8a774718906c995c65a0986c947bedaf7021fed7968

Contents?: true

Size: 1.79 KB

Versions: 3

Compression:

Stored size: 1.79 KB

Contents

module Trestle
  class Admin
    class Builder < Trestle::Builder
      target :admin

      class_attribute :admin_class
      self.admin_class = Admin

      class_attribute :controller
      self.controller = Controller

      delegate :helper, :before_action, :after_action, :around_action, to: :@controller

      def initialize(name, options={})
        # Create admin subclass
        @admin = Class.new(admin_class)
        @admin.options = options

        # Define a constant based on the admin name
        scope = options[:scope] || Object
        scope.const_set("#{name.to_s.camelize}Admin", @admin)

        # Define admin controller class
        # This is done using class_eval rather than Class.new so that the full
        # class name and parent chain is set when Rails' inherited hooks are called.
        @admin.class_eval("class AdminController < #{self.class.controller.name}; end")

        # Set a reference on the controller class to the admin class
        @controller = @admin.const_get("AdminController")
        @controller.instance_variable_set("@admin", @admin)
      end

      def menu(*args, &block)
        if block_given?
          admin.menu = Navigation::Block.new(admin, &block)
        else
          menu { item(*args) }
        end
      end

      def table(options={}, &block)
        admin.table = Table::Builder.build(options.reverse_merge(admin: admin, sortable: true), &block)
      end

      def form(&block)
        admin.form = Form.new(&block)
      end

      def admin(&block)
        @admin.singleton_class.class_eval(&block) if block_given?
        @admin
      end

      def controller(&block)
        @controller.class_eval(&block) if block_given?
        @controller
      end

      def routes(&block)
        @admin.additional_routes = block
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
trestle-0.8.5 lib/trestle/admin/builder.rb
trestle-0.8.4 lib/trestle/admin/builder.rb
trestle-0.8.3 lib/trestle/admin/builder.rb