From 5ce488fde603172bc143ef31e0a4064843475bac Mon Sep 17 00:00:00 2001
From: teesloane
Date: Thu, 6 Jun 2024 19:14:34 -0400
Subject: [PATCH 1/4] Add: "N available" copy to the dispatcher side.
---
.../helpers/campaign_helpers.ex | 50 +++++++++++++++++++
.../live/campaign_live/index.ex | 34 ++++++++++++-
.../live/campaign_live/index.html.heex | 8 +++
.../live/campaign_signup_live/index.ex | 45 +----------------
4 files changed, 92 insertions(+), 45 deletions(-)
diff --git a/lib/bike_brigade_web/helpers/campaign_helpers.ex b/lib/bike_brigade_web/helpers/campaign_helpers.ex
index 5403570e..60945467 100644
--- a/lib/bike_brigade_web/helpers/campaign_helpers.ex
+++ b/lib/bike_brigade_web/helpers/campaign_helpers.ex
@@ -1,6 +1,10 @@
defmodule BikeBrigadeWeb.CampaignHelpers do
alias BikeBrigade.Delivery.Task
alias BikeBrigade.Riders.Rider
+ alias BikeBrigade.Delivery
+ alias BikeBrigade.Utils
+
+ use BikeBrigadeWeb, :live_component
alias BikeBrigade.LocalizedDateTime
@@ -128,4 +132,50 @@ defmodule BikeBrigadeWeb.CampaignHelpers do
defp print_item(task_item) do
"#{task_item.count} #{Inflex.inflect(task_item.item.name, task_item.count)}"
end
+
+ attr :filled_tasks, :integer, required: true
+ attr :total_tasks, :integer, required: true
+ attr :campaign, :any, required: true
+
+ @doc """
+ Renders possible states of campaign "Fullness" in styled text.
+ """
+ def tasks_filled_text(assigns) do
+ {class, copy} =
+ cond do
+ assigns.filled_tasks == nil ->
+ {"text-gray-600", "N/A"}
+
+ campaign_in_past(assigns.campaign) ->
+ {"text-gray-600", "Campaign over"}
+
+ assigns.total_tasks - assigns.filled_tasks == 0 ->
+ {"text-gray-600", "Fully Assigned"}
+
+ true ->
+ {"text-red-400", "#{assigns.total_tasks - assigns.filled_tasks} Available"}
+ end
+
+ assigns =
+ assigns
+ |> assign(:class, class)
+ |> assign(:copy, copy)
+
+ ~H"""
+
+
+
+ <%= @copy %>
+
+
+ """
+ end
+
+ # Use this to determine if we need to refetch data to update the liveview.
+ # ex: dispatcher changes riders/tasks, or another rider signs up -> refetch.
+ def entity_in_campaigns?(campaigns, entity_campaign_id) do
+ campaigns
+ |> Enum.flat_map(fn {_date, campaigns} -> campaigns end)
+ |> Enum.any?(fn c -> c.id == entity_campaign_id end)
+ end
end
diff --git a/lib/bike_brigade_web/live/campaign_live/index.ex b/lib/bike_brigade_web/live/campaign_live/index.ex
index 79d7f127..c8f78b42 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.ex
+++ b/lib/bike_brigade_web/live/campaign_live/index.ex
@@ -7,11 +7,16 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
alias BikeBrigade.Delivery
alias BikeBrigade.Delivery.Campaign
alias BikeBrigade.Messaging.SmsMessage
+ alias BikeBrigadeWeb.Components.CampaignComponents
import BikeBrigadeWeb.CampaignHelpers
@impl true
def mount(_params, _session, socket) do
+ if connected?(socket) do
+ Delivery.subscribe()
+ end
+
current_week =
LocalizedDateTime.today()
|> Date.beginning_of_week()
@@ -21,7 +26,9 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
|> assign(:page, :campaigns)
|> assign(:page_title, "Campaigns")
|> assign(:current_week, current_week)
- |> assign(:campaigns, fetch_campaigns(current_week))}
+ |> assign(:campaigns, fetch_campaigns(current_week))
+ |> assign(:campaign_task_counts, Delivery.get_total_tasks_and_open_tasks(current_week))
+ }
end
@impl true
@@ -29,6 +36,23 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
{:noreply, apply_action(socket, socket.assigns.live_action, params)}
end
+ @broadcasted_infos [
+ :task_created,
+ :task_deleted,
+ :task_updated,
+ :campaign_rider_created,
+ :campaign_rider_deleted
+ ]
+
+ @impl Phoenix.LiveView
+ def handle_info({event, entity}, socket) when event in @broadcasted_infos do
+ if entity_in_campaigns?(socket.assigns.campaigns, entity.campaign_id) do
+ {:noreply, refetch_and_assign_data(socket)}
+ else
+ {:noreply, socket}
+ end
+ end
+
@impl true
def handle_event("delete", %{"id" => id}, socket) do
campaign = Delivery.get_campaign(id)
@@ -123,4 +147,12 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
def message_info(assigns) do
~H""
end
+
+ defp refetch_and_assign_data(socket) do
+ week = socket.assigns.current_week
+
+ socket
+ |> assign(:campaign_task_counts, Delivery.get_total_tasks_and_open_tasks(week))
+ |> assign(:campaigns, fetch_campaigns(week))
+ end
end
diff --git a/lib/bike_brigade_web/live/campaign_live/index.html.heex b/lib/bike_brigade_web/live/campaign_live/index.html.heex
index ec044205..c6cb3f61 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.html.heex
+++ b/lib/bike_brigade_web/live/campaign_live/index.html.heex
@@ -138,6 +138,14 @@
/>
<%= c.stats.task_count %>
+
+ <.tasks_filled_text
+ filled_tasks={@campaign_task_counts[c.id][:filled_tasks]}
+ total_tasks={@campaign_task_counts[c.id][:total_tasks]}
+ campaign={c}
+ />
+
+
<.message_info campaign={c} />
diff --git a/lib/bike_brigade_web/live/campaign_signup_live/index.ex b/lib/bike_brigade_web/live/campaign_signup_live/index.ex
index a403f741..7cb55e37 100644
--- a/lib/bike_brigade_web/live/campaign_signup_live/index.ex
+++ b/lib/bike_brigade_web/live/campaign_signup_live/index.ex
@@ -58,7 +58,7 @@ defmodule BikeBrigadeWeb.CampaignSignupLive.Index do
@impl Phoenix.LiveView
def handle_info({event, entity}, socket) when event in @broadcasted_infos do
- if entity_in_campaigns?(socket, entity.campaign_id) do
+ if entity_in_campaigns?(socket.assigns.campaigns, entity.campaign_id) do
{:noreply, refetch_and_assign_data(socket)}
else
{:noreply, socket}
@@ -115,49 +115,6 @@ defmodule BikeBrigadeWeb.CampaignSignupLive.Index do
|> assign(:campaigns, fetch_campaigns(week))
end
- # Use this to determine if we need to refetch data to update the liveview.
- # ex: dispatcher changes riders/tasks, or another rider signs up -> refetch.
- defp entity_in_campaigns?(socket, entity_campaign_id) do
- socket.assigns.campaigns
- |> Enum.flat_map(fn {_date, campaigns} -> campaigns end)
- |> Enum.any?(fn c -> c.id == entity_campaign_id end)
- end
-
- attr :filled_tasks, :integer, required: true
- attr :total_tasks, :integer, required: true
- attr :campaign, :any, required: true
-
- defp tasks_filled_text(assigns) do
- {class, copy} =
- cond do
- assigns.filled_tasks == nil ->
- {"text-gray-600", "N/A"}
-
- campaign_in_past(assigns.campaign) ->
- {"text-gray-600", "Campaign over"}
-
- assigns.total_tasks - assigns.filled_tasks == 0 ->
- {"text-gray-600", "Fully Assigned"}
-
- true ->
- {"text-red-400", "#{assigns.total_tasks - assigns.filled_tasks} Available"}
- end
-
- assigns =
- assigns
- |> assign(:class, class)
- |> assign(:copy, copy)
-
- ~H"""
-
-
-
- <%= @copy %>
-
-
- """
- end
-
attr :campaign, :any, required: true
attr :rider_id, :integer, required: true
attr :campaign_task_counts, :any, required: true
From b5ac8e703538bab35aebe100209c61fbf98fe7ec Mon Sep 17 00:00:00 2001
From: teesloane
Date: Mon, 29 Jul 2024 13:34:09 -0400
Subject: [PATCH 2/4] Apply suggested changes / remove redundant stat.
---
.../live/campaign_live/index.ex | 18 +++++++++++-------
.../live/campaign_live/index.html.heex | 16 +++++++---------
2 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/lib/bike_brigade_web/live/campaign_live/index.ex b/lib/bike_brigade_web/live/campaign_live/index.ex
index c8f78b42..d4c63a7c 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.ex
+++ b/lib/bike_brigade_web/live/campaign_live/index.ex
@@ -36,6 +36,14 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
{:noreply, apply_action(socket, socket.assigns.live_action, params)}
end
+ @impl true
+ def handle_event("delete", %{"id" => id}, socket) do
+ campaign = Delivery.get_campaign(id)
+ {:ok, _} = Delivery.delete_campaign(campaign)
+
+ {:noreply, assign(socket, :campaigns, fetch_campaigns(socket.assigns.current_week))}
+ end
+
@broadcasted_infos [
:task_created,
:task_deleted,
@@ -53,13 +61,9 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
end
end
- @impl true
- def handle_event("delete", %{"id" => id}, socket) do
- campaign = Delivery.get_campaign(id)
- {:ok, _} = Delivery.delete_campaign(campaign)
-
- {:noreply, assign(socket, :campaigns, fetch_campaigns(socket.assigns.current_week))}
- end
+ @impl Phoenix.LiveView
+ @doc "silently ignore other kinds of messages"
+ def handle_info(_, socket), do: {:noreply, socket}
defp apply_action(socket, :edit, %{"id" => id}) do
socket
diff --git a/lib/bike_brigade_web/live/campaign_live/index.html.heex b/lib/bike_brigade_web/live/campaign_live/index.html.heex
index c6cb3f61..e9608570 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.html.heex
+++ b/lib/bike_brigade_web/live/campaign_live/index.html.heex
@@ -127,10 +127,15 @@
/>
<%= pickup_window(c) %>
+
-
- <%= c.stats.signed_up_rider_count %>
+ <.tasks_filled_text
+ filled_tasks={@campaign_task_counts[c.id][:filled_tasks]}
+ total_tasks={@campaign_task_counts[c.id][:total_tasks]}
+ campaign={c}
+ />
+
<%= c.stats.task_count %>
-
- <.tasks_filled_text
- filled_tasks={@campaign_task_counts[c.id][:filled_tasks]}
- total_tasks={@campaign_task_counts[c.id][:total_tasks]}
- campaign={c}
- />
-
From 067e374cfad6b46bd3bee6eee8470de7a4d671bc Mon Sep 17 00:00:00 2001
From: teesloane
Date: Mon, 29 Jul 2024 13:43:19 -0400
Subject: [PATCH 3/4] Fix formatting.
---
lib/bike_brigade_web/live/campaign_live/index.ex | 7 +++----
.../live/campaign_live/index.html.heex | 10 +++++-----
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/lib/bike_brigade_web/live/campaign_live/index.ex b/lib/bike_brigade_web/live/campaign_live/index.ex
index d4c63a7c..f6acaf38 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.ex
+++ b/lib/bike_brigade_web/live/campaign_live/index.ex
@@ -27,8 +27,7 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
|> assign(:page_title, "Campaigns")
|> assign(:current_week, current_week)
|> assign(:campaigns, fetch_campaigns(current_week))
- |> assign(:campaign_task_counts, Delivery.get_total_tasks_and_open_tasks(current_week))
- }
+ |> assign(:campaign_task_counts, Delivery.get_total_tasks_and_open_tasks(current_week))}
end
@impl true
@@ -62,8 +61,8 @@ defmodule BikeBrigadeWeb.CampaignLive.Index do
end
@impl Phoenix.LiveView
- @doc "silently ignore other kinds of messages"
- def handle_info(_, socket), do: {:noreply, socket}
+ @doc "silently ignore other kinds of messages"
+ def handle_info(_, socket), do: {:noreply, socket}
defp apply_action(socket, :edit, %{"id" => id}) do
socket
diff --git a/lib/bike_brigade_web/live/campaign_live/index.html.heex b/lib/bike_brigade_web/live/campaign_live/index.html.heex
index e9608570..1366ba9b 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.html.heex
+++ b/lib/bike_brigade_web/live/campaign_live/index.html.heex
@@ -129,11 +129,11 @@
- <.tasks_filled_text
- filled_tasks={@campaign_task_counts[c.id][:filled_tasks]}
- total_tasks={@campaign_task_counts[c.id][:total_tasks]}
- campaign={c}
- />
+ <.tasks_filled_text
+ filled_tasks={@campaign_task_counts[c.id][:filled_tasks]}
+ total_tasks={@campaign_task_counts[c.id][:total_tasks]}
+ campaign={c}
+ />
From a5f4cf7e6adb49a7899c43bdb076a37d4767d4de Mon Sep 17 00:00:00 2001
From: teesloane
Date: Mon, 29 Jul 2024 13:51:13 -0400
Subject: [PATCH 4/4] More formatting fixes (mix format not working locally :(
)
---
lib/bike_brigade_web/live/campaign_live/index.html.heex | 1 -
1 file changed, 1 deletion(-)
diff --git a/lib/bike_brigade_web/live/campaign_live/index.html.heex b/lib/bike_brigade_web/live/campaign_live/index.html.heex
index 1366ba9b..0aca13f5 100644
--- a/lib/bike_brigade_web/live/campaign_live/index.html.heex
+++ b/lib/bike_brigade_web/live/campaign_live/index.html.heex
@@ -143,7 +143,6 @@
/>
<%= c.stats.task_count %>
-
<.message_info campaign={c} />