merge page settings into Page tab and remove Settings tab
All checks were successful
deploy / deploy (push) Successful in 3m37s
All checks were successful
deploy / deploy (push) Successful in 3m37s
Custom page settings (title, slug, meta, published, navigation) now appear as a collapsible section at the top of the Page tab. The separate Settings tab has been fully removed. - Add page_settings_section component to page_renderer.ex - Remove dead :settings case from editor_panel_content - Delete settings_editor.ex component entirely - Remove SettingsEditor import from shop_components.ex - Add .page-settings-* CSS styles - Clean up old .settings-* CSS styles Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -120,9 +120,6 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
theme_editor_contrast_warning={Map.get(assigns, :theme_editor_contrast_warning, :ok)}
|
||||
uploads={Map.get(assigns, :uploads)}
|
||||
site_name={Map.get(assigns, :site_name, "")}
|
||||
product={assigns[:product]}
|
||||
collection_title={assigns[:collection_title]}
|
||||
live_action={assigns[:live_action]}
|
||||
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)}
|
||||
@@ -159,9 +156,6 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
attr :theme_editor_contrast_warning, :atom, default: :ok
|
||||
attr :uploads, :map, default: nil
|
||||
attr :site_name, :string, default: ""
|
||||
attr :product, :map, default: nil
|
||||
attr :collection_title, :string, default: nil
|
||||
attr :live_action, :atom, default: nil
|
||||
attr :settings_form, :map, default: nil
|
||||
attr :settings_dirty, :boolean, default: false
|
||||
attr :settings_save_status, :atom, default: :idle
|
||||
@@ -185,6 +179,9 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
editor_image_picker_images={@editor_image_picker_images}
|
||||
editor_image_picker_search={@editor_image_picker_search}
|
||||
editor_at_defaults={@editor_at_defaults}
|
||||
settings_form={@settings_form}
|
||||
settings_dirty={@settings_dirty}
|
||||
settings_save_status={@settings_save_status}
|
||||
/>
|
||||
"""
|
||||
end
|
||||
@@ -206,21 +203,6 @@ 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}
|
||||
product={@product}
|
||||
collection_title={@collection_title}
|
||||
live_action={@live_action}
|
||||
settings_form={@settings_form}
|
||||
settings_dirty={@settings_dirty}
|
||||
settings_save_status={@settings_save_status}
|
||||
/>
|
||||
"""
|
||||
end
|
||||
|
||||
defp editor_panel_content(%{editor_active_tab: :site} = assigns) do
|
||||
~H"""
|
||||
<BerrypodWeb.ShopComponents.SiteEditor.site_editor
|
||||
@@ -282,6 +264,9 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
attr :editor_image_picker_images, :list, default: []
|
||||
attr :editor_image_picker_search, :string, default: ""
|
||||
attr :editor_at_defaults, :boolean, default: true
|
||||
attr :settings_form, :map, default: nil
|
||||
attr :settings_dirty, :boolean, default: false
|
||||
attr :settings_save_status, :atom, default: :idle
|
||||
|
||||
defp editor_sheet_content(assigns) do
|
||||
~H"""
|
||||
@@ -320,6 +305,15 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
{if @editor_live_region_message, do: @editor_live_region_message}
|
||||
</div>
|
||||
|
||||
<%!-- Page settings for custom pages --%>
|
||||
<.page_settings_section
|
||||
:if={@page[:type] == "custom"}
|
||||
page={@page}
|
||||
form={@settings_form}
|
||||
dirty={@settings_dirty}
|
||||
save_status={@settings_save_status}
|
||||
/>
|
||||
|
||||
<%!-- Block list --%>
|
||||
<div class="block-list" role="list" aria-label="Page blocks">
|
||||
<.block_card
|
||||
@@ -370,6 +364,141 @@ defmodule BerrypodWeb.PageRenderer do
|
||||
"""
|
||||
end
|
||||
|
||||
# Page settings section for custom pages (collapsible)
|
||||
attr :page, :map, required: true
|
||||
attr :form, :map, default: nil
|
||||
attr :dirty, :boolean, default: false
|
||||
attr :save_status, :atom, default: :idle
|
||||
|
||||
defp page_settings_section(assigns) do
|
||||
form = assigns.form || %{}
|
||||
|
||||
assigns =
|
||||
assigns
|
||||
|> 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_nav_position,
|
||||
form["nav_position"] || to_string(assigns.page.nav_position || 0)
|
||||
)
|
||||
|
||||
~H"""
|
||||
<details class="page-settings-details" open>
|
||||
<summary class="page-settings-summary">
|
||||
<.icon name="hero-cog-6-tooth-mini" class="size-4" />
|
||||
<span>Page settings</span>
|
||||
<.icon name="hero-chevron-down-mini" class="size-4 page-settings-chevron" />
|
||||
</summary>
|
||||
|
||||
<form
|
||||
id="page-settings-form"
|
||||
class="page-settings-form"
|
||||
phx-change="settings_validate_page"
|
||||
phx-submit="settings_save_page"
|
||||
>
|
||||
<div class="page-settings-field">
|
||||
<label class="page-settings-label" for="page-settings-title">Title</label>
|
||||
<input
|
||||
type="text"
|
||||
id="page-settings-title"
|
||||
name="page[title]"
|
||||
value={@form_title}
|
||||
class="admin-input"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="page-settings-field">
|
||||
<label class="page-settings-label" for="page-settings-slug">URL slug</label>
|
||||
<div class="page-settings-slug-input">
|
||||
<span class="page-settings-slug-prefix">/</span>
|
||||
<input
|
||||
type="text"
|
||||
id="page-settings-slug"
|
||||
name="page[slug]"
|
||||
value={@form_slug}
|
||||
class="admin-input"
|
||||
pattern="[a-z0-9-]+"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page-settings-field">
|
||||
<label class="page-settings-label" for="page-settings-meta">Meta description</label>
|
||||
<textarea
|
||||
id="page-settings-meta"
|
||||
name="page[meta_description]"
|
||||
rows="2"
|
||||
class="admin-input admin-textarea"
|
||||
placeholder="Brief description for search engines..."
|
||||
>{@form_meta}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="page-settings-checks">
|
||||
<label class="admin-check-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="page[published]"
|
||||
value="true"
|
||||
checked={@form_published}
|
||||
class="admin-checkbox admin-checkbox-sm"
|
||||
/>
|
||||
<span>Published</span>
|
||||
</label>
|
||||
|
||||
<label class="admin-check-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="page[show_in_nav]"
|
||||
value="true"
|
||||
checked={@form_show_in_nav}
|
||||
class="admin-checkbox admin-checkbox-sm"
|
||||
/>
|
||||
<span>Show in navigation</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div :if={@form_show_in_nav} class="page-settings-nav-options">
|
||||
<div class="page-settings-field page-settings-field-inline">
|
||||
<label class="page-settings-label" for="page-settings-nav-label">Nav label</label>
|
||||
<input
|
||||
type="text"
|
||||
id="page-settings-nav-label"
|
||||
name="page[nav_label]"
|
||||
value={@form_nav_label}
|
||||
class="admin-input"
|
||||
placeholder={@page.title}
|
||||
/>
|
||||
</div>
|
||||
<div class="page-settings-field page-settings-field-sm">
|
||||
<label class="page-settings-label" for="page-settings-nav-position">Position</label>
|
||||
<input
|
||||
type="number"
|
||||
id="page-settings-nav-position"
|
||||
name="page[nav_position]"
|
||||
value={@form_nav_position}
|
||||
class="admin-input"
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</details>
|
||||
"""
|
||||
end
|
||||
|
||||
defp form_checked?(form, key, page_value) when is_map(form) do
|
||||
case form[key] do
|
||||
"true" -> true
|
||||
"false" -> false
|
||||
nil -> page_value == true
|
||||
_ -> page_value == true
|
||||
end
|
||||
end
|
||||
|
||||
# ── Block dispatch ──────────────────────────────────────────────
|
||||
|
||||
defp render_block(%{block: %{"type" => "hero"}} = assigns) do
|
||||
|
||||
Reference in New Issue
Block a user