From 5bb96b433cfcf0f73226894defb3f8f2f69c9457 Mon Sep 17 00:00:00 2001 From: Neel Vinoth Date: Wed, 7 Oct 2026 14:14:50 -0400 Subject: [PATCH 1/3] Implement mode switching between list and map views in community fridge index --- .../community_fridge_live/form_component.ex | 4 +- .../live/community_fridge_live/index.ex | 20 ++++- .../community_fridge_live/index.html.heex | 77 +++++++++++++------ 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/lib/bike_brigade_web/live/community_fridge_live/form_component.ex b/lib/bike_brigade_web/live/community_fridge_live/form_component.ex index 2f0a7697..1f8e917b 100644 --- a/lib/bike_brigade_web/live/community_fridge_live/form_component.ex +++ b/lib/bike_brigade_web/live/community_fridge_live/form_component.ex @@ -58,7 +58,7 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.FormComponent do {:noreply, socket |> put_flash(:info, "Community fridge updated successfully") - |> push_navigate(to: socket.assigns.navigate)} + |> push_patch(to: socket.assigns.navigate)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, :changeset, changeset)} @@ -71,7 +71,7 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.FormComponent do {:noreply, socket |> put_flash(:info, "Community fridge created successfully") - |> push_navigate(to: socket.assigns.navigate)} + |> push_patch(to: socket.assigns.navigate)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, changeset: changeset)} diff --git a/lib/bike_brigade_web/live/community_fridge_live/index.ex b/lib/bike_brigade_web/live/community_fridge_live/index.ex index 2776253a..c03bc87e 100644 --- a/lib/bike_brigade_web/live/community_fridge_live/index.ex +++ b/lib/bike_brigade_web/live/community_fridge_live/index.ex @@ -15,7 +15,8 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.Index do |> assign(:community_fridge, nil) |> assign(:community_fridges, []) |> assign(:map_layers, []) - |> assign(:map_coords, @default_coords)} + |> assign(:map_coords, @default_coords) + |> assign(:mode, :list)} end @impl Phoenix.LiveView @@ -23,6 +24,20 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.Index do {:noreply, apply_action(socket, socket.assigns.live_action, params)} end + @impl Phoenix.LiveView + def handle_event("set_mode", %{"mode" => mode}, socket) do + socket = assign(socket, :mode, String.to_existing_atom(mode)) + + socket = + if socket.assigns.mode == :map do + push_event(socket, "leaflet:redraw_map", %{recenter: false}) + else + socket + end + + {:noreply, socket} + end + defp apply_action(socket, :index, _params) do community_fridges = Locations.list_community_fridges() @@ -64,9 +79,6 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.Index do end end - # Toronto city hall as fallback centre - @default_coords %Geo.Point{coordinates: {-79.3832, 43.6532}} - defp map_center(community_fridges) do community_fridges |> Enum.find_value(fn %{location: location} -> diff --git a/lib/bike_brigade_web/live/community_fridge_live/index.html.heex b/lib/bike_brigade_web/live/community_fridge_live/index.html.heex index 6ff4cd11..6d027b5e 100644 --- a/lib/bike_brigade_web/live/community_fridge_live/index.html.heex +++ b/lib/bike_brigade_web/live/community_fridge_live/index.html.heex @@ -4,36 +4,65 @@ Community fridges are neighbourhood food-sharing locations. Dispatchers can manage fridge details here. -<.map id="community-fridges-map" coords={@map_coords} initial_layers={@map_layers} class="w-full h-64 mb-4" /> -
+
+
+ + +
<.button patch={~p"/community_fridges/new"}> New Community Fridge
-<.table id="community_fridges" rows={@community_fridges}> - <:col :let={community_fridge} label="Name"> - {community_fridge.name} - - <:col :let={community_fridge} label="Address"> - {community_fridge.location} - - <:col :let={community_fridge} label="Description"> - {community_fridge.description} - - <:col :let={community_fridge} label="Pair Preferred"> - {if community_fridge.pair_preferred, do: "Yes", else: "No"} - - <:col :let={community_fridge} label="Active"> - {if community_fridge.active, do: "Yes", else: "No"} - - <:action :let={community_fridge}> - <.link patch={~p"/community_fridges/#{community_fridge.id}/edit"} class="link"> - Edit - - - +<%= if @mode == :map do %> +
+
+ <.map + id="community-fridges-map" + coords={@map_coords} + initial_layers={@map_layers} + class="h-full" + /> +
+
+<% else %> + <.table id="community_fridges" rows={@community_fridges}> + <:col :let={community_fridge} label="Name"> + {community_fridge.name} + + <:col :let={community_fridge} label="Address"> + {community_fridge.location} + + <:col :let={community_fridge} label="Description"> + {community_fridge.description} + + <:col :let={community_fridge} label="Pair Preferred"> + {if community_fridge.pair_preferred, do: "Yes", else: "No"} + + <:col :let={community_fridge} label="Active"> + {if community_fridge.active, do: "Yes", else: "No"} + + + <:action :let={community_fridge}> + <.link patch={~p"/community_fridges/#{community_fridge.id}/edit"} class="link"> + Edit + + + +<% end %> <.modal :if={@live_action in [:new, :edit]} From 277cc3db7818af4bb1aaa3aff5d04e04d01754d5 Mon Sep 17 00:00:00 2001 From: Neel Vinoth Date: Thu, 8 Oct 2026 10:28:17 -0400 Subject: [PATCH 2/3] Update CommunityFridgeLive: set default location for new fridge and remove map component from index --- lib/bike_brigade_web/live/community_fridge_live/index.ex | 2 +- .../live/community_fridge_live/index.html.heex | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/bike_brigade_web/live/community_fridge_live/index.ex b/lib/bike_brigade_web/live/community_fridge_live/index.ex index bf44f7e6..ac39f608 100644 --- a/lib/bike_brigade_web/live/community_fridge_live/index.ex +++ b/lib/bike_brigade_web/live/community_fridge_live/index.ex @@ -50,7 +50,7 @@ defmodule BikeBrigadeWeb.CommunityFridgeLive.Index do defp apply_action(socket, :new, _params) do socket |> assign(:page_title, "New Fridge") - |> assign(:community_fridge, %CommunityFridge{}) + |> assign(:community_fridge, %CommunityFridge{location: nil}) end defp apply_action(socket, :edit, %{"id" => id}) do diff --git a/lib/bike_brigade_web/live/community_fridge_live/index.html.heex b/lib/bike_brigade_web/live/community_fridge_live/index.html.heex index fabf43a8..92cd6840 100644 --- a/lib/bike_brigade_web/live/community_fridge_live/index.html.heex +++ b/lib/bike_brigade_web/live/community_fridge_live/index.html.heex @@ -4,13 +4,6 @@ Community fridges are neighbourhood food-sharing locations. Dispatchers can manage fridge details here. -<.map - id="community-fridges-map" - coords={@map_coords} - initial_layers={@map_layers} - class="w-full h-64 mb-4" -/> -