Skip to content

Commit

Permalink
Refactor route helper
Browse files Browse the repository at this point in the history
  • Loading branch information
tfwright committed Jul 10, 2023
1 parent 83d3d8b commit e5de5a8
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 104 deletions.
12 changes: 4 additions & 8 deletions dev.exs
Expand Up @@ -286,7 +286,7 @@ defmodule DemoWeb.CreateUserForm do
use Phoenix.LiveComponent
use Phoenix.HTML

import LiveAdmin, only: [route_with_params: 4]
import LiveAdmin, only: [route_with_params: 2]
import LiveAdmin.ErrorHelpers

@impl true
Expand Down Expand Up @@ -367,19 +367,15 @@ defmodule DemoWeb.CreateUserForm do
end

@impl true
def handle_event(
"create",
%{"params" => params},
socket = %{assigns: %{prefix: prefix, base_path: base_path, key: key}}
) do
def handle_event("create", %{"params" => params}, socket = %{assigns: assigns}) do
socket =
%Demo.Accounts.User{}
|> Ecto.Changeset.cast(params, [:name, :email, :stars_count, :roles])
|> Ecto.Changeset.validate_required([:name, :email])
|> Ecto.Changeset.unique_constraint(:email)
|> Demo.Repo.insert(prefix: prefix)
|> Demo.Repo.insert(prefix: assigns.prefix)
|> case do
{:ok, _} -> push_redirect(socket, to: route_with_params(base_path, key, [], prefix: prefix))
{:ok, _} -> push_redirect(socket, to: route_with_params(assigns, params: [prefix: assigns.prefix]))
{:error, changeset} -> assign(socket, changeset: changeset)
end

Expand Down
18 changes: 14 additions & 4 deletions lib/live_admin.ex
@@ -1,11 +1,18 @@
defmodule LiveAdmin do
@moduledoc docout: [LiveAdmin.READMECompiler]

def route_with_params(base_path, resource_path, segments \\ [], params \\ []) do
def route_with_params(assigns, parts \\ []) do
resource_path = parts[:resource_path] || assigns.key

encoded_params =
params
parts
|> Keyword.get(:params, [])
|> Enum.into(%{})
|> Enum.flat_map(fn
{:prefix, nil} -> []
{_, nil} -> []
{:sort_attr, val} -> [{:"sort-attr", val}]
{:sort_dir, val} -> [{:"sort-dir", val}]
{:search, val} -> [{:s, val}]
pair -> [pair]
end)
|> Enum.into(%{})
Expand All @@ -14,7 +21,10 @@ defmodule LiveAdmin do
_ -> ""
end

Path.join([base_path, resource_path] ++ Enum.map(segments, &Phoenix.Param.to_param/1)) <>
Path.join(
[assigns.base_path, resource_path] ++
Enum.map(parts[:segments] || [], &Phoenix.Param.to_param/1)
) <>
encoded_params
end

Expand Down
41 changes: 16 additions & 25 deletions lib/live_admin/components/container.ex
Expand Up @@ -5,8 +5,8 @@ defmodule LiveAdmin.Components.Container do
import LiveAdmin,
only: [
resource_title: 1,
route_with_params: 1,
route_with_params: 2,
route_with_params: 4,
trans: 1
]

Expand Down Expand Up @@ -48,17 +48,11 @@ defmodule LiveAdmin.Components.Container do

@impl true
def handle_params(params, uri, socket = %{assigns: %{live_action: :list, loading: false}}) do
page = String.to_integer(params["page"] || "1")

sort = {
String.to_existing_atom(params["sort-dir"] || "asc"),
String.to_existing_atom(params["sort-attr"] || "id")
}

socket =
socket
|> assign(page: page)
|> assign(sort: sort)
|> assign(page: String.to_integer(params["page"] || "1"))
|> assign(sort_attr: String.to_existing_atom(params["sort-attr"] || "id"))
|> assign(sort_dir: String.to_existing_atom(params["sort-dir"] || "asc"))
|> assign(search: params["s"])
|> assign_resource_info(uri)
|> assign_prefix(params)
Expand Down Expand Up @@ -129,12 +123,12 @@ defmodule LiveAdmin.Components.Container do
<div class="resource__actions">
<div>
<%= live_redirect(trans("List"),
to: route_with_params(@base_path, @key, [], prefix: @prefix),
to: route_with_params(assigns, params: [prefix: @prefix]),
class: "resource__action--btn"
) %>
<%= if @resource.__live_admin_config__(:create_with) != false do %>
<%= live_redirect(trans("New"),
to: route_with_params(@base_path, @key, ["new"], prefix: @prefix),
to: route_with_params(assigns, segments: ["new"], params: [prefix: @prefix]),
class: "resource__action--btn"
) %>
<% else %>
Expand Down Expand Up @@ -172,14 +166,14 @@ defmodule LiveAdmin.Components.Container do
<ul>
<%= if @prefix do %>
<li>
<.link patch={route_with_params(@base_path, @key, [], prefix: "")}>
<.link patch={route_with_params(assigns, params: [prefix: ""])}>
<%= trans("clear") %>
</.link>
</li>
<% end %>
<%= for option <- @prefix_options, to_string(option) != @prefix do %>
<li>
<.link patch={route_with_params(@base_path, @key, [], prefix: option)}>
<.link patch={route_with_params(assigns, params: [prefix: option])}>
<%= option %>
</.link>
</li>
Expand Down Expand Up @@ -224,7 +218,8 @@ defmodule LiveAdmin.Components.Container do
key={@key}
resource={@resource}
page={@page}
sort={@sort}
sort_attr={@sort_attr}
sort_dir={@sort_dir}
search={@search}
prefix={@prefix}
session={@session}
Expand Down Expand Up @@ -280,34 +275,30 @@ defmodule LiveAdmin.Components.Container do
end

defp assign_prefix(socket, %{"prefix" => ""}) do
assign_and_presist_prefix(socket, nil)

push_redirect(socket,
to: route_with_params(socket.assigns.base_path, socket.assigns.key)
)
socket
|> assign_and_presist_prefix(nil)
|> push_redirect(to: route_with_params(socket.assigns))
end

defp assign_prefix(socket, %{"prefix" => prefix}) do
socket.assigns.prefix_options
|> Enum.find(fn option -> to_string(option) == prefix end)
|> case do
nil ->
push_redirect(socket,
to: route_with_params(socket.assigns.base_path, socket.assigns.key)
)
push_redirect(socket, to: route_with_params(socket.assigns))

prefix ->
assign_and_presist_prefix(socket, prefix)
end
end

defp assign_prefix(socket = %{assigns: %{session: session, base_path: base_path, key: key}}, _) do
defp assign_prefix(socket = %{assigns: %{session: session}}, _) do
case session.prefix do
nil ->
assign_and_presist_prefix(socket, nil)

prefix ->
push_patch(socket, to: route_with_params(base_path, key, [], prefix: prefix))
push_patch(socket, to: route_with_params(socket.assigns, params: [prefix: prefix]))
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/live_admin/components/layout/app.html.heex
Expand Up @@ -3,12 +3,12 @@
<.live_component
id="nav"
module={@nav_mod}
socket={@socket}
title={@title}
base_path={@base_path}
resources={@resources}
resource={assigns[:resource]}
prefix={assigns[:prefix]}
key={assigns[:key]}
/>
<div class="content">
<%= @inner_content %>
Expand Down
8 changes: 5 additions & 3 deletions lib/live_admin/components/nav.ex
Expand Up @@ -3,7 +3,7 @@ defmodule LiveAdmin.Components.Nav do
use Phoenix.HTML

import LiveAdmin,
only: [resource_title: 1, route_with_params: 3, route_with_params: 4, trans: 1]
only: [resource_title: 1, route_with_params: 2, trans: 1]

@impl true
def render(assigns) do
Expand All @@ -20,7 +20,9 @@ defmodule LiveAdmin.Components.Nav do
</ul>
</li>
<li class="nav__item--group">
<%= live_redirect(trans("Session"), to: route_with_params(@base_path, "session", [])) %>
<%= live_redirect(trans("Session"),
to: route_with_params(assigns, resource_path: "session")
) %>
</li>
</ul>
</div>
Expand Down Expand Up @@ -53,7 +55,7 @@ defmodule LiveAdmin.Components.Nav do
resource
|> resource_title()
|> live_redirect(
to: route_with_params(assigns.base_path, key, [], prefix: assigns["prefix"])
to: route_with_params(assigns, resource_path: key, prefix: assigns[:prefix])
)
end

Expand Down
7 changes: 2 additions & 5 deletions lib/live_admin/components/resource/form.ex
Expand Up @@ -3,7 +3,7 @@ defmodule LiveAdmin.Components.Container.Form do
use Phoenix.HTML

import LiveAdmin.ErrorHelpers
import LiveAdmin, only: [associated_resource: 3, route_with_params: 4, trans: 1]
import LiveAdmin, only: [associated_resource: 3, route_with_params: 2, trans: 1]

alias __MODULE__.{ArrayInput, MapInput, SearchSelect}
alias LiveAdmin.Resource
Expand Down Expand Up @@ -91,10 +91,7 @@ defmodule LiveAdmin.Components.Container.Form do
def handle_event("after_create", _, socket) do
{:noreply,
push_redirect(socket,
to:
route_with_params(socket.assigns.base_path, socket.assigns.key, [],
prefix: socket.assigns.prefix
)
to: route_with_params(socket.assigns, params: [prefix: socket.assigns.prefix])
)}
end

Expand Down

0 comments on commit e5de5a8

Please sign in to comment.