Skip to content
Snippets Groups Projects
block.rb 2.34 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_blocks
#
#  id            :uuid             not null, primary key
#  about_type    :string           indexed => [about_id]
#  data          :jsonb
#  position      :integer          default(0), not null
Arnaud Levy's avatar
Arnaud Levy committed
#  template_kind :integer          default(NULL), not null
#  title         :string
Arnaud Levy's avatar
Arnaud Levy committed
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#  about_id      :uuid             indexed => [about_type]
#  university_id :uuid             not null, indexed
#
# Indexes
#
#  index_communication_blocks_on_university_id  (university_id)
#  index_communication_website_blocks_on_about  (about_type,about_id)
#
# Foreign Keys
#
#  fk_rails_18291ef65f  (university_id => universities.id)
#
class Communication::Block < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Arnaud Levy's avatar
Arnaud Levy committed
  include WithPosition

  belongs_to :about, polymorphic: true

Sébastien Gaya's avatar
Sébastien Gaya committed
  # Used to purge images when unattaching them
Arnaud Levy's avatar
Arnaud Levy committed
  # template_blobs would be a better name, because there are files
  has_many_attached :template_images

Arnaud Levy's avatar
Arnaud Levy committed
  enum template_kind: {
Arnaud Levy's avatar
Arnaud Levy committed
    chapter: 50,
Arnaud Levy's avatar
Arnaud Levy committed
    image: 51,
Arnaud Levy's avatar
Arnaud Levy committed
    gallery: 300,
Arnaud Levy's avatar
Arnaud Levy committed
    video: 52,
Arnaud Levy's avatar
Arnaud Levy committed
    key_figures: 56,
Arnaud Levy's avatar
Arnaud Levy committed
    datatable: 54,
    files: 55,
    embed: 53,
    call_to_action: 900,
alexisben's avatar
alexisben committed
    testimonials: 400,
alexisben's avatar
alexisben committed
    timeline: 700,
alexisben's avatar
alexisben committed
    definitions: 800,
Arnaud Levy's avatar
Arnaud Levy committed
    organization_chart: 100,
    partners: 200,
    posts: 500,
    pages: 600,
Arnaud Levy's avatar
Arnaud Levy committed
  }

  CATEGORIES = {
    basic: [:chapter, :image, :video, :datatable],
    storytelling: [:key_figures, :gallery, :call_to_action, :testimonials, :timeline],
    references: [:pages, :posts, :organization_chart, :partners],
    utilities: [:files, :definitions, :embed]
Arnaud Levy's avatar
Arnaud Levy committed
  before_save :attach_template_blobs
Sébastien Gaya's avatar
Sébastien Gaya committed
  after_commit :save_and_sync_about, on: [:update, :destroy]
Arnaud Levy's avatar
Arnaud Levy committed
  def data=(value)
Arnaud Levy's avatar
Arnaud Levy committed
    attributes['data'] = template.parse(value).to_h
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def data
Arnaud Levy's avatar
Arnaud Levy committed
    template.to_h
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def git_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
    template.git_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def last_ordered_element
    about.blocks.ordered.last
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def template
    @template ||= "Communication::Block::Template::#{template_kind.classify}".constantize.new self
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    title.blank?  ? "Block #{position}"
                  : "#{title}"
Arnaud Levy's avatar
Arnaud Levy committed
  end
Arnaud Levy's avatar
Arnaud Levy committed
  def attach_template_blobs
    self.template_images = template.active_storage_blobs
  end
Sébastien Gaya's avatar
Sébastien Gaya committed

  def save_and_sync_about
    about&.save_and_sync unless about&.destroyed?
  end
Arnaud Levy's avatar
Arnaud Levy committed
end