class Admin::NodesController < Admin::AdminController
|
|
|
|
before_action :set_node, only: %i[ edit update destroy children sort toggle ]
|
|
|
|
before_action :set_locale_to_default, only: %i[ create ]
|
|
|
|
helper_method :current_node_id, :open_node_ids
|
|
|
|
# GET /nodes
|
|
def index
|
|
# Can be nil
|
|
@node = Node.find_by(id: current_node_id) || Node.roots.first
|
|
end
|
|
|
|
|
|
# GET /nodes/1/edit
|
|
def edit
|
|
respond_to do |format|
|
|
format.turbo_stream
|
|
format.html
|
|
end
|
|
end
|
|
|
|
# GET /nodes/tree /nodes/1/tree
|
|
def tree
|
|
@node = params[:id] ? Node.find(params[:id]) : Node.roots.first
|
|
|
|
session[:current_node_id] = @node&.id
|
|
|
|
respond_to do |format|
|
|
format.turbo_stream
|
|
end
|
|
end
|
|
|
|
|
|
# POST /nodes or /nodes.json
|
|
def create
|
|
|
|
@node = Node.new(node_params)
|
|
@node.status = :status_draft
|
|
@node.template = @node.root.site? ? Node::NODE_TEMPLATES.first : Node::TILE_TEMPLATES.first
|
|
|
|
base_title = t('ui.untitled')
|
|
title = base_title
|
|
count = 0
|
|
|
|
while @node.siblings.exists?(title: {I18n.locale => title})
|
|
count += 1
|
|
title = "#{base_title} #{count}"
|
|
end
|
|
|
|
@node.title = title
|
|
|
|
respond_to do |format|
|
|
if @node.save
|
|
ensure_open_node_ids
|
|
session[:open_node_ids] << @node.id unless session[:open_node_ids].include?(@node.id)
|
|
|
|
format.turbo_stream
|
|
format.html { redirect_to edit_admin_node_url(@node), notice: t('ui.category_created', category: t(@node.template, scope: 'nodes.templates')) }
|
|
else
|
|
format.html { render :new, status: :unprocessable_entity }
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
# GET /nodes/1/children
|
|
def children
|
|
store_node_toggle_status
|
|
|
|
respond_to do |format|
|
|
format.turbo_stream
|
|
end
|
|
end
|
|
|
|
|
|
# PATCH/PUT /nodes/1
|
|
def update
|
|
|
|
params[:node][:expires_at] ||= nil
|
|
|
|
respond_to do |format|
|
|
if @node.update(node_params)
|
|
format.turbo_stream {
|
|
flash.now[:notice] = t('ui.category_updated', category: t(@node.template, scope: 'nodes.templates'))
|
|
}
|
|
format.html { redirect_to edit_node_url(@node), notice: t('ui.category_updated', category: t(@node.category, scope: 'nodes.categories')) }
|
|
else
|
|
format.html { render :edit, status: :unprocessable_entity }
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
# DELETE /nodes/1
|
|
def destroy
|
|
if @node.destroy!
|
|
@destroyed_node = @node
|
|
@node = @node.parent
|
|
end
|
|
respond_to do |format|
|
|
format.turbo_stream {
|
|
flash.now[:notice] = t('ui.category_destroyed', category: t(@destroyed_node.category, scope: 'nodes.categories'))
|
|
}
|
|
format.html { redirect_to nodes_url, notice: t(:'nodes.destroyed') }
|
|
end
|
|
end
|
|
|
|
|
|
# PATCH /nodes/sort?id=
|
|
# {"id"=>"2", "old_index"=>1, "new_index"=>4, "node"=>{"id"=>"2"}}
|
|
def sort
|
|
@node.insert_at(params[:new_index].to_i + 1)
|
|
respond_to do |format|
|
|
format.turbo_stream
|
|
end
|
|
end
|
|
|
|
|
|
|
|
# Expand or collapse node in drawer
|
|
# PATCH /nodes/toggle?id=1&expanded=true/false
|
|
def toggle
|
|
store_node_toggle_status
|
|
head :ok
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
# Use callbacks to share common setup or constraints between actions.
|
|
def set_node
|
|
@node = Node.find(params[:id])
|
|
end
|
|
|
|
|
|
# Only allow a list of trusted parameters through.
|
|
def node_params
|
|
params.require(:node).permit(
|
|
:parent_id,
|
|
:title_en, :title_zh, :title_hr, :title_cs, :title_da, :title_nl, :title_fi, :title_fr, :title_de, :title_hu, :title_it, :title_ja, :title_ko, :title_nb, :title_pl, :title_pt, :title_ro, :title_sr, :title_sk, :title_sl, :title_es, :title_sv, :title_uk,
|
|
:page_title_en, :page_title_zh, :page_title_hr, :page_title_cs, :page_title_da, :page_title_nl, :page_title_fi, :page_title_fr, :page_title_de, :page_title_hu, :page_title_it, :page_title_ja, :page_title_ko, :page_title_nb, :page_title_pl, :page_title_pt, :page_title_ro, :page_title_sr, :page_title_sk, :page_title_sl, :page_title_es, :page_title_sv, :page_title_uk,
|
|
:page_description_en, :page_description_zh, :page_description_hr, :page_description_cs, :page_description_da, :page_description_nl, :page_description_fi, :page_description_fr, :page_description_de, :page_description_hu, :page_description_it, :page_description_ja, :page_description_ko, :page_description_nb, :page_description_pl, :page_description_pt, :page_description_ro, :page_description_sr, :page_description_sk, :page_description_sl, :page_description_es, :page_description_sv, :page_description_uk,
|
|
:slug_en, :slug_zh, :slug_hr, :slug_cs, :slug_da, :slug_nl, :slug_fi, :slug_fr, :slug_de, :slug_hu, :slug_it, :slug_ja, :slug_ko, :slug_nb, :slug_pl, :slug_pt, :slug_ro, :slug_sr, :slug_sk, :slug_sl, :slug_es, :slug_sv, :slug_uk,
|
|
:template,
|
|
:href_en, :href_zh, :href_hr, :href_cs, :href_da, :href_nl, :href_fi, :href_fr, :href_de, :href_hu, :href_it, :href_ja, :href_ko, :href_nb, :href_pl, :href_pt, :href_ro, :href_sr, :href_sk, :href_sl, :href_es, :href_sv, :href_uk,
|
|
:status,
|
|
:page_description,
|
|
:parent_id,
|
|
:position,
|
|
:published_at,
|
|
:expires_at,
|
|
:is_allowlist,
|
|
excluded_locales: [],
|
|
settings: [],
|
|
tags_en: [], tags_zh: [], tags_hr: [], tags_cs: [], tags_da: [], tags_nl: [], tags_fi: [], tags_fr: [], tags_de: [], tags_hu: [], tags_it: [], tags_ja: [], tags_ko: [], tags_nb: [], tags_pl: [], tags_pt: [], tags_ro: [], tags_sr: [], tags_sk: [], tags_sl: [], tags_es: [], tags_sv: [], tags_uk: [],
|
|
attachments_attributes: [
|
|
:id, :asset_id,
|
|
:body_en, :body_zh, :body_hr, :body_cs, :body_da, :body_nl, :body_fi, :body_fr, :body_de, :body_hu, :body_it, :body_ja, :body_ko, :body_nb, :body_pl, :body_pt, :body_ro, :body_sr, :body_sk, :body_sl, :body_es, :body_sv, :body_uk,
|
|
:fg_color, :bg_color, :alignment, :template, :position, :_destroy
|
|
]
|
|
)
|
|
end
|
|
|
|
|
|
def current_node_id
|
|
session[:current_node_id]
|
|
end
|
|
|
|
|
|
def open_node_ids
|
|
Array(session[:open_node_ids])
|
|
end
|
|
|
|
|
|
def ensure_open_node_ids
|
|
session[:open_node_ids] ||= []
|
|
end
|
|
|
|
|
|
def store_node_toggle_status
|
|
ensure_open_node_ids
|
|
|
|
if params[:expanded] == false
|
|
session[:open_node_ids].delete(@node.id)
|
|
else
|
|
session[:open_node_ids] << @node.id unless session[:open_node_ids].include?(@node.id)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
end
|