extract site_name and site_description from theme settings into standalone settings

site_name and site_description are shop identity, not theme concerns.
They now live in the Settings table as first-class settings with their
own assigns (@site_name, @site_description) piped through hooks and
plugs. The setup wizard writes site_name on account creation, and the
theme editor reads/writes via Settings.put_setting. Removed the
"configure your shop" checklist item since currency/country aren't
built yet. Also adds shop name field to setup wizard step 1.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-03-03 14:52:31 +00:00
parent 8ea77e5992
commit 5b41f3fedf
25 changed files with 464 additions and 255 deletions

View File

@@ -26,6 +26,8 @@ defmodule BerrypodWeb.Admin.Theme.Index do
socket =
socket
|> assign(:theme_settings, theme_settings)
|> assign(:site_name, Settings.site_name())
|> assign(:site_description, Settings.site_description())
|> assign(:generated_css, generated_css)
|> assign(:preview_page, :home)
|> assign(:presets_with_descriptions, Presets.all_with_descriptions())
@@ -174,6 +176,16 @@ defmodule BerrypodWeb.Admin.Theme.Index do
{:noreply, socket}
end
# Settings stored outside the theme JSON
@standalone_settings ~w(site_name site_description)
@impl true
def handle_event("update_setting", %{"field" => field, "setting_value" => value}, socket)
when field in @standalone_settings do
Settings.put_setting(field, value, "string")
{:noreply, assign(socket, String.to_existing_atom(field), value)}
end
@impl true
def handle_event("update_setting", %{"field" => field, "setting_value" => value}, socket) do
field_atom = String.to_existing_atom(field)
@@ -197,6 +209,19 @@ defmodule BerrypodWeb.Admin.Theme.Index do
end
end
@impl true
def handle_event("update_setting", %{"field" => field} = params, socket)
when field in @standalone_settings do
value = params[field]
if value do
Settings.put_setting(field, value, "string")
{:noreply, assign(socket, String.to_existing_atom(field), value)}
else
{:noreply, socket}
end
end
@impl true
def handle_event("update_setting", %{"field" => field} = params, socket) do
# For phx-change events from select/input elements, the value comes from the name attribute
@@ -439,6 +464,7 @@ defmodule BerrypodWeb.Admin.Theme.Index do
attr :page, :atom, required: true
attr :preview_data, :map, required: true
attr :theme_settings, :map, required: true
attr :site_name, :string, required: true
attr :logo_image, :any, required: true
attr :header_image, :any, required: true
attr :cart_drawer_open, :boolean, default: false

View File

@@ -74,7 +74,7 @@
<input
type="text"
name="site_name"
value={@theme_settings.site_name}
value={@site_name}
placeholder="Your shop name"
class="admin-input admin-input-lg"
/>
@@ -374,7 +374,7 @@
type="text"
name="favicon_short_name"
value={@theme_settings.favicon_short_name}
placeholder={String.slice(@theme_settings.site_name, 0, 12)}
placeholder={String.slice(@site_name, 0, 12)}
maxlength="12"
class="admin-input admin-input-sm"
/>
@@ -1181,7 +1181,7 @@
<path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
</svg>
<span class="theme-browser-url-text truncate">
{@theme_settings.site_name |> String.downcase() |> String.replace(" ", "")}.myshopify.com
{@site_name |> String.downcase() |> String.replace(" ", "")}.myshopify.com
</span>
</div>
</div>
@@ -1213,6 +1213,7 @@
page={@preview_page}
preview_data={@preview_data}
theme_settings={@theme_settings}
site_name={@site_name}
logo_image={@logo_image}
header_image={@header_image}
cart_drawer_open={@cart_drawer_open}