add Site context with social links editor and site-wide settings
Some checks failed
deploy / deploy (push) Has been cancelled

- Add Site context for managing site-wide content (social links, nav items,
  announcement bar, footer content)
- Add SocialLink schema with URL normalization and platform auto-detection
  supporting 40+ platforms via host and 25+ via URI scheme
- Add NavItem schema for header/footer navigation (editor UI coming next)
- Add SiteEditor component with collapsible sections for each content type
- Wire social links card block and footer to use database data
- Filter empty URLs from display in shop components
- Add DetailsPreserver hook to preserve collapsible section state
- Add comprehensive tests for Site context and SocialLink functions
- Remove unused helper functions from onboarding to fix compiler warnings
- Move sync_edit_url_param helper to group handle_editor_event clauses

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-28 10:09:33 +00:00
parent 0b86cd66ce
commit 638bb4fb70
24 changed files with 3121 additions and 195 deletions

View File

@@ -86,9 +86,12 @@ defmodule BerrypodWeb.PageRenderer do
editing={@editing}
theme_editing={Map.get(assigns, :theme_editing, false)}
editor_dirty={@editor_dirty}
theme_dirty={Map.get(assigns, :theme_dirty, false)}
site_dirty={Map.get(assigns, :site_dirty, false)}
editor_sheet_state={assigns[:editor_sheet_state] || :collapsed}
editor_save_status={@editor_save_status}
editor_active_tab={Map.get(assigns, :editor_active_tab, :page)}
editor_nav_blocked={Map.get(assigns, :editor_nav_blocked)}
has_editable_page={@page != nil}
>
<.editor_panel_content
@@ -123,6 +126,15 @@ defmodule BerrypodWeb.PageRenderer do
settings_form={Map.get(assigns, :settings_form)}
settings_dirty={Map.get(assigns, :settings_dirty, false)}
settings_save_status={Map.get(assigns, :settings_save_status, :idle)}
site_header_nav={Map.get(assigns, :site_header_nav, [])}
site_footer_nav={Map.get(assigns, :site_footer_nav, [])}
site_social_links={Map.get(assigns, :site_social_links, [])}
site_announcement_text={Map.get(assigns, :site_announcement_text, "")}
site_announcement_link={Map.get(assigns, :site_announcement_link, "")}
site_announcement_style={Map.get(assigns, :site_announcement_style, "info")}
site_footer_about={Map.get(assigns, :site_footer_about, "")}
site_footer_copyright={Map.get(assigns, :site_footer_copyright, "")}
site_footer_show_newsletter={Map.get(assigns, :site_footer_show_newsletter, true)}
/>
</.editor_sheet>
"""
@@ -160,6 +172,15 @@ defmodule BerrypodWeb.PageRenderer do
attr :settings_form, :map, default: nil
attr :settings_dirty, :boolean, default: false
attr :settings_save_status, :atom, default: :idle
attr :site_header_nav, :list, default: []
attr :site_footer_nav, :list, default: []
attr :site_social_links, :list, default: []
attr :site_announcement_text, :string, default: ""
attr :site_announcement_link, :string, default: ""
attr :site_announcement_style, :string, default: "info"
attr :site_footer_about, :string, default: ""
attr :site_footer_copyright, :string, default: ""
attr :site_footer_show_newsletter, :boolean, default: true
defp editor_panel_content(%{editor_active_tab: :page} = assigns) do
~H"""
@@ -200,6 +221,7 @@ defmodule BerrypodWeb.PageRenderer do
end
defp editor_panel_content(%{editor_active_tab: :settings} = assigns) do
# Legacy settings tab - will be removed once page settings are merged into Page tab
~H"""
<BerrypodWeb.ShopComponents.SettingsEditor.settings_editor
page={@page}
@@ -213,6 +235,22 @@ defmodule BerrypodWeb.PageRenderer do
"""
end
defp editor_panel_content(%{editor_active_tab: :site} = assigns) do
~H"""
<BerrypodWeb.ShopComponents.SiteEditor.site_editor
site_header_nav={@site_header_nav}
site_footer_nav={@site_footer_nav}
site_social_links={@site_social_links}
site_announcement_text={@site_announcement_text}
site_announcement_link={@site_announcement_link}
site_announcement_style={@site_announcement_style}
site_footer_about={@site_footer_about}
site_footer_copyright={@site_footer_copyright}
site_footer_show_newsletter={@site_footer_show_newsletter}
/>
"""
end
# Theme editor content - uses shared component
attr :theme_editor_settings, :map, default: nil
attr :theme_editor_active_preset, :atom, default: nil
@@ -467,7 +505,7 @@ defmodule BerrypodWeb.PageRenderer do
end
defp render_block(%{block: %{"type" => "social_links_card"}} = assigns) do
~H"<.social_links_card />"
~H"<.social_links_card links={assigns[:social_links] || []} />"
end
defp render_block(%{block: %{"type" => "info_card"}} = assigns) do