otwarchive-symphonyarchive/app/controllers/archive_faqs_controller.rb

196 lines
5.6 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
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