Below are the index module I have a little bit modified the code from the book, Programming Phoenix LiveView, Beta 0.9, Part 1, to combine the SortingComponent of the book, Building Table Views with Phoenix LiveView .
defmodule MarketWeb.ProductLive.Index do
use MarketWeb, :live_view
alias MarketWeb.Router.Helpers, as: Routes
alias Market.Catalog
alias Market.Catalog.Product
alias MarketWeb.Forms.SortingForm
require Logger
@impl true
def mount(_params, _session, socket) do
{:ok, stream(socket, :products, Catalog.list_products())}
# {:ok, stream(socket, :products, [nil])}
end
@impl true
def handle_params(params, _url, socket) do
IO.inspect(params, label: "handle_params, params")
socket =
socket
|> parse_params(params)
# |> IO.inspect
|> assign_products()
{:noreply, apply_action(socket, socket.assigns.live_action, params)}
end
defp parse_params(socket, params) do
with {:ok, sorting_opts} <- SortingForm.parse(params) do
assign_sorting(socket, sorting_opts)
else
_error ->
assign_sorting(socket)
end
end
defp assign_sorting(socket, overrides \\ %{}) do
opts = Map.merge(SortingForm.default_values(), overrides)
assign(socket, :sorting, opts) # |> IO.inspect
end
# Update assign_products/1 like this:
defp assign_products(socket) do
%{sorting: sorting} = socket.assigns
assign(socket, :products, Catalog.list_products(sorting))
end
defp apply_action(socket, :edit, %{"id" => id}) do
socket
|> assign(:page_title, "Edit Product")
|> assign(:product, Catalog.get_product!(id))
end
defp apply_action(socket, :new, _params) do
socket
|> assign(:page_title, "New Product")
|> assign(:product, %Product{})
end
defp apply_action(socket, :index, params) do
IO.inspect(params, label: "apply_action, :index, params")
socket
|> assign(:page_title, "Listing Products")
|> assign(:product, Catalog.list_products(params))
end
def handle_info({:update, params}, socket) do
# IO.puts "ProductLive.handle_info({:update, params}, socket)"
# IO.inspect(params, label: "params")
# params = merge_and_sanitize_params(socket, params) # (1) delete nil values, (2) preserve old values in socket.assigns
# IO.inspect(params, label: "params")
# call handle_params
Logger.info "handling query"
IO.inspect(params, label: "params")
handle_params(params, "dummy", socket)
# path = Routes.live_path(socket, __MODULE__, params)
# {:noreply, push_navigate(socket, to: path, replace: true)}
{:noreply, push_navigate(socket, to: "/?page=1&page_size=20&sort_by=id&sort_dir=desc", replace: true)}
# {:noreply, push_navigate(socket, to: "/products", replace: true)}
end
@impl true
def handle_info({MarketWeb.ProductLive.FormComponent, {:saved, product}}, socket) do
{:noreply, stream_insert(socket, :products, product)}
end
@impl true
def handle_event("delete", %{"id" => id}, socket) do
product = Catalog.get_product!(id)
{:ok, _} = Catalog.delete_product(product)
{:noreply, stream_delete(socket, :products, product)}
end
end






















