Skip to content
Snippets Groups Projects
base.rb 2.58 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
class Communication::Block::Template::Base
  class_attribute :fields

Arnaud Levy's avatar
Arnaud Levy committed
  attr_reader :block

Arnaud Levy's avatar
Arnaud Levy committed
  def self.has_string(property)
    has_field property, :string
  end

  def self.has_text(property)
    has_field property, :text
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def self.has_rich_text(property)
Arnaud Levy's avatar
Arnaud Levy committed
    has_field property, :rich_text
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def self.has_select(property, **args)
    has_field property, :select
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def self.has_image(property)
Arnaud Levy's avatar
Arnaud Levy committed
    has_field property, :image
    has_field "#{property}_alt".to_sym, :string
    has_field "#{property}_credit".to_sym, :string
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def self.has_field(property, kind)
    self.fields ||= []
    self.fields << { name: property, type: kind }
Arnaud Levy's avatar
Arnaud Levy committed
    sanitizers = {
Arnaud Levy's avatar
Arnaud Levy committed
      string: 'string',
      text: 'text',
Arnaud Levy's avatar
Arnaud Levy committed
      rich_text: 'text'
    }
    sanitizer_type = sanitizers[kind]
Arnaud Levy's avatar
Arnaud Levy committed
    class_eval <<-CODE, __FILE__, __LINE__ + 1
      def #{property}
Arnaud Levy's avatar
Arnaud Levy committed
        Communication::Block::Component::#{kind.classify}.new(property, self).value
Arnaud Levy's avatar
Arnaud Levy committed
      end
Arnaud Levy's avatar
Arnaud Levy committed

Arnaud Levy's avatar
Arnaud Levy committed
      def #{property}=(value)
Arnaud Levy's avatar
Arnaud Levy committed
        Communication::Block::Component::#{kind.classify}.new(property, self).value = value
Arnaud Levy's avatar
Arnaud Levy committed
      end
    CODE
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def initialize(block)
    @block = block
Arnaud Levy's avatar
Arnaud Levy committed
    @fields = []
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def data=(value)
Arnaud Levy's avatar
Arnaud Levy committed
    json = JSON.parse value
    self.class.fields.each do |field|
      update_field field, json
Arnaud Levy's avatar
Arnaud Levy committed
    end
Arnaud Levy's avatar
Arnaud Levy committed
    true
Sébastien Gaya's avatar
Sébastien Gaya committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def git_dependencies
    unless @git_dependencies
Sébastien Gaya's avatar
Sébastien Gaya committed
      @git_dependencies = []
      build_git_dependencies
      @git_dependencies.uniq!
    end
    @git_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def active_storage_blobs
    []
  end

Arnaud Levy's avatar
Arnaud Levy committed
  protected

Arnaud Levy's avatar
Arnaud Levy committed
  def default_data
    {
      'elements': []
    }
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def update_field(field, json)
    name = field[:name]
    value = json["#{name}"]
    public_send "#{name}=", value
  end

  def build_git_dependencies
  end

  def add_dependency(dependency)
    if dependency.is_a? Array
      @git_dependencies += dependency
    else
      @git_dependencies += [dependency]
    end
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def find_blob(object, key)
    id = object.dig(key, 'id')
    return if id.blank?
    university.active_storage_blobs.find id
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def extract_image_alt_and_credit(source, variable)
    blob = find_blob source, variable
    return if blob.nil?
    alt = source["alt"] || source["#{variable}_alt"]
    credit = source["credit"] || source["#{variable}_credit"]
    text = source["text"] || source["#{variable}_text"]
    {
      blob: blob,
      alt: alt,
      credit: credit,
      text: text
    }.to_dot
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def data
Arnaud Levy's avatar
Arnaud Levy committed
    block.data
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def elements
    data.has_key?('elements') ? data['elements']
                              : []
  end

  def university
    block.university
  end
end