defmodule LocalspotWeb.AdminLive.Businesses do use LocalspotWeb, :live_view alias Localspot.Businesses @impl true def mount(_params, _session, socket) do {:ok, socket |> assign(:page_title, "Manage Businesses") |> assign(:businesses, Businesses.list_all_businesses()) |> assign(:filter, "all") |> assign(:confirm_delete, nil)} end @impl true def handle_event("filter", %{"filter" => filter}, socket) do {:noreply, socket |> assign(:filter, filter) |> assign(:businesses, filter_businesses(filter))} end @impl true def handle_event("deactivate", %{"id" => id}, socket) do business = Businesses.get_any_business(id) case Businesses.deactivate_business(business) do {:ok, _business} -> {:noreply, socket |> put_flash(:info, "#{business.name} has been deactivated") |> assign(:businesses, filter_businesses(socket.assigns.filter))} {:error, _changeset} -> {:noreply, put_flash(socket, :error, "Failed to deactivate business")} end end @impl true def handle_event("activate", %{"id" => id}, socket) do business = Businesses.get_any_business(id) case Businesses.activate_business(business) do {:ok, _business} -> {:noreply, socket |> put_flash(:info, "#{business.name} has been reactivated") |> assign(:businesses, filter_businesses(socket.assigns.filter))} {:error, _changeset} -> {:noreply, put_flash(socket, :error, "Failed to activate business")} end end @impl true def handle_event("confirm_delete", %{"id" => id}, socket) do {:noreply, assign(socket, :confirm_delete, id)} end @impl true def handle_event("cancel_delete", _params, socket) do {:noreply, assign(socket, :confirm_delete, nil)} end @impl true def handle_event("delete", %{"id" => id}, socket) do business = Businesses.get_any_business(id) case Businesses.delete_business(business) do {:ok, _business} -> {:noreply, socket |> put_flash(:info, "#{business.name} has been permanently deleted") |> assign(:confirm_delete, nil) |> assign(:businesses, filter_businesses(socket.assigns.filter))} {:error, _changeset} -> {:noreply, socket |> put_flash(:error, "Failed to delete business") |> assign(:confirm_delete, nil)} end end defp filter_businesses("all"), do: Businesses.list_all_businesses() defp filter_businesses("active") do Businesses.list_all_businesses() |> Enum.filter(& &1.active) end defp filter_businesses("inactive") do Businesses.list_all_businesses() |> Enum.filter(&(!&1.active)) end @impl true def render(assigns) do ~H""" <.header> Manage Businesses <:subtitle>View, deactivate, or remove businesses from the directory <:actions> <.link navigate={~p"/admin/import"} class="btn btn-outline btn-sm"> <.icon name="hero-arrow-up-tray" class="w-4 h-4" /> Import
{length(@businesses)} business(es)
<.icon name="hero-information-circle" class="w-5 h-5" /> No businesses found.
Name Category Location Status Actions
{business.name}
{business.slug}
{business.category.name}
{business.city}, {business.state}
Active Inactive
<.link navigate={~p"/businesses/#{business.slug}"} class="btn btn-ghost btn-xs" title="View" > <.icon name="hero-eye" class="w-4 h-4" />
""" end end