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." /> -
+

Flags diff --git a/lib/bike_brigade_web/live/rider_live/show.html.heex b/lib/bike_brigade_web/live/rider_live/show.html.heex index 0ee70ca9..087673c2 100644 --- a/lib/bike_brigade_web/live/rider_live/show.html.heex +++ b/lib/bike_brigade_web/live/rider_live/show.html.heex @@ -68,7 +68,9 @@ <.link href={"mailto:#{email(@rider)}"} class="link"><%= email(@rider) %>

-

+

<: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
<%= error_tag(@form, :address, show_field: false) %>
-
- -
- <%= text_input(@form, :unit, - phx_change: "change", - phx_target: @myself, - class: - "block w-full px-3 py-2 placeholder-gray-400 transition duration-150 ease-in-out border border-gray-300 rounded-md appearance-none focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5" - ) %> +
+
+ +
+ <%= text_input(@form, :unit, + phx_change: "change", + phx_target: @myself, + class: + "block w-full px-3 py-2 placeholder-gray-400 transition duration-150 ease-in-out border border-gray-300 rounded-md appearance-none focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5" + ) %> +
-
-
- -
- <%= text_input(@form, :buzzer, - phx_change: "change", - phx_target: @myself, - class: - "block w-full px-3 py-2 placeholder-gray-400 transition duration-150 ease-in-out border border-gray-300 rounded-md appearance-none focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5" - ) %> +
+ +
+ <%= text_input(@form, :buzzer, + phx_change: "change", + phx_target: @myself, + class: + "block w-full px-3 py-2 placeholder-gray-400 transition duration-150 ease-in-out border border-gray-300 rounded-md appearance-none focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5" + ) %> +
diff --git a/lib/bike_brigade_web/core_components.ex b/lib/bike_brigade_web/core_components.ex index 6bd6bae7..a60e122b 100644 --- a/lib/bike_brigade_web/core_components.ex +++ b/lib/bike_brigade_web/core_components.ex @@ -718,7 +718,7 @@ defmodule BikeBrigadeWeb.CoreComponents do phx-window-keydown={hide_modal(@on_cancel, @id)} phx-key="escape" phx-click-away={hide_modal(@on_cancel, @id)} - class="relative hidden transition bg-white shadow-lg rounded-2xl p-14 shadow-zinc-700/10 ring-1 ring-zinc-700/10" + class="relative hidden transition bg-white shadow-lg rounded-2xl p-6 md:p-14 shadow-zinc-700/10 ring-1 ring-zinc-700/10" >
-
+
+
- <.button patch={~p"/riders/message"}> + <.button class="space-x-2" patch={~p"/riders/message"}> Bulk Message <%= if MapSet.size(@selected) > 0 do %> (<%= MapSet.size(@selected) %>) <% end %> +
<%= if @mode == :map do %> From c167b190d19480f9b64a382baadafd637bbd3135 Mon Sep 17 00:00:00 2001 From: tees <12987958+teesloane@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:02:47 -0500 Subject: [PATCH 5/9] Fix: edit program mobile styles (#253) * Fix: mobile styling for campaign modal - 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 * Add: mobile improvements to `edit program` --- .../live/program_live/form_component.html.heex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/bike_brigade_web/live/program_live/form_component.html.heex b/lib/bike_brigade_web/live/program_live/form_component.html.heex index d63c5231..abfcffb3 100644 --- a/lib/bike_brigade_web/live/program_live/form_component.html.heex +++ b/lib/bike_brigade_web/live/program_live/form_component.html.heex @@ -36,9 +36,10 @@ -
+
<.input type="select" + class="mt-8" field={{s, :weekday}} options={[ Monday: :monday, @@ -52,17 +53,18 @@ /> <.input type="time" field={{s, :start_time}} /> <.input type="time" field={{s, :end_time}} /> -
+
<.button color={:clear} - size={:xxsmall} + size={:xsmall} phx-click={JS.push("remove_schedule", value: %{index: i}, target: @myself)} type="button" > - Close + Remove Schedule
+
From a9825eba6b92032f9b64e938ba78f8cdd914334f Mon Sep 17 00:00:00 2001 From: tees <12987958+teesloane@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:03:51 -0500 Subject: [PATCH 6/9] Clean: remove bogus route. (#255) --- lib/bike_brigade/tasks/mailchimp_importer.ex | 2 +- lib/bike_brigade_web/router.ex | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/bike_brigade/tasks/mailchimp_importer.ex b/lib/bike_brigade/tasks/mailchimp_importer.ex index 6e84b66c..48028eaa 100644 --- a/lib/bike_brigade/tasks/mailchimp_importer.ex +++ b/lib/bike_brigade/tasks/mailchimp_importer.ex @@ -114,7 +114,7 @@ defmodule BikeBrigade.Tasks.MailchimpImporter do def notify_location_error(rider) do error_message = """ - We had trouble with the address for #{rider.name}. Please edit manually: #{~p"/riders/#{rider}/edit"}, and don't forget to remove the `invalid_location` tag! + We had trouble with the address for #{rider.name}. Please edit manually: #{~p"/riders/#{rider}/show/edit"}, and don't forget to remove the `invalid_location` tag! """ Task.start(Slack.Operations, :post_message!, [error_message]) diff --git a/lib/bike_brigade_web/router.ex b/lib/bike_brigade_web/router.ex index bb66dd2f..7b9819b7 100644 --- a/lib/bike_brigade_web/router.ex +++ b/lib/bike_brigade_web/router.ex @@ -115,7 +115,6 @@ defmodule BikeBrigadeWeb.Router do live_session :dispatch, on_mount: {LiveHooks.Authentication, :require_dispatcher} do live "/riders", RiderLive.Index, :index live "/riders/new", RiderLive.Index, :new - live "/riders/:id/edit", RiderLive.Index, :edit live "/riders/message", RiderLive.Index, :message # this is mostly used for testing! live "/riders/map", RiderLive.Index, :map From 0981d04c15925b7cd7e9018eb0964b0f5aee86d8 Mon Sep 17 00:00:00 2001 From: tees <12987958+teesloane@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:04:14 -0500 Subject: [PATCH 7/9] Add: Issue template. (#256) --- .github/ISSUE_TEMPLATE/bug_report.md | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..76cf0e6c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,36 @@ +--- +name: Bug report +about: Use this template for reporting bugs. +--- + +**Describe the bug** + +< Thank you for filing an issue. Please replace this text with a description of the bug you have encountered. > + +**Steps to Reproduce** + +If possible, please provide steps to reproduce the behaviour: + +< insert steps to recreate > + +**Expected behavior** + +Describe what you expected to happen. + +**Screenshots** + +If applicable, add screenshots of the bug in action! + +**Environment (please complete the following information):** + + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Additional context** + +Add any other context about the problem here. + + + + From dd8db8878a1b608dc10f2ad81ba673670477c1b4 Mon Sep 17 00:00:00 2001 From: tees <12987958+teesloane@users.noreply.github.com> Date: Fri, 17 Nov 2023 07:58:03 -0500 Subject: [PATCH 8/9] Add: allow rider to edit themselves. (#250) * Add: allow rider to edit themselves. * Fix: use rider changeset based on user-type editing. * Test: rider form checks --- .../live/rider_live/form_component.ex | 92 ++++++++++++------- .../bike_brigade_web/live/rider_live_test.exs | 58 +++++++++++- 2 files changed, 115 insertions(+), 35 deletions(-) diff --git a/lib/bike_brigade_web/live/rider_live/form_component.ex b/lib/bike_brigade_web/live/rider_live/form_component.ex index 177afa21..c447f252 100644 --- a/lib/bike_brigade_web/live/rider_live/form_component.ex +++ b/lib/bike_brigade_web/live/rider_live/form_component.ex @@ -30,21 +30,22 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do belongs_to :location, Location, on_replace: :update end - def changeset(form, attrs \\ %{}) do - form - |> cast(attrs, [ - :name, - :pronouns, - :email, - :phone, - :capacity, - :max_distance, - :last_safety_check, - :internal_notes, - :text_based_itinerary, - :tags - ]) - |> cast_embed(:flags) + @shared_permitted_keys [ + :name, + :pronouns, + :email, + :phone, + :capacity, + :max_distance + ] + + @doc """ + Dispatchers can edit a rider in their entirety; a rider can edit a + subsection of their profile. We handle both cases here by matching on what + the action is for the page. + """ + def changeset(form, action, attrs \\ %{}) do + changeset_impl(form, action, attrs) |> cast_assoc(:location, with: &Location.geocoding_changeset/2) |> validate_required([ :name, @@ -56,6 +57,22 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do ]) end + # `:edit` - the dispatcher is editing the rider + def changeset_impl(form, :edit, attrs) do + form + |> cast( + attrs, + @shared_permitted_keys() ++ + [:last_safety_check, :internal_notes, :text_based_itinerary, :tags] + ) + |> cast_embed(:flags) + end + + # `:edit_profile` - the rider is editing their own profile. + def changeset_impl(form, :edit_profile, attrs) do + form |> cast(attrs, @shared_permitted_keys()) + end + def from_rider(%Rider{} = rider) do map = rider @@ -72,9 +89,9 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do |> Map.update!(:flags, &Map.from_struct/1) end - def update_form(%__MODULE__{} = form, params) do + def update_form(%__MODULE__{} = form, action, params) do form - |> changeset(params) + |> changeset(action, params) |> apply_action(:save) end end @@ -83,7 +100,7 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do def update(%{rider: rider} = assigns, socket) do rider = rider |> Repo.preload(:tags) form = RiderForm.from_rider(rider) - changeset = RiderForm.changeset(form) + changeset = RiderForm.changeset(form, assigns.action) {:ok, socket @@ -95,12 +112,12 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do @impl true def handle_event("validate", %{"rider_form" => rider_form_params}, socket) do - case RiderForm.update_form(socket.assigns.form, rider_form_params) do + case RiderForm.update_form(socket.assigns.form, socket.assigns.action, rider_form_params) do {:ok, form} -> {:noreply, socket |> assign(:form, form) - |> assign(:changeset, RiderForm.changeset(form))} + |> assign(:changeset, RiderForm.changeset(form, socket.assigns.action))} {:error, changeset} -> {:noreply, assign(socket, :changeset, changeset)} @@ -128,19 +145,11 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do end defp save_rider(socket, :edit, rider_form_params) do - rider_form_params = Map.merge(%{"tags" => []}, rider_form_params) - with {:ok, form} <- - RiderForm.update_form(socket.assigns.form, rider_form_params), - params = RiderForm.to_params(form), - {:ok, _rider} <- - Riders.update_rider_with_tags(socket.assigns.rider, params, params[:tags]) do - {:noreply, - socket - |> put_flash(:info, "Rider updated successfully") - |> push_navigate(to: socket.assigns.navigate)} - else - _ -> {:noreply, assign(socket, :changeset, socket.assigns.changeset)} - end + save_rider_edit_impl(socket, rider_form_params) + end + + defp save_rider(socket, :edit_profile, rider_form_params) do + save_rider_edit_impl(socket, rider_form_params) end defp save_rider(socket, :new, rider_params) do @@ -155,4 +164,21 @@ defmodule BikeBrigadeWeb.RiderLive.FormComponent do {:noreply, assign(socket, changeset: changeset)} end end + + defp save_rider_edit_impl(socket, rider_form_params) do + rider_form_params = Map.merge(%{"tags" => []}, rider_form_params) + + with {:ok, form} <- + RiderForm.update_form(socket.assigns.form, socket.assigns.action, rider_form_params), + params = RiderForm.to_params(form), + {:ok, _rider} <- + Riders.update_rider_with_tags(socket.assigns.rider, params, params[:tags]) do + {:noreply, + socket + |> put_flash(:info, "Rider updated successfully") + |> push_navigate(to: socket.assigns.navigate)} + else + _ -> {:noreply, assign(socket, :changeset, socket.assigns.changeset)} + end + 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 12953c79..d6bb5f3f 100644 --- a/test/bike_brigade_web/live/rider_live_test.exs +++ b/test/bike_brigade_web/live/rider_live_test.exs @@ -23,7 +23,7 @@ defmodule BikeBrigadeWeb.RiderLiveTest do test "searching riders works", %{conn: conn} do fixture(:rider, %{name: "Béa"}) - {:ok, index_live, html} = live(conn, ~p"/riders") + {:ok, index_live, _html} = live(conn, ~p"/riders") html = index_live |> element("#rider-search") @@ -85,13 +85,53 @@ defmodule BikeBrigadeWeb.RiderLiveTest do 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 + test "Logged in rider cannot see 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 + + test "Logged in rider can edit their profile.", %{conn: conn, rider: rider} do + {:ok, view, html} = live(conn, ~p"/profile/edit") + assert html =~ rider.name + + view + |> form("#rider-form", rider_form: %{"name" => "alex123"}) + |> render_submit() + + flash = assert_redirected(view, "/profile") + assert flash["info"] == "Rider updated successfully" + + {:ok, _view, html} = live(conn, ~p"/profile") + assert html =~ "alex123" + end + + test "Logged in rider cannot edit admin fields.", %{conn: conn, rider: rider} do + {:ok, view, html} = live(conn, ~p"/profile/edit") + assert html =~ rider.name + error_msg_regex = ~r/could not find non-disabled input, select or textarea/ + + assert_raise ArgumentError, error_msg_regex, fn -> + view |> form("#rider-form", rider_form: %{"internal_notes" => "notes!"}) |> render_submit() + end + + assert_raise ArgumentError, error_msg_regex, fn -> + view |> form("#rider-form", rider_form: %{"last_safety_check" => "2023-11-21"}) |> render_submit() + end + + assert_raise ArgumentError, error_msg_regex, fn -> + view + |> form("#rider-form", rider_form: %{"text_based_itinerary" => "false"}) |> render_submit() + end + + assert_raise ArgumentError, error_msg_regex, fn -> + view + |> form("#rider-form", rider_form: %{"tags" => ["foo"]}) + |> render_submit() + end + end end describe "Show: Dispatch logged-in" do @@ -106,6 +146,20 @@ defmodule BikeBrigadeWeb.RiderLiveTest do end + test "Logged in dispatcher can edit admin-only fields.", %{conn: conn, rider: rider} do + {:ok, view, html} = live(conn, ~p"/riders/#{rider}/show/edit") + assert html =~ rider.name + + view + |> form("#rider-form", rider_form: %{ + "name" => "alex123", + "internal_notes" => "notes!", + "last_safety_check" => "2023-11-21", + "text_based_itinerary" => "false"}) + |> render_submit() + end + + test "edit rider", %{conn: conn, rider: rider} do {:ok, view, _html} = live(conn, ~p"/riders/#{rider}/show/edit") From 6e9e712ba837319a5a6f1b3e5ceaaee164d7bad4 Mon Sep 17 00:00:00 2001 From: tees <12987958+teesloane@users.noreply.github.com> Date: Mon, 20 Nov 2023 15:39:15 -0500 Subject: [PATCH 9/9] Add: Itinerary page (#251) * Tighten existing itinerary page. * Fix: use :for comprehension + active "intineraries" * Fix: margins. --- lib/bike_brigade_web/components/layouts.ex | 10 ++++++++++ .../live/itinerary_live/index.html.heex | 6 ++---- lib/bike_brigade_web/router.ex | 3 +-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/bike_brigade_web/components/layouts.ex b/lib/bike_brigade_web/components/layouts.ex index 47cb3b78..67d11144 100644 --- a/lib/bike_brigade_web/components/layouts.ex +++ b/lib/bike_brigade_web/components/layouts.ex @@ -62,6 +62,16 @@ defmodule BikeBrigadeWeb.Layouts do My Profile + +
+ <.sidebar_link selected={@current_page == :itinerary} href={~p"/itinerary"}> + <:icon> + + + Itinerary + +
+ <.sidebar_link selected={@current_page == :logout} href={~p"/logout"} method="post"> <:icon> diff --git a/lib/bike_brigade_web/live/itinerary_live/index.html.heex b/lib/bike_brigade_web/live/itinerary_live/index.html.heex index 7b2545ef..b099dcf3 100644 --- a/lib/bike_brigade_web/live/itinerary_live/index.html.heex +++ b/lib/bike_brigade_web/live/itinerary_live/index.html.heex @@ -1,5 +1,5 @@ <%= if @campaign_riders != [] do %> - <%= for cr <- @campaign_riders do %> -
+
  • @@ -95,7 +94,6 @@
- <% end %> <% else %>
No campaigns found for this day.
<% end %> diff --git a/lib/bike_brigade_web/router.ex b/lib/bike_brigade_web/router.ex index 7b9819b7..24b24850 100644 --- a/lib/bike_brigade_web/router.ex +++ b/lib/bike_brigade_web/router.ex @@ -85,7 +85,7 @@ defmodule BikeBrigadeWeb.Router do get "/", Plugs.RedirectUser, unauthenticated: [to: "/login"], dispatcher: [to: "/campaigns"], - default: [to: "/profile"] + default: [to: "/itinerary"] end scope "/", BikeBrigadeWeb do @@ -106,7 +106,6 @@ defmodule BikeBrigadeWeb.Router do end post "/logout", Authentication, :logout - end scope "/", BikeBrigadeWeb do