Sha256: 4f3ed4c40d9836569c8bbd0ad3cfb7e6d38a93a13aa020d82975abf34237b583

Contents?: true

Size: 1.25 KB

Versions: 14

Compression:

Stored size: 1.25 KB

Contents

module PushType
  module Nestable
    extend ActiveSupport::Concern

    included do
      validate :parent_accepts_child
    end

    def child_nodes
      self.class.child_nodes
    end

    def custom_child_order?
      self.class.child_order.present?
    end

    def sortable?
      !custom_child_order?
    end

    def descendable?
      !child_nodes.empty?
    end

    def children
      return super() unless custom_child_order?
      super.reorder(self.class.child_order)
    end

    private

    def parent_accepts_child
      if parent_id.present?
        unless parent.child_nodes.include?(self.class.name.underscore)
          errors.add :parent_id, 'does not accept this child'
        end
      end
    end

    module ClassMethods

      attr_reader :child_order

      def child_nodes
        types = @child_nodes || PushType.config.root_nodes
        PushType.subclasses_from_list(:node, types)
      end

      def has_child_nodes(*args)
        if args.last.is_a? Hash
          opts = args.pop
          @child_order = case opts[:order]
            when :blog then ['published_at DESC', 'created_at DESC']
            else opts[:order]
          end
        else
          @child_order = nil
        end
        @child_nodes = args
      end

    end

  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
push_type_core-0.12.1 app/models/concerns/push_type/nestable.rb
push_type_core-0.12.0 app/models/concerns/push_type/nestable.rb
push_type_core-0.12.0.beta.1 app/models/concerns/push_type/nestable.rb
push_type_core-0.11.2 app/models/concerns/push_type/nestable.rb
push_type_core-0.11.1 app/models/concerns/push_type/nestable.rb
push_type_core-0.11.0.beta.2 app/models/concerns/push_type/nestable.rb
push_type_core-0.11.0.beta.1 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.4 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.3 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.2 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.1 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.0 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.0.beta.5 app/models/concerns/push_type/nestable.rb
push_type_core-0.10.0.beta.3 app/models/concerns/push_type/nestable.rb