196 lines
5.6 KiB
Ruby
196 lines
5.6 KiB
Ruby
|
|
class ArchiveFaqsController < ApplicationController
|
||
|
|
before_action :admin_only, except: [:index, :show]
|
||
|
|
before_action :set_locale
|
||
|
|
before_action :validate_locale, if: :logged_in_as_admin?
|
||
|
|
before_action :require_language_id
|
||
|
|
before_action :default_locale_only, only: [:new, :create, :manage, :update_positions, :confirm_delete, :destroy]
|
||
|
|
around_action :with_locale
|
||
|
|
|
||
|
|
# GET /archive_faqs
|
||
|
|
def index
|
||
|
|
@archive_faqs = ArchiveFaq.order("position ASC")
|
||
|
|
unless logged_in_as_admin?
|
||
|
|
@archive_faqs = @archive_faqs.with_translations(I18n.locale)
|
||
|
|
end
|
||
|
|
respond_to do |format|
|
||
|
|
format.html # index.html.erb
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# GET /archive_faqs/1
|
||
|
|
def show
|
||
|
|
@questions = []
|
||
|
|
@archive_faq = ArchiveFaq.find_by!(slug: params[:id])
|
||
|
|
if params[:language_id] == "en"
|
||
|
|
@questions = @archive_faq.questions
|
||
|
|
else
|
||
|
|
@archive_faq.questions.each do |question|
|
||
|
|
question.translations.each do |translation|
|
||
|
|
if translation.is_translated == "1" && params[:language_id].to_s == translation.locale.to_s
|
||
|
|
@questions << question
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
@page_subtitle = @archive_faq.title + ts(" FAQ")
|
||
|
|
|
||
|
|
respond_to do |format|
|
||
|
|
format.html # show.html.erb
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
protected
|
||
|
|
|
||
|
|
def build_questions
|
||
|
|
notice = ""
|
||
|
|
num_to_build = params["num_questions"] ? params["num_questions"].to_i : @archive_faq.questions.count
|
||
|
|
if num_to_build < @archive_faq.questions.count
|
||
|
|
notice += ts("There are currently %{num} questions. You can only submit a number equal to or greater than %{num}. ", num: @archive_faq.questions.count)
|
||
|
|
num_to_build = @archive_faq.questions.count
|
||
|
|
elsif params["num_questions"]
|
||
|
|
notice += ts("Set up %{num} questions. ", num: num_to_build)
|
||
|
|
end
|
||
|
|
num_existing = @archive_faq.questions.count
|
||
|
|
num_existing.upto(num_to_build-1) do
|
||
|
|
@archive_faq.questions.build
|
||
|
|
end
|
||
|
|
unless notice.blank?
|
||
|
|
flash[:notice] = notice
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
public
|
||
|
|
|
||
|
|
# GET /archive_faqs/new
|
||
|
|
def new
|
||
|
|
@archive_faq = authorize ArchiveFaq.new
|
||
|
|
1.times { @archive_faq.questions.build(attributes: { question: "This is a temporary question", content: "This is temporary content", anchor: "ThisIsATemporaryAnchor"})}
|
||
|
|
respond_to do |format|
|
||
|
|
format.html # new.html.erb
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# GET /archive_faqs/1/edit
|
||
|
|
def edit
|
||
|
|
@archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
|
||
|
|
authorize :archive_faq, :full_access? if default_locale?
|
||
|
|
build_questions
|
||
|
|
end
|
||
|
|
|
||
|
|
# GET /archive_faqs/manage
|
||
|
|
def manage
|
||
|
|
@archive_faqs = authorize ArchiveFaq.order("position ASC")
|
||
|
|
end
|
||
|
|
|
||
|
|
# POST /archive_faqs
|
||
|
|
def create
|
||
|
|
@archive_faq = authorize ArchiveFaq.new(archive_faq_params)
|
||
|
|
if @archive_faq.save
|
||
|
|
flash[:notice] = t(".success")
|
||
|
|
redirect_to(@archive_faq)
|
||
|
|
else
|
||
|
|
render action: "new"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# PUT /archive_faqs/1
|
||
|
|
def update
|
||
|
|
@archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
|
||
|
|
authorize :archive_faq, :full_access? if default_locale?
|
||
|
|
|
||
|
|
if @archive_faq.update(archive_faq_params)
|
||
|
|
flash[:notice] = t(".success")
|
||
|
|
redirect_to(@archive_faq)
|
||
|
|
else
|
||
|
|
render action: "edit"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# reorder FAQs
|
||
|
|
def update_positions
|
||
|
|
authorize :archive_faq
|
||
|
|
if params[:archive_faqs]
|
||
|
|
@archive_faqs = ArchiveFaq.reorder_list(params[:archive_faqs])
|
||
|
|
flash[:notice] = t(".success")
|
||
|
|
elsif params[:archive_faq]
|
||
|
|
params[:archive_faq].each_with_index do |id, position|
|
||
|
|
ArchiveFaq.update(id, position: position + 1)
|
||
|
|
(@archive_faqs ||= []) << ArchiveFaq.find(id)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
respond_to do |format|
|
||
|
|
format.html { redirect_to(archive_faqs_path) }
|
||
|
|
format.js { render nothing: true }
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
# The ?language_id=somelanguage needs to persist throughout URL changes
|
||
|
|
# Get the value from set_locale to make sure there's no problem with order
|
||
|
|
def default_url_options
|
||
|
|
{ language_id: set_locale.to_s }
|
||
|
|
end
|
||
|
|
|
||
|
|
# Set the locale as an instance variable first
|
||
|
|
def set_locale
|
||
|
|
session[:language_id] = params[:language_id] if Locale.exists?(iso: params[:language_id])
|
||
|
|
|
||
|
|
if current_user.present?
|
||
|
|
@i18n_locale = session[:language_id].presence || current_user.preference.locale.iso
|
||
|
|
else
|
||
|
|
@i18n_locale = session[:language_id].presence || I18n.default_locale
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def validate_locale
|
||
|
|
return if params[:language_id].blank? || Locale.exists?(iso: params[:language_id])
|
||
|
|
|
||
|
|
flash[:error] = "The specified locale does not exist."
|
||
|
|
redirect_to url_for(request.query_parameters.merge(language_id: I18n.default_locale))
|
||
|
|
end
|
||
|
|
|
||
|
|
def require_language_id
|
||
|
|
return if params[:language_id].present? && Locale.exists?(iso: params[:language_id])
|
||
|
|
|
||
|
|
redirect_to url_for(request.query_parameters.merge(language_id: @i18n_locale.to_s))
|
||
|
|
end
|
||
|
|
|
||
|
|
def default_locale_only
|
||
|
|
return if default_locale?
|
||
|
|
|
||
|
|
flash[:error] = t("archive_faqs.default_locale_only")
|
||
|
|
redirect_to archive_faqs_path
|
||
|
|
end
|
||
|
|
|
||
|
|
# Setting I18n.locale directly is not thread safe
|
||
|
|
def with_locale
|
||
|
|
I18n.with_locale(@i18n_locale) { yield }
|
||
|
|
end
|
||
|
|
|
||
|
|
# GET /archive_faqs/1/confirm_delete
|
||
|
|
def confirm_delete
|
||
|
|
@archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
|
||
|
|
end
|
||
|
|
|
||
|
|
# DELETE /archive_faqs/1
|
||
|
|
def destroy
|
||
|
|
@archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
|
||
|
|
@archive_faq.destroy
|
||
|
|
redirect_to(archive_faqs_path)
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def default_locale?
|
||
|
|
@i18n_locale.to_s == I18n.default_locale.to_s
|
||
|
|
end
|
||
|
|
|
||
|
|
def archive_faq_params
|
||
|
|
params.require(:archive_faq).permit(
|
||
|
|
:title,
|
||
|
|
questions_attributes: [
|
||
|
|
:id, :question, :anchor, :content, :screencast, :_destroy, :is_translated
|
||
|
|
]
|
||
|
|
)
|
||
|
|
end
|
||
|
|
end
|