Sha256: de4ed2c8bb6b10fbb89aeb71900f7c3837ce026296e266b60109ab03d3e613e9

Contents?: true

Size: 1.98 KB

Versions: 7

Compression:

Stored size: 1.98 KB

Contents

module Pageflow
  # Include in models that are declared as nested revision components
  # of other revision components.
  #
  # @since 15.5
  module NestedRevisionComponent
    # Shared functionality of revision components and nested revision
    # components.
    module Container
      extend ActiveSupport::Concern

      included do
        cattr_accessor :nested_revision_component_collection_names, default: []
      end

      # @api private
      def copy_nested_revision_component_to(record, reset_perma_ids: false)
        nested_revision_component_collection_names.each do |collection_name|
          send(collection_name).each do |nested|
            nested.copy_to(record.send(collection_name), reset_perma_ids: reset_perma_ids)
          end
        end
      end

      # Macro methods to declare nested revision components
      module ClassMethods
        # Call this macro in the body of a class which includes
        # `RevisionComponent` or `NestedRevisionComponent` and pass
        # the name of an association that shall be included when the
        # revision component is copied to a new revision. The
        # associated model needs to be a `NestedRevisionComponent`.
        def nested_revision_components(*collection_names)
          self.nested_revision_component_collection_names = collection_names
        end
      end
    end

    extend ActiveSupport::Concern
    include Container

    def duplicate
      copy_with(reset_perma_ids: true) do |record|
        yield record if block_given?
        record.save!
      end
    end

    # @api private
    def copy_to(collection, reset_perma_ids: false)
      copy_with(reset_perma_ids: reset_perma_ids) do |record|
        collection << record
      end
    end

    private

    def copy_with(reset_perma_ids:)
      record = dup
      record.perma_id = nil if reset_perma_ids && record.respond_to?(:perma_id=)

      yield record
      copy_nested_revision_component_to(record, reset_perma_ids: reset_perma_ids)

      record
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
pageflow-17.0.4 lib/pageflow/nested_revision_component.rb
pageflow-17.0.3 lib/pageflow/nested_revision_component.rb
pageflow-17.0.2 lib/pageflow/nested_revision_component.rb
pageflow-17.0.1 lib/pageflow/nested_revision_component.rb
pageflow-17.0.0 lib/pageflow/nested_revision_component.rb
pageflow-16.2.0 lib/pageflow/nested_revision_component.rb
pageflow-16.1.0 lib/pageflow/nested_revision_component.rb