From 04ce28ca29a01e35c77da59ceea32ee225b7662a Mon Sep 17 00:00:00 2001 From: jamey Date: Sun, 29 Mar 2026 20:30:36 +0100 Subject: [PATCH] fix page settings section and blocks not showing in editor 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 --- lib/berrypod/pages/defaults.ex | 14 +++++++++++++- .../components/shop_components/site_editor.ex | 6 ++---- lib/berrypod_web/live/shop/page.ex | 3 +++ lib/berrypod_web/page_editor_hook.ex | 18 +++++++++++++++++- lib/berrypod_web/page_renderer.ex | 16 +++++++++------- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/lib/berrypod/pages/defaults.ex b/lib/berrypod/pages/defaults.ex index 3d21762..ae3c814 100644 --- a/lib/berrypod/pages/defaults.ex +++ b/lib/berrypod/pages/defaults.ex @@ -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 diff --git a/lib/berrypod_web/components/shop_components/site_editor.ex b/lib/berrypod_web/components/shop_components/site_editor.ex index 98d0157..407beac 100644 --- a/lib/berrypod_web/components/shop_components/site_editor.ex +++ b/lib/berrypod_web/components/shop_components/site_editor.ex @@ -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) %>
"update_nav_item"} diff --git a/lib/berrypod_web/live/shop/page.ex b/lib/berrypod_web/live/shop/page.ex index a6397af..36edd07 100644 --- a/lib/berrypod_web/live/shop/page.ex +++ b/lib/berrypod_web/live/shop/page.ex @@ -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 diff --git a/lib/berrypod_web/page_editor_hook.ex b/lib/berrypod_web/page_editor_hook.ex index 67cc142..45ffb21 100644 --- a/lib/berrypod_web/page_editor_hook.ex +++ b/lib/berrypod_web/page_editor_hook.ex @@ -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 diff --git a/lib/berrypod_web/page_renderer.ex b/lib/berrypod_web/page_renderer.ex index 17c889a..a6d65e5 100644 --- a/lib/berrypod_web/page_renderer.ex +++ b/lib/berrypod_web/page_renderer.ex @@ -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"""