module Spina module Admin class PagesController < AdminController before_action :set_locale before_action :set_page, only: [:edit, :edit_content, :edit_template, :update, :destroy, :children, :sort_one] before_action :set_tabs def index add_breadcrumb I18n.t('spina.website.pages'), spina.admin_pages_path if params[:resource_id] @resource = Resource.find(params[:resource_id]) @page_templates = Spina::Current.theme.new_page_templates(resource: @resource) @pages = @resource.pages.active.roots.includes(:translations).page(params[:page]).per(Spina.config.resource_pages_limit_value) else @pages = Page.active.sorted.roots.main.includes(:translations) @page_templates = Spina::Current.theme.new_page_templates end end def new resource = Resource.find_by(id: params[:resource_id]) @page = Page.new(view_template: params[:view_template], resource: resource) end def create @page = Page.new(page_params.merge(draft: true)) if @page.save redirect_to spina.edit_admin_page_url(@page) else render turbo_stream: turbo_stream.update(view_context.dom_id(@page, :new_page_form), partial: "new_page_form") end end def edit add_index_breadcrumb add_breadcrumb @page.title end def edit_content @parts = current_theme.view_templates.find do |view_template| view_template[:name].to_s == @page.view_template.to_s end&.dig(:parts) || [] end def edit_template render layout: false end def update Mobility.locale = @locale if @page.update(page_params) if @page.saved_change_to_draft? && @page.live? flash[:confetti] = t('spina.pages.published') else flash[:success] = t('spina.pages.saved') end redirect_to spina.edit_admin_page_url(@page, params: {locale: @locale}) else add_index_breadcrumb Mobility.locale = I18n.locale add_breadcrumb @page.title flash.now[:error] = t('spina.pages.couldnt_be_saved') render :edit, status: :unprocessable_entity end end def sort params[:ids].each.with_index do |id, index| Page.where(id: id).update_all(position: index + 1) end flash.now[:info] = t("spina.pages.sorting_saved") render_flash end def sort_one current_position = @page.position if params[:direction] == "up" @bottom_page = @page @top_page = @target_page = @page.siblings.where(resource_id: @page.resource_id).sorted.where("position < ?", current_position).last else @bottom_page = @target_page = @page.siblings.where(resource_id: @page.resource_id).sorted.where("position > ?", current_position).first @top_page = @page end if @target_page @page.transaction do @page.update(position: @target_page.position) @target_page.update(position: current_position) end flash.now[:info] = t("spina.pages.sorting_saved") else head :ok end end def children @children = @page.children.active.sorted render layout: false end def destroy flash[:info] = t('spina.pages.deleted') @page.destroy redirect_to spina.admin_pages_url end private def set_locale @locale = params[:locale] || I18n.default_locale end def add_index_breadcrumb if @page.resource add_breadcrumb @page.resource.label, spina.admin_pages_path(resource_id: @page.resource_id), class: 'text-gray-400' else add_breadcrumb t('spina.website.pages'), spina.admin_pages_path, class: 'text-gray-400' end end def page_params params.require(:page).permit! end def set_page @page = Page.find(params[:id]) end def set_tabs @tabs = %w[page_content search_engines advanced] end end end end