From ba8357798adbf6663834bb937b5e7490986571f2 Mon Sep 17 00:00:00 2001
From: tees <12987958+teesloane@users.noreply.github.com>
Date: Fri, 27 Oct 2023 09:26:07 -0400
Subject: [PATCH 1/9] [242] - Make search normalize accents (#247)
* Add: unaccent extension and enable it.
* Add: test.
---
lib/bike_brigade/riders/rider_search.ex | 10 +++++++---
.../20231025180158_add_unaccent_extension.exs | 11 +++++++++++
test/bike_brigade_web/live/rider_live_test.exs | 13 +++++++++++++
3 files changed, 31 insertions(+), 3 deletions(-)
create mode 100644 priv/repo/migrations/20231025180158_add_unaccent_extension.exs
diff --git a/lib/bike_brigade/riders/rider_search.ex b/lib/bike_brigade/riders/rider_search.ex
index 002f1d99..7dab2477 100644
--- a/lib/bike_brigade/riders/rider_search.ex
+++ b/lib/bike_brigade/riders/rider_search.ex
@@ -228,7 +228,10 @@ defmodule BikeBrigade.Riders.RiderSearch do
@spec apply_filter(Filter.t(), Ecto.Query.t()) :: Ecto.Query.t()
defp apply_filter(%Filter{type: :name, search: search}, query) do
query
- |> where(ilike(as(:rider).name, ^"#{search}%") or ilike(as(:rider).name, ^"% #{search}%"))
+ |> where(
+ fragment("unaccent(?) ilike unaccent(?)", as(:rider).name, ^"%#{search}%") or
+ fragment("unaccent(?) ilike unaccent(?)", as(:rider).name, ^"% #{search}%")
+ )
end
defp apply_filter(%Filter{type: :phone, search: search}, query) do
@@ -239,8 +242,9 @@ defmodule BikeBrigade.Riders.RiderSearch do
defp apply_filter(%Filter{type: :name_or_phone, search: search}, query) do
query
|> where(
- ilike(as(:rider).name, ^"#{search}%") or ilike(as(:rider).name, ^"% #{search}%") or
- like(as(:rider).phone, ^"%#{search}%")
+ fragment("unaccent(?) ilike unaccent(?)", as(:rider).name, ^"%#{search}%") or
+ fragment("unaccent(?) ilike unaccent(?)", as(:rider).name, ^"% #{search}%") or
+ like(as(:rider).phone, ^"%#{search}%")
)
end
diff --git a/priv/repo/migrations/20231025180158_add_unaccent_extension.exs b/priv/repo/migrations/20231025180158_add_unaccent_extension.exs
new file mode 100644
index 00000000..42022f08
--- /dev/null
+++ b/priv/repo/migrations/20231025180158_add_unaccent_extension.exs
@@ -0,0 +1,11 @@
+defmodule BikeBrigade.Repo.Migrations.AddUnaccentExtension do
+ use Ecto.Migration
+
+ def up do
+ execute "CREATE EXTENSION IF NOT EXISTS unaccent;"
+ end
+
+ def down do
+ execute "DROP EXTENSION IF EXISTS unaccent;"
+ end
+end
diff --git a/test/bike_brigade_web/live/rider_live_test.exs b/test/bike_brigade_web/live/rider_live_test.exs
index 97107bfd..59017708 100644
--- a/test/bike_brigade_web/live/rider_live_test.exs
+++ b/test/bike_brigade_web/live/rider_live_test.exs
@@ -21,6 +21,19 @@ defmodule BikeBrigadeWeb.RiderLiveTest do
assert get_row_count.(index_live) == 20
end
+ test "searching riders works", %{conn: conn} do
+ fixture(:rider, %{name: "Béa"})
+ {:ok, index_live, html} = live(conn, ~p"/riders")
+
+ html = index_live
+ |> element("#rider-search")
+ |> render_submit(%{value: "Bea"})
+
+ assert Floki.parse_fragment!(html) |> Floki.find(".rider-row") |> Enum.count() == 1
+ assert html =~ "Béa"
+
+ end
+
test "bulk message with no riders selected", %{conn: conn, rider: rider} do
{:ok, view, _html} = live(conn, ~p"/riders")
From e217861165c68a4f928fa01f9d99f74afe596dab Mon Sep 17 00:00:00 2001
From: tees <12987958+teesloane@users.noreply.github.com>
Date: Fri, 27 Oct 2023 09:26:18 -0400
Subject: [PATCH 2/9] [241] stats polish (#248)
* Fix: hide dispatch fields on /profile when rider
Riders don't need to see dispatch specific fields in their profile. This
commit gates this content by checking if the current user is a
dispatcher or not.
* Test: dispatch/rider specific views of rider profile.
Test that the correct content is hidden/displayed on both the dispatcher
and the rider's views.
---
.../live/rider_live/form_component.html.heex | 7 ++--
.../live/rider_live/show.html.heex | 7 ++--
.../bike_brigade_web/live/rider_live_test.exs | 33 ++++++++++++++++++-
3 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/lib/bike_brigade_web/live/rider_live/form_component.html.heex b/lib/bike_brigade_web/live/rider_live/form_component.html.heex
index fafbf0ef..96052d84 100644
--- a/lib/bike_brigade_web/live/rider_live/form_component.html.heex
+++ b/lib/bike_brigade_web/live/rider_live/form_component.html.heex
@@ -35,7 +35,7 @@
/>
-
+
Tags
<.live_component
@@ -62,6 +62,7 @@
<.input
type="textarea"
+ :if={@current_user.is_dispatcher}
field={{f, :internal_notes}}
label="Notes (internal)"
help_text="These are for Bike Brigade dispatchers, and not shared with riders"
@@ -70,6 +71,7 @@
<.input type="text" field={{f, :max_distance}} label="Max Distance" />
<.input
+ :if={@current_user.is_dispatcher}
type="date"
field={{f, :last_safety_check}}
label="Last Safety Check"
@@ -77,12 +79,13 @@
/>
<.input
+ :if={@current_user.is_dispatcher}
type="checkbox"
field={{f, :text_based_itinerary}}
label="Send text-only delivery instructions"
help_text="Enable this for riders without smartphones or data plans and they'll get a second message with instructions after you send the link."
/>
-
<:confirm form="rider-form" type="submit" phx-disable-with="Saving...">Save
<:cancel>Cancel
-
\ No newline at end of file
+
diff --git a/test/bike_brigade_web/live/rider_live_test.exs b/test/bike_brigade_web/live/rider_live_test.exs
index 59017708..12953c79 100644
--- a/test/bike_brigade_web/live/rider_live_test.exs
+++ b/test/bike_brigade_web/live/rider_live_test.exs
@@ -73,7 +73,28 @@ defmodule BikeBrigadeWeb.RiderLiveTest do
end
end
- describe "Show" do
+ describe "Show: rider logged-in" do
+ setup [:create_rider, :login_as_rider]
+
+ test "Logged in rider cannot see their tag or capacity", %{conn: conn} do
+ {:ok, _view, html} = live(conn, ~p"/profile")
+ refute html =~ "dispatch-data-tags-and-capacity"
+ end
+ end
+
+ describe "Edit: rider logged-in" do
+ setup [:create_rider, :login_as_rider]
+
+ test "Logged in rider cannot dispatch specific fields in slideover", %{conn: conn} do
+ {:ok, _view, html} = live(conn, ~p"/profile/edit")
+ refute html =~ "Send text-only delivery instructions"
+ refute html =~ "Flags"
+ refute html =~ "Last Safety Check"
+ refute html =~ "Notes (internal)"
+ end
+ end
+
+ describe "Show: Dispatch logged-in" do
setup [:create_rider, :login]
test "shows rider", %{conn: conn, rider: rider} do
@@ -81,8 +102,10 @@ defmodule BikeBrigadeWeb.RiderLiveTest do
assert html =~ rider.name
assert html =~ rider.location.address
+ assert html =~ "dispatch-data-tags-and-capacity"
end
+
test "edit rider", %{conn: conn, rider: rider} do
{:ok, view, _html} = live(conn, ~p"/riders/#{rider}/show/edit")
@@ -93,5 +116,13 @@ defmodule BikeBrigadeWeb.RiderLiveTest do
flash = assert_redirected(view, "/riders/#{rider.id}")
assert flash["info"] == "Rider updated successfully"
end
+
+ test "Logged in dispatcher can see dispatch-specific fields", %{conn: conn, rider: rider} do
+ {:ok, _view, html} = live(conn, ~p"/riders/#{rider.id}/show/edit")
+ assert html =~ "Send text-only delivery instructions"
+ assert html =~ "Flags"
+ assert html =~ "Last Safety Check"
+ assert html =~ "Notes (internal)"
+ end
end
end
From d3e7fefeface5a5f70f324e2c55597ff8d4d50c6 Mon Sep 17 00:00:00 2001
From: tees <12987958+teesloane@users.noreply.github.com>
Date: Tue, 7 Nov 2023 14:14:02 -0500
Subject: [PATCH 3/9] Fix: mobile styling for campaign modal (#252)
- also, shrink modal padding on mobile to have more space
- change campaign dates into a column on mobile
- change live location picker to put fields into columns on mobile
---
.../components/live_location.ex | 55 ++++++++++---------
lib/bike_brigade_web/core_components.ex | 2 +-
.../campaign_live/form_component.html.heex | 2 +-
3 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/lib/bike_brigade_web/components/live_location.ex b/lib/bike_brigade_web/components/live_location.ex
index 96d89b92..9d8c17cc 100644
--- a/lib/bike_brigade_web/components/live_location.ex
+++ b/lib/bike_brigade_web/components/live_location.ex
@@ -64,8 +64,7 @@ defmodule BikeBrigadeWeb.Components.LiveLocation do
location = %Location{}
changeset = Location.changeset(location)
- {location, changeset
- }
+ {location, changeset}
end
form = Phoenix.HTML.FormData.to_form(changeset, as: as)
@@ -173,8 +172,8 @@ defmodule BikeBrigadeWeb.Components.LiveLocation do
-
-
+
+
@@ -188,30 +187,32 @@ defmodule BikeBrigadeWeb.Components.LiveLocation do