diff --git a/CHANGELOG.md b/CHANGELOG.md index 0da0150..bdcb0ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # v0.8.0 -- Add search to catalog, ammo, container and tag index -- Tweak urls for catalog, ammo, containers and tags +- Add search to catalog, ammo, container, tag and range index pages +- Tweak urls for catalog, ammo, containers, tags and shot records +- Fix bug with shot group chart not drawing lines between days correctly # v0.7.2 - Code improvements diff --git a/assets/js/shot_log_chart.js b/assets/js/shot_log_chart.js index 14a3f99..bd40ff5 100644 --- a/assets/js/shot_log_chart.js +++ b/assets/js/shot_log_chart.js @@ -80,6 +80,27 @@ export default { } }) }, + updateChart (el) { + const data = JSON.parse(el.dataset.chartData) + + this.el.chart.data = { + datasets: [{ + label: el.dataset.label, + data: data.map(({ date, count, label }) => ({ + label, + x: date, + y: count + })), + backgroundColor: `${el.dataset.color}77`, + borderColor: el.dataset.color, + fill: true, + borderWidth: 3, + pointBorderWidth: 1 + }] + } + + this.el.chart.update() + }, mounted () { this.initalizeChart(this.el) }, - updated () { this.initalizeChart(this.el) } + updated () { this.updateChart(this.el) } } diff --git a/lib/cannery/activity_log.ex b/lib/cannery/activity_log.ex index 272df31..3d9aa35 100644 --- a/lib/cannery/activity_log.ex +++ b/lib/cannery/activity_log.ex @@ -15,10 +15,50 @@ defmodule Cannery.ActivityLog do iex> list_shot_groups(%User{id: 123}) [%ShotGroup{}, ...] + iex> list_shot_groups("cool", %User{id: 123}) + [%ShotGroup{notes: "My cool shot group"}, ...] + """ @spec list_shot_groups(User.t()) :: [ShotGroup.t()] - def list_shot_groups(%User{id: user_id}) do - Repo.all(from(sg in ShotGroup, where: sg.user_id == ^user_id)) + @spec list_shot_groups(search :: nil | String.t(), User.t()) :: [ShotGroup.t()] + def list_shot_groups(search \\ nil, user) + + def list_shot_groups(search, %{id: user_id}) when search |> is_nil() or search == "", + do: Repo.all(from sg in ShotGroup, where: sg.user_id == ^user_id) + + def list_shot_groups(search, %{id: user_id}) when search |> is_binary() do + trimmed_search = String.trim(search) + + Repo.all( + from sg in ShotGroup, + left_join: ag in assoc(sg, :ammo_group), + left_join: at in assoc(ag, :ammo_type), + where: sg.user_id == ^user_id, + where: + fragment( + "? @@ websearch_to_tsquery('english', ?)", + sg.search, + ^trimmed_search + ) or + fragment( + "? @@ websearch_to_tsquery('english', ?)", + ag.search, + ^trimmed_search + ) or + fragment( + "? @@ websearch_to_tsquery('english', ?)", + at.search, + ^trimmed_search + ), + order_by: { + :desc, + fragment( + "ts_rank_cd(?, websearch_to_tsquery('english', ?), 4)", + sg.search, + ^trimmed_search + ) + } + ) end @doc """ diff --git a/lib/cannery_web/live/range_live/index.ex b/lib/cannery_web/live/range_live/index.ex index c6dbd61..58662df 100644 --- a/lib/cannery_web/live/range_live/index.ex +++ b/lib/cannery_web/live/range_live/index.ex @@ -10,7 +10,13 @@ defmodule CanneryWeb.RangeLive.Index do alias Phoenix.LiveView.Socket @impl true - def mount(_params, _session, socket), do: {:ok, socket |> display_shot_groups()} + def mount(%{"search" => search}, _session, socket) do + {:ok, socket |> assign(search: search) |> display_shot_groups()} + end + + def mount(_params, _session, socket) do + {:ok, socket |> assign(search: nil) |> display_shot_groups()} + end @impl true def handle_params(params, _url, %{assigns: %{live_action: live_action}} = socket) do @@ -23,26 +29,46 @@ defmodule CanneryWeb.RangeLive.Index do %{"id" => id} ) do socket - |> assign(:page_title, gettext("Record Shots")) - |> assign(:ammo_group, Ammo.get_ammo_group!(id, current_user)) + |> assign( + page_title: gettext("Record Shots"), + ammo_group: Ammo.get_ammo_group!(id, current_user) + ) end defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do socket - |> assign(:page_title, gettext("Edit Shot Records")) - |> assign(:shot_group, ActivityLog.get_shot_group!(id, current_user)) + |> assign( + page_title: gettext("Edit Shot Records"), + shot_group: ActivityLog.get_shot_group!(id, current_user) + ) end defp apply_action(socket, :new, _params) do socket - |> assign(:page_title, gettext("New Shot Records")) - |> assign(:shot_group, %ShotGroup{}) + |> assign( + page_title: gettext("New Shot Records"), + shot_group: %ShotGroup{} + ) end defp apply_action(socket, :index, _params) do socket - |> assign(:page_title, gettext("Shot Records")) - |> assign(:shot_group, nil) + |> assign( + page_title: gettext("Shot Records"), + search: nil, + shot_group: nil + ) + |> display_shot_groups() + end + + defp apply_action(socket, :search, %{"search" => search}) do + socket + |> assign( + page_title: gettext("Shot Records"), + search: search, + shot_group: nil + ) + |> display_shot_groups() end @impl true @@ -55,6 +81,7 @@ defmodule CanneryWeb.RangeLive.Index do {:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()} end + @impl true def handle_event( "toggle_staged", %{"ammo_group_id" => ammo_group_id}, @@ -69,10 +96,20 @@ defmodule CanneryWeb.RangeLive.Index do {:noreply, socket |> put_flash(:info, prompt) |> display_shot_groups()} end + @impl true + def handle_event("search", %{"search" => %{"search_term" => ""}}, socket) do + {:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :index))} + end + + def handle_event("search", %{"search" => %{"search_term" => search_term}}, socket) do + {:noreply, socket |> push_patch(to: Routes.range_index_path(Endpoint, :search, search_term))} + end + @spec display_shot_groups(Socket.t()) :: Socket.t() - defp display_shot_groups(%{assigns: %{current_user: current_user}} = socket) do + defp display_shot_groups(%{assigns: %{search: search, current_user: current_user}} = socket) do shot_groups = - ActivityLog.list_shot_groups(current_user) |> Repo.preload(ammo_group: :ammo_type) + ActivityLog.list_shot_groups(search, current_user) + |> Repo.preload(ammo_group: :ammo_type) ammo_groups = Ammo.list_staged_ammo_groups(current_user) @@ -114,7 +151,7 @@ defmodule CanneryWeb.RangeLive.Index do label: gettext("Rounds shot: %{count}", count: sum) } end) - |> Enum.sort_by(fn %{date: date} -> date end) + |> Enum.sort_by(fn %{date: date} -> date end, Date) end @spec get_row_data_for_shot_group(ShotGroup.t(), [map()]) :: map() diff --git a/lib/cannery_web/live/range_live/index.html.heex b/lib/cannery_web/live/range_live/index.html.heex index 718a2de..166838f 100644 --- a/lib/cannery_web/live/range_live/index.html.heex +++ b/lib/cannery_web/live/range_live/index.html.heex @@ -43,7 +43,7 @@
- <%= if @shot_groups |> Enum.empty?() do %> + <%= if @shot_groups |> Enum.empty?() and @search |> is_nil() do %>

<%= gettext("No shots recorded") %> <%= display_emoji("😔") %> @@ -67,14 +67,39 @@ <%= dgettext("errors", "Your browser does not support the canvas element.") %> - <.live_component - module={CanneryWeb.Components.TableComponent} - id="shot_groups_index_table" - columns={@columns} - rows={@rows} - initial_key={:date} - initial_sort_mode={:desc} - /> +
+ <.form + :let={f} + for={:search} + phx-change="search" + phx-submit="search" + class="grow self-stretch flex flex-col items-stretch" + data-qa="shot_group_search" + > + <%= text_input(f, :search_term, + class: "input input-primary", + value: @search, + phx_debounce: 300, + placeholder: gettext("Search shot records") + ) %> + +
+ + <%= if @shot_groups |> Enum.empty?() do %> +

+ <%= gettext("No shots recorded") %> + <%= display_emoji("😔") %> +

+ <% else %> + <.live_component + module={CanneryWeb.Components.TableComponent} + id="shot_groups_index_table" + columns={@columns} + rows={@rows} + initial_key={:date} + initial_sort_mode={:desc} + /> + <% end %> <% end %> diff --git a/lib/cannery_web/router.ex b/lib/cannery_web/router.ex index b78ae4d..2c1c9e5 100644 --- a/lib/cannery_web/router.ex +++ b/lib/cannery_web/router.ex @@ -103,8 +103,9 @@ defmodule CanneryWeb.Router do live "/ammo/show/:id/edit/:shot_group_id", AmmoGroupLive.Show, :edit_shot_group live "/range", RangeLive.Index, :index - live "/range/:id/edit", RangeLive.Index, :edit - live "/range/:id/add_shot_group", RangeLive.Index, :add_shot_group + live "/range/edit/:id", RangeLive.Index, :edit + live "/range/add_shot_group/:id", RangeLive.Index, :add_shot_group + live "/range/search/:search", RangeLive.Index, :search end scope "/", CanneryWeb do diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index ca40aed..f481367 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -49,7 +49,7 @@ msgstr "Admins:" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "Munition" @@ -316,7 +316,7 @@ msgstr "Keine Tags" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "Bemerkungen" @@ -480,7 +480,7 @@ msgstr "Range Day" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "Datum" @@ -502,17 +502,18 @@ msgid "Record shots" msgstr "Schüsse dokumentieren" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "Schießkladde editieren" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "Neue Schießkladde" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "Keine Schüsse dokumentiert" @@ -524,13 +525,14 @@ msgid "Rounds left" msgstr "Patronen verbleibend" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "Patronen abgefeuert" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "Schießkladde" @@ -722,7 +724,7 @@ msgid "Reset your password" msgstr "Passwort zurücksetzen" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format msgid "Record Shots" msgstr "Schüsse dokumentieren" @@ -860,7 +862,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format, fuzzy msgid "Rounds shot: %{count}" msgstr "Patronen abgefeuert" @@ -1139,3 +1141,8 @@ msgstr "" #, elixir-autogen, elixir-format, fuzzy msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/de/LC_MESSAGES/prompts.po b/priv/gettext/de/LC_MESSAGES/prompts.po index 9314fa5..8261e38 100644 --- a/priv/gettext/de/LC_MESSAGES/prompts.po +++ b/priv/gettext/de/LC_MESSAGES/prompts.po @@ -209,13 +209,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "Sind sie sicher, dass Sie diese Munition demarkieren möchten?" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "Sind sie sicher, dass sie die Schießkladde löschen möchten?" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "Schießkladde erfolgreich gelöscht" @@ -272,7 +272,7 @@ msgstr "Spracheinstellung gespeichert." msgid "Ammo deleted succesfully" msgstr "Munitionsgruppe erfolgreich gelöscht" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format, fuzzy msgid "Ammo unstaged succesfully" msgstr "Munition erfolgreich demarkiert" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index f2658d4..0bf0965 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -34,7 +34,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "" @@ -301,7 +301,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -463,7 +463,7 @@ msgstr "" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "" @@ -485,17 +485,18 @@ msgid "Record shots" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "" @@ -507,13 +508,14 @@ msgid "Rounds left" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "" @@ -705,7 +707,7 @@ msgid "Reset your password" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format msgid "Record Shots" msgstr "" @@ -843,7 +845,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format msgid "Rounds shot: %{count}" msgstr "" @@ -1122,3 +1124,8 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index ed28910..5a7d017 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -35,7 +35,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "" @@ -302,7 +302,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -464,7 +464,7 @@ msgstr "" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "" @@ -486,17 +486,18 @@ msgid "Record shots" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "" @@ -508,13 +509,14 @@ msgid "Rounds left" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "" @@ -706,7 +708,7 @@ msgid "Reset your password" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format, fuzzy msgid "Record Shots" msgstr "" @@ -844,7 +846,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format, fuzzy msgid "Rounds shot: %{count}" msgstr "" @@ -1123,3 +1125,8 @@ msgstr "" #, elixir-autogen, elixir-format, fuzzy msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/prompts.po b/priv/gettext/en/LC_MESSAGES/prompts.po index 8c53e52..7b8dff5 100644 --- a/priv/gettext/en/LC_MESSAGES/prompts.po +++ b/priv/gettext/en/LC_MESSAGES/prompts.po @@ -189,13 +189,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "" @@ -252,7 +252,7 @@ msgstr "" msgid "Ammo deleted succesfully" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format, fuzzy msgid "Ammo unstaged succesfully" msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index b06d7c6..d78464a 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -49,7 +49,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "" @@ -316,7 +316,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -478,7 +478,7 @@ msgstr "" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "" @@ -500,17 +500,18 @@ msgid "Record shots" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "" @@ -522,13 +523,14 @@ msgid "Rounds left" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "" @@ -720,7 +722,7 @@ msgid "Reset your password" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format msgid "Record Shots" msgstr "" @@ -858,7 +860,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format, fuzzy msgid "Rounds shot: %{count}" msgstr "" @@ -1137,3 +1139,8 @@ msgstr "" #, elixir-autogen, elixir-format, fuzzy msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/prompts.po b/priv/gettext/es/LC_MESSAGES/prompts.po index eac6ab1..9f47ab4 100644 --- a/priv/gettext/es/LC_MESSAGES/prompts.po +++ b/priv/gettext/es/LC_MESSAGES/prompts.po @@ -208,13 +208,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "Está seguro que desea desmontar esta munición?" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "" @@ -271,7 +271,7 @@ msgstr "" msgid "Ammo deleted succesfully" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format, fuzzy msgid "Ammo unstaged succesfully" msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index 874e1e6..8e9a129 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -49,7 +49,7 @@ msgstr "Administrateur·ices :" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "Munition" @@ -316,7 +316,7 @@ msgstr "Aucun tag" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "Notes" @@ -482,7 +482,7 @@ msgstr "Journée de stand" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "Date" @@ -504,17 +504,18 @@ msgid "Record shots" msgstr "Tirs enregistrés" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "Modifier les enregistrements de tir" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "Nouveaux enregistrements de tir" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "Aucun tir enregistré" @@ -526,13 +527,14 @@ msgid "Rounds left" msgstr "Cartouches restantes" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "Cartouches tirées" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "Enregistrements de tir" @@ -724,7 +726,7 @@ msgid "Reset your password" msgstr "Réinitialiser votre mot de passe" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format msgid "Record Shots" msgstr "Enregistrer des tirs" @@ -863,7 +865,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format, fuzzy msgid "Rounds shot: %{count}" msgstr "Cartouches tirées" @@ -1142,3 +1144,8 @@ msgstr "" #, elixir-autogen, elixir-format, fuzzy msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/fr/LC_MESSAGES/prompts.po b/priv/gettext/fr/LC_MESSAGES/prompts.po index ae939b5..5038081 100644 --- a/priv/gettext/fr/LC_MESSAGES/prompts.po +++ b/priv/gettext/fr/LC_MESSAGES/prompts.po @@ -210,13 +210,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "Êtes-vous certain·e de vouloir désélectionner cette munition ?" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "Êtes-vous certain·e de vouloir supprimer cet enregistrement de tir ?" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "Enregistrements de tir supprimés avec succès" @@ -273,7 +273,7 @@ msgstr "Langue mise à jour avec succès." msgid "Ammo deleted succesfully" msgstr "Groupe de munition supprimé avec succès" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format, fuzzy msgid "Ammo unstaged succesfully" msgstr "Groupe de munition désélectionner avec succès" diff --git a/priv/gettext/ga/LC_MESSAGES/default.po b/priv/gettext/ga/LC_MESSAGES/default.po index 56d6eb6..5ce5df1 100644 --- a/priv/gettext/ga/LC_MESSAGES/default.po +++ b/priv/gettext/ga/LC_MESSAGES/default.po @@ -45,7 +45,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/index.ex:70 #: lib/cannery_web/live/ammo_group_live/index.ex:79 #: lib/cannery_web/live/ammo_group_live/index.html.heex:3 -#: lib/cannery_web/live/range_live/index.ex:80 +#: lib/cannery_web/live/range_live/index.ex:117 #, elixir-autogen, elixir-format msgid "Ammo" msgstr "" @@ -312,7 +312,7 @@ msgstr "" #: lib/cannery_web/live/ammo_group_live/form_component.html.heex:49 #: lib/cannery_web/live/ammo_group_live/show.ex:93 #: lib/cannery_web/live/range_live/form_component.html.heex:29 -#: lib/cannery_web/live/range_live/index.ex:82 +#: lib/cannery_web/live/range_live/index.ex:119 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -474,7 +474,7 @@ msgstr "" #: lib/cannery_web/components/add_shot_group_component.html.heex:45 #: lib/cannery_web/live/ammo_group_live/show.ex:94 #: lib/cannery_web/live/range_live/form_component.html.heex:36 -#: lib/cannery_web/live/range_live/index.ex:83 +#: lib/cannery_web/live/range_live/index.ex:120 #, elixir-autogen, elixir-format msgid "Date" msgstr "" @@ -496,17 +496,18 @@ msgid "Record shots" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:42 -#: lib/cannery_web/live/range_live/index.ex:32 +#: lib/cannery_web/live/range_live/index.ex:41 #, elixir-autogen, elixir-format msgid "Edit Shot Records" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:38 +#: lib/cannery_web/live/range_live/index.ex:49 #, elixir-autogen, elixir-format msgid "New Shot Records" msgstr "" #: lib/cannery_web/live/range_live/index.html.heex:48 +#: lib/cannery_web/live/range_live/index.html.heex:90 #, elixir-autogen, elixir-format msgid "No shots recorded" msgstr "" @@ -518,13 +519,14 @@ msgid "Rounds left" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:92 -#: lib/cannery_web/live/range_live/index.ex:81 +#: lib/cannery_web/live/range_live/index.ex:118 #: lib/cannery_web/live/range_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Rounds shot" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:44 +#: lib/cannery_web/live/range_live/index.ex:57 +#: lib/cannery_web/live/range_live/index.ex:67 #, elixir-autogen, elixir-format msgid "Shot Records" msgstr "" @@ -716,7 +718,7 @@ msgid "Reset your password" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:41 -#: lib/cannery_web/live/range_live/index.ex:26 +#: lib/cannery_web/live/range_live/index.ex:33 #, elixir-autogen, elixir-format msgid "Record Shots" msgstr "" @@ -854,7 +856,7 @@ msgstr "" msgid "%{percentage}%" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:114 +#: lib/cannery_web/live/range_live/index.ex:151 #, elixir-autogen, elixir-format, fuzzy msgid "Rounds shot: %{count}" msgstr "" @@ -1133,3 +1135,8 @@ msgstr "" #, elixir-autogen, elixir-format, fuzzy msgid "Search tags" msgstr "" + +#: lib/cannery_web/live/range_live/index.html.heex:83 +#, elixir-autogen, elixir-format +msgid "Search shot records" +msgstr "" diff --git a/priv/gettext/ga/LC_MESSAGES/prompts.po b/priv/gettext/ga/LC_MESSAGES/prompts.po index c1f4f12..d9e8fa0 100644 --- a/priv/gettext/ga/LC_MESSAGES/prompts.po +++ b/priv/gettext/ga/LC_MESSAGES/prompts.po @@ -199,13 +199,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "" @@ -262,7 +262,7 @@ msgstr "" msgid "Ammo deleted succesfully" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format msgid "Ammo unstaged succesfully" msgstr "" diff --git a/priv/gettext/prompts.pot b/priv/gettext/prompts.pot index 87adeac..327d92f 100644 --- a/priv/gettext/prompts.pot +++ b/priv/gettext/prompts.pot @@ -188,13 +188,13 @@ msgid "Are you sure you want to unstage this ammo?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:137 -#: lib/cannery_web/live/range_live/index.ex:159 +#: lib/cannery_web/live/range_live/index.ex:196 #, elixir-autogen, elixir-format msgid "Are you sure you want to delete this shot record?" msgstr "" #: lib/cannery_web/live/ammo_group_live/show.ex:83 -#: lib/cannery_web/live/range_live/index.ex:54 +#: lib/cannery_web/live/range_live/index.ex:80 #, elixir-autogen, elixir-format msgid "Shot records deleted succesfully" msgstr "" @@ -251,7 +251,7 @@ msgstr "" msgid "Ammo deleted succesfully" msgstr "" -#: lib/cannery_web/live/range_live/index.ex:68 +#: lib/cannery_web/live/range_live/index.ex:95 #, elixir-autogen, elixir-format msgid "Ammo unstaged succesfully" msgstr "" diff --git a/test/cannery/activity_log_test.exs b/test/cannery/activity_log_test.exs index 418c8f5..c2791be 100644 --- a/test/cannery/activity_log_test.exs +++ b/test/cannery/activity_log_test.exs @@ -38,17 +38,56 @@ defmodule Cannery.ActivityLogTest do ] end - test "list_shot_groups/0 returns all shot_groups", + test "list_shot_groups/1 returns all shot_groups", %{shot_group: shot_group, current_user: current_user} do assert ActivityLog.list_shot_groups(current_user) == [shot_group] end - test "get_shot_group!/1 returns the shot_group with given id", + test "list_shot_groups/2 returns relevant shot_groups for a user", %{ + ammo_type: ammo_type, + ammo_group: ammo_group, + container: container, + current_user: current_user + } do + shot_group_a = shot_group_fixture(%{"notes" => "amazing"}, current_user, ammo_group) + + {1, [another_ammo_group]} = + ammo_group_fixture(%{"notes" => "stupendous"}, ammo_type, container, current_user) + + shot_group_b = shot_group_fixture(current_user, another_ammo_group) + + another_ammo_type = ammo_type_fixture(%{"name" => "fabulous ammo"}, current_user) + + {1, [yet_another_ammo_group]} = + ammo_group_fixture(another_ammo_type, container, current_user) + + shot_group_c = shot_group_fixture(current_user, yet_another_ammo_group) + + random_user = user_fixture() + random_container = container_fixture(random_user) + random_ammo_type = ammo_type_fixture(random_user) + + {1, [random_ammo_group]} = + ammo_group_fixture(random_ammo_type, random_container, random_user) + + _shouldnt_return = shot_group_fixture(random_user, random_ammo_group) + + # notes + assert ActivityLog.list_shot_groups("amazing", current_user) == [shot_group_a] + + # ammo group attributes + assert ActivityLog.list_shot_groups("stupendous", current_user) == [shot_group_b] + + # ammo type attributes + assert ActivityLog.list_shot_groups("fabulous", current_user) == [shot_group_c] + end + + test "get_shot_group!/2 returns the shot_group with given id", %{shot_group: shot_group, current_user: current_user} do assert ActivityLog.get_shot_group!(shot_group.id, current_user) == shot_group end - test "get_shot_group!/1 does not return a shot_group of another user", + test "get_shot_group!/2 does not return a shot_group of another user", %{shot_group: shot_group} do another_user = user_fixture() @@ -57,7 +96,7 @@ defmodule Cannery.ActivityLogTest do end end - test "create_shot_group/1 with valid data creates a shot_group", + test "create_shot_group/3 with valid data creates a shot_group", %{current_user: current_user, ammo_group: ammo_group} do valid_attrs = %{"count" => 10, "date" => ~D[2022-02-13], "notes" => "some notes"} @@ -69,7 +108,7 @@ defmodule Cannery.ActivityLogTest do assert shot_group.notes == "some notes" end - test "create_shot_group/1 removes corresponding count from ammo group", + test "create_shot_group/3 removes corresponding count from ammo group", %{ current_user: current_user, ammo_group: %{id: ammo_group_id, count: org_count} = ammo_group @@ -85,7 +124,7 @@ defmodule Cannery.ActivityLogTest do assert new_count == 10 end - test "create_shot_group/1 does not remove more than ammo group amount", + test "create_shot_group/3 does not remove more than ammo group amount", %{current_user: current_user, ammo_group: %{id: ammo_group_id} = ammo_group} do valid_attrs = %{"count" => 20, "date" => ~D[2022-02-13], "notes" => "some notes"} @@ -100,7 +139,7 @@ defmodule Cannery.ActivityLogTest do ActivityLog.create_shot_group(%{"count" => 1}, current_user, ammo_group) end - test "create_shot_group/1 with invalid data returns error changeset", + test "create_shot_group/3 with invalid data returns error changeset", %{current_user: current_user, ammo_group: ammo_group} do invalid_params = %{"count" => nil, "date" => nil, "notes" => nil} @@ -108,7 +147,7 @@ defmodule Cannery.ActivityLogTest do ActivityLog.create_shot_group(invalid_params, current_user, ammo_group) end - test "update_shot_group/2 with valid data updates the shot_group and ammo_group", + test "update_shot_group/3 with valid data updates the shot_group and ammo_group", %{ shot_group: shot_group, ammo_group: %{id: ammo_group_id}, @@ -149,7 +188,7 @@ defmodule Cannery.ActivityLogTest do assert ammo_group.count == 0 end - test "update_shot_group/2 with invalid data returns error changeset", + test "update_shot_group/3 with invalid data returns error changeset", %{shot_group: shot_group, current_user: current_user} do assert {:error, %Ecto.Changeset{}} = ActivityLog.update_shot_group( @@ -168,7 +207,7 @@ defmodule Cannery.ActivityLogTest do assert shot_group == ActivityLog.get_shot_group!(shot_group.id, current_user) end - test "delete_shot_group/1 deletes the shot_group and adds value back", + test "delete_shot_group/2 deletes the shot_group and adds value back", %{shot_group: shot_group, current_user: current_user, ammo_group: %{id: ammo_group_id}} do assert {:ok, %ShotGroup{}} = ActivityLog.delete_shot_group(shot_group, current_user) diff --git a/test/cannery_web/live/range_live_test.exs b/test/cannery_web/live/range_live_test.exs index 5f25f96..fd2ed6b 100644 --- a/test/cannery_web/live/range_live_test.exs +++ b/test/cannery_web/live/range_live_test.exs @@ -37,6 +37,32 @@ defmodule CanneryWeb.RangeLiveTest do assert html =~ shot_group.notes end + test "can search for shot_group", %{conn: conn, shot_group: shot_group} do + {:ok, index_live, html} = live(conn, Routes.range_index_path(conn, :index)) + + assert html =~ shot_group.notes + + assert index_live + |> form("[data-qa=\"shot_group_search\"]", + search: %{search_term: shot_group.notes} + ) + |> render_change() =~ shot_group.notes + + assert_patch(index_live, Routes.range_index_path(conn, :search, shot_group.notes)) + + refute index_live + |> form("[data-qa=\"shot_group_search\"]", search: %{search_term: "something_else"}) + |> render_change() =~ shot_group.notes + + assert_patch(index_live, Routes.range_index_path(conn, :search, "something_else")) + + assert index_live + |> form("[data-qa=\"shot_group_search\"]", search: %{search_term: ""}) + |> render_change() =~ shot_group.notes + + assert_patch(index_live, Routes.range_index_path(conn, :index)) + end + test "saves new shot_group", %{conn: conn, ammo_group: ammo_group} do {:ok, index_live, _html} = live(conn, Routes.range_index_path(conn, :index))