add nav editors to Site tab with live preview
All checks were successful
deploy / deploy (push) Successful in 3m27s

- Add header and footer nav editors to Site tab with drag-to-reorder,
  add/remove items, and destination picker (pages, collections, external)
- Live preview updates as you edit nav items
- Remove legacy /admin/navigation page and controller (was saving to
  Settings table, now uses nav_items table)
- Update error_html.ex and pages/editor.ex to load nav from nav_items table
- Update link_scanner to read from nav_items table, edit path now /?edit=site
- Add Site.default_header_nav/0 and default_footer_nav/0 for previews/errors
- Remove fallback logic from theme_hook.ex (database is now source of truth)
- Seed default nav items and social links during setup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-28 22:19:48 +00:00
parent 5a5103bc42
commit 7c07805df8
24 changed files with 1068 additions and 1130 deletions

View File

@@ -149,14 +149,8 @@ defmodule BerrypodWeb.ErrorHTML do
|> Map.put(:cart_count, 0)
|> Map.put(:cart_subtotal, "£0.00")
|> Map.put(:page, page)
|> Map.put(
:header_nav_items,
load_nav("header_nav", &BerrypodWeb.ThemeHook.default_header_nav/0)
)
|> Map.put(
:footer_nav_items,
load_nav("footer_nav", &BerrypodWeb.ThemeHook.default_footer_nav/0)
)
|> Map.put(:header_nav_items, load_nav_items("header"))
|> Map.put(:footer_nav_items, load_nav_items("footer"))
# Load block data (e.g. products for featured_products block)
extra = safe_load(fn -> Pages.load_block_data(page.blocks, assigns) end) || %{}
@@ -223,10 +217,15 @@ defmodule BerrypodWeb.ErrorHTML do
end
end
defp load_nav(key, default_fn) do
case safe_load(fn -> Settings.get_setting(key) end) do
items when is_list(items) -> items
_ -> default_fn.()
# Load nav items from database, falling back to defaults if DB fails
# (error pages might render when database is unavailable)
defp load_nav_items(location) do
case safe_load(fn -> Berrypod.Site.nav_items_for_shop(location) end) do
items when is_list(items) and items != [] -> items
_ -> default_nav_items(location)
end
end
defp default_nav_items("header"), do: Berrypod.Site.default_header_nav()
defp default_nav_items("footer"), do: Berrypod.Site.default_footer_nav()
end