add Site context with social links editor and site-wide settings
Some checks failed
deploy / deploy (push) Has been cancelled
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user