feat: add order management admin with list and detail views
Admin UI at /admin/orders to view, filter, and inspect orders. Adds list_orders/1 and count_orders_by_status/0 to the Orders context, status filter tabs, clickable order table with streams, and a detail page showing items, totals, and shipping address. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,41 @@ defmodule SimpleshopTheme.Orders do
|
||||
alias SimpleshopTheme.Repo
|
||||
alias SimpleshopTheme.Orders.{Order, OrderItem}
|
||||
|
||||
@doc """
|
||||
Lists orders, optionally filtered by payment status.
|
||||
|
||||
## Options
|
||||
|
||||
* `:status` - filter by payment_status ("paid", "pending", "failed", "refunded")
|
||||
Pass nil or "all" to return all orders.
|
||||
|
||||
Returns orders sorted by newest first, with items preloaded.
|
||||
"""
|
||||
def list_orders(opts \\ []) do
|
||||
status = opts[:status]
|
||||
|
||||
Order
|
||||
|> maybe_filter_status(status)
|
||||
|> order_by([o], desc: o.inserted_at)
|
||||
|> preload(:items)
|
||||
|> Repo.all()
|
||||
end
|
||||
|
||||
defp maybe_filter_status(query, nil), do: query
|
||||
defp maybe_filter_status(query, "all"), do: query
|
||||
defp maybe_filter_status(query, status), do: where(query, [o], o.payment_status == ^status)
|
||||
|
||||
@doc """
|
||||
Returns a map of payment_status => count for all orders.
|
||||
"""
|
||||
def count_orders_by_status do
|
||||
Order
|
||||
|> group_by(:payment_status)
|
||||
|> select([o], {o.payment_status, count(o.id)})
|
||||
|> Repo.all()
|
||||
|> Map.new()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Creates an order with line items from hydrated cart data.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user