comfy/comfortable-mexican-sofa

View on GitHub
app/controllers/comfy/admin/cms/translations_controller.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# frozen_string_literal: true

class Comfy::Admin::Cms::TranslationsController < Comfy::Admin::Cms::BaseController

  helper_method :translation_select_options

  before_action :load_page
  before_action :build_translation,   only: %i[new create]
  before_action :load_translation,    only: %i[edit update destroy]
  before_action :authorize
  before_action :preview_translation, only: %i[create update]

  def new
    render
  end

  def edit
    render
  end

  def create
    @translation.save!
    flash[:success] = I18n.t("comfy.admin.cms.translations.created")
    redirect_to action: :edit, id: @translation
  rescue ActiveRecord::RecordInvalid
    flash.now[:danger] = I18n.t("comfy.admin.cms.translations.creation_failure")
    render action: :new
  end

  def update
    @translation.update!(translation_params)
    flash[:success] = I18n.t("comfy.admin.cms.translations.updated")
    redirect_to action: :edit, id: @translation
  rescue ActiveRecord::RecordInvalid
    flash.now[:danger] = I18n.t("comfy.admin.cms.translations.update_failure")
    render action: :edit
  end

  def destroy
    @translation.destroy
    flash[:success] = I18n.t("comfy.admin.cms.translations.deleted")
    redirect_to edit_comfy_admin_cms_site_page_path(@site, @page)
  end

  def form_fragments
    @translation = @page.translations.find_by(id: params[:id]) || @page.translations.new
    @translation.layout = @site.layouts.find_by(id: params[:layout_id])

    render(
      partial:  "comfy/admin/cms/fragments/form_fragments",
      locals:   { record: @translation, scope: :translation },
      layout:   false
    )
  end

private

  def translation_select_options
    all = ComfortableMexicanSofa.config.locales
    taken = @page.translations.pluck(:locale) + [@site.locale] - [@translation.locale]
    all.except(*taken).map { |k, v| ["#{v} (#{k})", k] }
  end

  def load_page
    @page = @site.pages.find(params[:page_id])
  rescue ActiveRecord::RecordNotFound
    flash[:danger] = I18n.t("comfy.admin.cms.pages.not_found")
    redirect_to comfy_admin_cms_site_pages_path(@site)
  end

  def build_translation
    @translation = @page.translations.new(translation_params)
    @translation.layout ||= @page.layout
  end

  def load_translation
    @translation = @page.translations.find(params[:id])
    @translation.attributes = translation_params
  rescue ActiveRecord::RecordNotFound
    flash[:danger] = I18n.t("comfy.admin.cms.translations.not_found")
    redirect_to edit_comfy_admin_cms_site_page_path(@site, @page)
  end

  def translation_params
    params.fetch(:translation, {}).permit!
  end

  def preview_translation
    if params[:preview]
      layout = @translation.layout.app_layout.blank? ? false : @translation.layout.app_layout
      @cms_site   = @page.site
      @cms_layout = @translation.layout
      @cms_page   = @page

      # Make sure to use the site locale to render the preview becaue it might
      # be different from the admin locale.
      I18n.locale = @translation.locale

      # Chrome chokes on content with iframes. Issue #434
      response.headers["X-XSS-Protection"] = "0"

      # raise
      render inline: @translation.render, layout: layout, content_type: "text/html"
    end
  end

end