locomotivecms/steam

View on GitHub
lib/locomotive/steam/entities/content_type.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Locomotive::Steam

  class ContentType

    include Locomotive::Steam::Models::Entity
    extend Forwardable

    def_delegator :fields, :associations, :association_fields
    def_delegator :fields, :selects, :select_fields
    def_delegator :fields, :files, :file_fields
    def_delegator :fields, :passwords, :password_fields
    def_delegator :fields, :default, :fields_with_default

    def initialize(attributes = {})
      super({
        order_by:           '_position',
        order_direction:    'asc',
        recaptcha_required: false
      }.merge(attributes))
    end

    def fields
      # Note: this returns an instance of the ContentTypeFieldRepository class
      self.entries_custom_fields
    end

    def fields_by_name
      @fields_by_name ||= (fields.all.inject({}) do |memo, field|
        memo[field.name] = field
        memo
      end).with_indifferent_access
    end

    def localized_names
      # FIXME: select type fields are a bit specific. The label of the options is localized
      # even if the select itself is not (see the _cast_select method in the content_entry entity class)
      fields.localized_names + select_fields.map(&:name)
    end

    def localized?
      !fields.localized_names.blank?
    end

    def persisted_field_names
      [].tap do |names|
        fields_by_name.each do |name, field|
          _name = field.persisted_name
          names << _name if _name
        end
      end
    end

    def label_field_name
      (self[:label_field_name] || fields.first.name).to_sym
    end

    def field_label_of(name)
      fields_by_name[name].label.downcase
    end

    def order_by
      name = self[:order_by] == 'manually' ? '_position' : self[:order_by]

      # check if name is an id of field
      if field = fields.find(name)
        name = field.name
      end

      { name.to_sym => self.order_direction.to_s }
    end

    def recaptcha_required?
      !!self.recaptcha_required
    end

  end
end