fix page settings section and blocks not showing in editor
All checks were successful
deploy / deploy (push) Successful in 1m16s
All checks were successful
deploy / deploy (push) Successful in 1m16s
Two bugs fixed: 1. Page Settings section wasn't appearing for system pages because Defaults.for_slug didn't return all required fields (type, meta_description, published, etc). Also changed page_renderer to use bracket notation for safer field access. 2. Blocks weren't loading when navigating directly to ?edit=page because the PageEditorHook's handle_params ran before Shop.Page assigned @page. Added pending page mode mechanism: hook sets a flag when edit mode is requested but @page is nil, then Shop.Page calls maybe_enter_pending_page_mode after @page is assigned. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
9a506357eb
commit
04ce28ca29
@ -8,7 +8,19 @@ defmodule Berrypod.Pages.Defaults do
|
||||
"""
|
||||
|
||||
@doc "Returns the default page definition for the given slug."
|
||||
def for_slug(slug), do: %{slug: slug, title: title(slug), blocks: blocks(slug)}
|
||||
def for_slug(slug) do
|
||||
%{
|
||||
slug: slug,
|
||||
title: title(slug),
|
||||
blocks: blocks(slug),
|
||||
type: "system",
|
||||
published: true,
|
||||
meta_description: nil,
|
||||
show_in_nav: false,
|
||||
nav_label: nil,
|
||||
nav_position: nil
|
||||
}
|
||||
end
|
||||
|
||||
@doc "Returns default definitions for all pages."
|
||||
def all do
|
||||
|
||||
@ -641,10 +641,8 @@ defmodule BerrypodWeb.ShopComponents.SiteEditor do
|
||||
class="site-editor-nav-item"
|
||||
data-item-id={item.id}
|
||||
>
|
||||
<%
|
||||
# Determine if this item links to a known page (by URL match or page_id)
|
||||
is_page_link = item.page_id != nil or MapSet.member?(@page_urls, item.url)
|
||||
%>
|
||||
<% # Determine if this item links to a known page (by URL match or page_id)
|
||||
is_page_link = item.page_id != nil or MapSet.member?(@page_urls, item.url) %>
|
||||
<form
|
||||
class="site-editor-nav-item-form"
|
||||
phx-change={@event_prefix <> "update_nav_item"}
|
||||
|
||||
@ -237,6 +237,9 @@ defmodule BerrypodWeb.Shop.Page do
|
||||
# Must run after handle_params since Content pages set @page there.
|
||||
socket = maybe_sync_editing_blocks(socket)
|
||||
|
||||
# If edit mode was requested via URL but @page wasn't available yet, enter it now
|
||||
socket = BerrypodWeb.PageEditorHook.maybe_enter_pending_page_mode(socket)
|
||||
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
|
||||
@ -81,6 +81,21 @@ defmodule BerrypodWeb.PageEditorHook do
|
||||
{:cont, socket}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Called by Shop.Page after @page is assigned. If edit mode was requested via
|
||||
URL but couldn't be entered because @page wasn't available yet, enters it now.
|
||||
"""
|
||||
def maybe_enter_pending_page_mode(socket) do
|
||||
if socket.assigns[:editor_pending_page_mode] && socket.assigns[:page] &&
|
||||
!socket.assigns.editing do
|
||||
socket
|
||||
|> assign(:editor_pending_page_mode, false)
|
||||
|> enter_edit_mode()
|
||||
else
|
||||
socket
|
||||
end
|
||||
end
|
||||
|
||||
# ── handle_params: track current path and restore editor state ────
|
||||
|
||||
defp handle_editor_params(params, uri, socket) do
|
||||
@ -164,7 +179,8 @@ defmodule BerrypodWeb.PageEditorHook do
|
||||
if socket.assigns[:page] do
|
||||
enter_edit_mode(socket)
|
||||
else
|
||||
socket
|
||||
# Page not yet loaded - mark that we need to enter edit mode when it is
|
||||
assign(socket, :editor_pending_page_mode, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -374,18 +374,20 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
form = assigns.form || %{}
|
||||
is_custom = assigns.page[:type] == "custom"
|
||||
|
||||
page = assigns.page
|
||||
|
||||
assigns =
|
||||
assigns
|
||||
|> assign(:is_custom, is_custom)
|
||||
|> assign(:form_title, form["title"] || assigns.page.title || "")
|
||||
|> assign(:form_slug, form["slug"] || assigns.page.slug || "")
|
||||
|> assign(:form_meta, form["meta_description"] || assigns.page.meta_description || "")
|
||||
|> assign(:form_published, form_checked?(form, "published", assigns.page.published))
|
||||
|> assign(:form_show_in_nav, form_checked?(form, "show_in_nav", assigns.page.show_in_nav))
|
||||
|> assign(:form_nav_label, form["nav_label"] || assigns.page.nav_label || "")
|
||||
|> assign(:form_title, form["title"] || page[:title] || "")
|
||||
|> assign(:form_slug, form["slug"] || page[:slug] || "")
|
||||
|> assign(:form_meta, form["meta_description"] || page[:meta_description] || "")
|
||||
|> assign(:form_published, form_checked?(form, "published", page[:published]))
|
||||
|> assign(:form_show_in_nav, form_checked?(form, "show_in_nav", page[:show_in_nav]))
|
||||
|> assign(:form_nav_label, form["nav_label"] || page[:nav_label] || "")
|
||||
|> assign(
|
||||
:form_nav_position,
|
||||
form["nav_position"] || to_string(assigns.page.nav_position || 0)
|
||||
form["nav_position"] || to_string(page[:nav_position] || 0)
|
||||
)
|
||||
|
||||
~H"""
|
||||
|
||||
Loading…
Reference in New Issue
Block a user