add date range to range page

This commit is contained in:
shibao 2025-01-31 22:34:09 -05:00
parent 839e1d7124
commit f869da8a80
32 changed files with 377 additions and 100 deletions

View File

@ -1,4 +1,5 @@
# v0.9.13
- Add date restriction dropdown to range page
- Fix dates not rendering properly in table
- Update deps

View File

@ -25,6 +25,7 @@ import 'phoenix_html'
import { Socket } from 'phoenix'
import { LiveSocket } from 'phoenix_live_view'
import Date from './date'
import DateRange from './date_range'
import DateTime from './datetime'
import ShotLogChart from './shot_log_chart'
import SlimSelect from './slim_select'
@ -33,7 +34,7 @@ import topbar from 'topbar'
const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute('content')
const liveSocket = new LiveSocket('/live', Socket, {
params: { _csrf_token: csrfToken },
hooks: { Date, DateTime, ShotLogChart, SlimSelect }
hooks: { Date, DateRange, DateTime, ShotLogChart, SlimSelect }
})
// Show progress bar on live navigation and form submits

28
assets/js/date_range.js Normal file
View File

@ -0,0 +1,28 @@
import { easepick } from '@easepick/core'
import { RangePlugin } from '@easepick/range-plugin'
export default {
displayDateRange (el) {
// eslint-disable-next-line new-cap
el.easepick = new easepick.create({
element: el.firstElementChild,
css: [
'https://cdn.jsdelivr.net/npm/@easepick/core@1.2.1/dist/index.css',
'https://cdn.jsdelivr.net/npm/@easepick/range-plugin@1.2.1/dist/index.css'
],
plugins: [RangePlugin],
RangePlugin: {
elementEnd: el.lastElementChild,
startDate: el.dataset.startDate,
endDate: el.dataset.endDate
},
setup (picker) {
picker.on('select', (e) => {
el.firstElementChild.dispatchEvent(new Event('input', { bubbles: true }))
})
}
})
},
mounted () { this.displayDateRange(this.el) },
updated () { this.displayDateRange(this.el) }
}

View File

@ -6,6 +6,7 @@
"": {
"license": "MIT",
"dependencies": {
"@easepick/bundle": "^1.2.1",
"@fortawesome/fontawesome-free": "^6.7.2",
"chart.js": "^4.4.7",
"chartjs-adapter-date-fns": "^3.0.0",
@ -2766,6 +2767,102 @@
"node": ">=14.17.0"
}
},
"node_modules/@easepick/amp-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/amp-plugin/-/amp-plugin-1.2.1.tgz",
"integrity": "sha512-LbGd7RU+fiucxTqJnBpT5SwACX1BoEK4yi1joLqN50O57jpN0jQMMvDO/vp/F4Zr8MO6kwaamRmOXhqo/Vb4aw==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0"
}
},
"node_modules/@easepick/base-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/base-plugin/-/base-plugin-1.2.1.tgz",
"integrity": "sha512-aonBQaRyZwNH/gmPzSzZDVjQjgy/rxWd+TXnM0E3Nxkeu4yMbXV+GnWVQbBwTvJx74M7iSCHJowdmZ5T46B7Vg==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/core": "^1.1.0"
}
},
"node_modules/@easepick/bundle": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/bundle/-/bundle-1.2.1.tgz",
"integrity": "sha512-M9DGu7rrIltbTEPuBfc8fTOdK1E2CjTIiSqXmVRcof/peDnDC7U7h3XaTx7nbB0gq4HUTUO8BKHrofPC0jPqSw==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/amp-plugin": "^1.1.0",
"@easepick/base-plugin": "^1.1.0",
"@easepick/core": "^1.1.0",
"@easepick/datetime": "^1.1.0",
"@easepick/kbd-plugin": "^1.1.0",
"@easepick/lock-plugin": "^1.1.0",
"@easepick/preset-plugin": "^1.1.0",
"@easepick/range-plugin": "^1.1.0",
"@easepick/time-plugin": "^1.1.0"
}
},
"node_modules/@easepick/core": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/core/-/core-1.2.1.tgz",
"integrity": "sha512-V/blEia/ykAq+0mnQ9djOU5wvMZ+iffL5iuQrKLObpMOw38kL/qo4inH4pCbB3wm7sDjrJTuDKf+6+FrgdFGsw==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/datetime": "^1.1.0"
}
},
"node_modules/@easepick/datetime": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/datetime/-/datetime-1.2.1.tgz",
"integrity": "sha512-KIUvWo/kEipwBqPTazjfUf6R7dKb2ztPizPoB/0ZMYz3HrWJptsLSZQma3R1nM/zkaexnk/e4L4nX+vDjwBtYA==",
"license": "GPL-2.0-or-later"
},
"node_modules/@easepick/kbd-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/kbd-plugin/-/kbd-plugin-1.2.1.tgz",
"integrity": "sha512-t/bEtKuvAbo9b9iw4J5h5DsGYEL4Wm2sLA2VzR2rvmMfJuo1extktgzw2eCy+w6Q/s4ObdKzhXLnjMvFeiJ8Xg==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0"
}
},
"node_modules/@easepick/lock-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/lock-plugin/-/lock-plugin-1.2.1.tgz",
"integrity": "sha512-6sJCdliMpnQtzL9dwznS9vYaQUy66VRKPZ+jFdVR1ohiNUVM6C7dSGdG3dPntVTywTy2Z9uU+yJOeWcVFDT61A==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0"
}
},
"node_modules/@easepick/preset-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/preset-plugin/-/preset-plugin-1.2.1.tgz",
"integrity": "sha512-VAnjyWpf39kXTR6DYbpCJIBeBhbOgRoNTqntpSb5uF9O398KuHUpIM4Ep1id3fTIlfnRrKxzp54rAFwvc48eCA==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0",
"@easepick/range-plugin": "^1.1.0"
}
},
"node_modules/@easepick/range-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/range-plugin/-/range-plugin-1.2.1.tgz",
"integrity": "sha512-yEHLUq32Kj0exLz4txxchALQVJUbwyXvnovfN7yxTrCJLpi6uMmPXcW4lyYig2P9+xM9JqF6JsNqOsi0+5GlHQ==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0"
}
},
"node_modules/@easepick/time-plugin": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@easepick/time-plugin/-/time-plugin-1.2.1.tgz",
"integrity": "sha512-mjynAAppLxlqiDSdHdkBEqi4A67CH17FqO3UH2n6mfAIKPZLQA7R8Y6jEkp+Fpl5tj0/HFqdrk82ceiYYnLFYw==",
"license": "GPL-2.0-or-later",
"dependencies": {
"@easepick/base-plugin": "^1.1.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",

View File

@ -13,6 +13,7 @@
"test": "standard"
},
"dependencies": {
"@easepick/bundle": "^1.2.1",
"@fortawesome/fontawesome-free": "^6.7.2",
"chart.js": "^4.4.7",
"chartjs-adapter-date-fns": "^3.0.0",

View File

@ -19,6 +19,8 @@ module.exports = {
},
extend: {
spacing: {
30: '7.5rem',
31: '7.75rem',
128: '32rem',
192: '48rem',
256: '64rem'

View File

@ -9,6 +9,8 @@ defmodule Cannery.ActivityLog do
@type list_shot_records_option ::
{:search, String.t() | nil}
| {:class, Type.class() | :all | nil}
| {:start_date, String.t() | nil}
| {:end_date, String.t() | nil}
| {:pack_id, Pack.id() | nil}
@type list_shot_records_options :: [list_shot_records_option()]
@ -49,6 +51,8 @@ defmodule Cannery.ActivityLog do
|> list_shot_records_search(Keyword.get(opts, :search))
|> list_shot_records_class(Keyword.get(opts, :class))
|> list_shot_records_pack_id(Keyword.get(opts, :pack_id))
|> list_shot_records_start_date(Keyword.get(opts, :start_date))
|> list_shot_records_end_date(Keyword.get(opts, :end_date))
|> Repo.all()
end
@ -100,6 +104,20 @@ defmodule Cannery.ActivityLog do
defp list_shot_records_pack_id(query, _all), do: query
@spec list_shot_records_start_date(Queryable.t(), String.t() | nil) :: Queryable.t()
defp list_shot_records_start_date(query, start_date) when start_date |> is_binary() do
query |> where([sr: sr], sr.date >= ^Date.from_iso8601!(start_date))
end
defp list_shot_records_start_date(query, _all), do: query
@spec list_shot_records_end_date(Queryable.t(), String.t() | nil) :: Queryable.t()
defp list_shot_records_end_date(query, end_date) when end_date |> is_binary() do
query |> where([sr: sr], sr.date <= ^Date.from_iso8601!(end_date))
end
defp list_shot_records_end_date(query, _all), do: query
@doc """
Returns a count of shot records.

View File

@ -141,6 +141,20 @@ defmodule CanneryWeb.CoreComponents do
"""
def datetime(assigns)
attr :id, :string, required: true
attr :name, :string, required: true
attr :start_date, :string,
default: Date.utc_today() |> Date.shift(year: -1) |> Date.to_iso8601()
attr :end_date, :string, default: Date.utc_today() |> Date.to_iso8601()
@doc """
Phoenix.Component for a <time> element that renders the naivedatetime in the
user's local timezone
"""
def date_range(assigns)
@spec cast_datetime(NaiveDateTime.t() | nil) :: String.t()
defp cast_datetime(%NaiveDateTime{} = datetime) do
datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601(:extended)

View File

@ -0,0 +1,12 @@
<div
class="flex items-center mx-4 my-2 space-x-1"
data-end-date={@end_date}
data-start-date={@start_date}
id={@id}
phx-hook="DateRange"
phx-update="ignore"
>
<input class="text-center w-31 input input-primary" name={"#{@name}_start"} />
<span>—</span>
<input class="text-center w-31 input input-primary" name={"#{@name}_end"} />
</div>

View File

@ -9,11 +9,31 @@ defmodule CanneryWeb.RangeLive.Index do
@impl true
def mount(%{"search" => search}, _session, socket) do
{:ok, socket |> assign(class: :all, search: search) |> display_shot_records()}
socket =
socket
|> assign(
class: :all,
start_date: Date.shift(Date.utc_today(), year: -1),
end_date: Date.utc_today(),
search: search
)
|> display_shot_records()
{:ok, socket}
end
def mount(_params, _session, socket) do
{:ok, socket |> assign(class: :all, search: nil) |> display_shot_records()}
socket =
socket
|> assign(
class: :all,
start_date: Date.shift(Date.utc_today(), year: -1),
end_date: Date.utc_today(),
search: nil
)
|> display_shot_records()
{:ok, socket}
end
@impl true
@ -116,11 +136,45 @@ defmodule CanneryWeb.RangeLive.Index do
{:noreply, socket |> assign(:class, :all) |> display_shot_records()}
end
def handle_event(
"change_dates",
%{
"dates_start" => start_date,
"dates_end" => end_date
},
socket
) do
socket =
socket
|> assign(
start_date: start_date,
end_date: end_date
)
|> display_shot_records()
{:noreply, socket}
end
@spec display_shot_records(Socket.t()) :: Socket.t()
defp display_shot_records(
%{assigns: %{class: class, search: search, current_user: current_user}} = socket
%{
assigns: %{
class: class,
start_date: start_date,
end_date: end_date,
search: search,
current_user: current_user
}
} = socket
) do
shot_records = ActivityLog.list_shot_records(current_user, search: search, class: class)
shot_records =
ActivityLog.list_shot_records(current_user,
class: class,
end_date: end_date,
search: search,
start_date: start_date
)
packs = Ammo.list_packs(current_user, staged: true)
chart_data = shot_records |> get_chart_data_for_shot_record()
original_counts = packs |> Ammo.get_original_counts(current_user)
@ -153,6 +207,5 @@ defmodule CanneryWeb.RangeLive.Index do
label: gettext("Rounds shot: %{count}", count: sum)
}
end)
|> Enum.sort_by(fn %{date: date} -> date end, Date)
end
end

View File

@ -1,10 +1,10 @@
<div class="flex flex-col space-y-8 justify-center items-center">
<h1 class="title text-2xl title-primary-500">
<div class="flex flex-col justify-center items-center space-y-8">
<h1 class="text-2xl title title-primary-500">
<%= gettext("Range day") %>
</h1>
<%= if @packs |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600">
<h1 class="text-xl title text-primary-600">
<%= gettext("No ammo staged") %>
<%= display_emoji("😔") %>
</h1>
@ -17,7 +17,7 @@
<%= dgettext("actions", "Stage ammo") %>
</.link>
<div class="w-full flex flex-row flex-wrap justify-center items-stretch">
<div class="flex flex-row flex-wrap justify-center items-stretch w-full">
<.pack_card
:for={%{id: pack_id} = pack <- @packs}
pack={pack}
@ -48,12 +48,12 @@
<hr class="hr" />
<%= if @shot_record_count == 0 do %>
<h1 class="title text-xl text-primary-600">
<h1 class="text-xl title text-primary-600">
<%= gettext("No shots recorded") %>
<%= display_emoji("😔") %>
</h1>
<% else %>
<h1 class="title text-2xl text-primary-600">
<h1 class="text-2xl title text-primary-600">
<%= gettext("Shot log") %>
</h1>
@ -71,7 +71,7 @@
<%= dgettext("errors", "Your browser does not support the canvas element.") %>
</canvas>
<div class="w-full flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 max-w-2xl">
<div class="flex flex-col justify-center items-center space-y-4 w-full max-w-2xl sm:flex-row sm:space-y-0 sm:space-x-4">
<.form
:let={f}
for={%{}}
@ -104,7 +104,7 @@
as={:search}
phx-change="search"
phx-submit="search"
class="grow flex items-center"
class="flex items-center grow"
>
<%= text_input(f, :search_term,
class: "grow input input-primary",
@ -114,10 +114,25 @@
value: @search
) %>
</.form>
<.form
:let={f}
for={%{}}
as={:shot_records}
phx-change="change_dates"
phx-submit="change_dates"
class="flex items-center"
>
<%= label(f, :dates_start, gettext("Dates"),
class: "title text-primary-600 text-lg text-center"
) %>
<.date_range id="shot-record-range-picker" name="dates" />
</.form>
</div>
<%= if @shot_records |> Enum.empty?() do %>
<h1 class="title text-xl text-primary-600">
<h1 class="text-xl title text-primary-600">
<%= gettext("No shots recorded") %>
<%= display_emoji("😔") %>
</h1>
@ -129,7 +144,7 @@
current_user={@current_user}
>
<:actions :let={shot_record}>
<div class="px-4 py-2 space-x-4 flex justify-center items-center">
<div class="flex justify-center items-center px-4 py-2 space-x-4">
<.link
patch={~p"/range/edit/#{shot_record}"}
class="text-primary-600 link"

View File

@ -313,13 +313,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -326,13 +326,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -426,8 +426,8 @@ msgstr "Keine Tags für diesen Behälter"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Schießplatz"
@ -462,7 +462,7 @@ msgid "Record shots"
msgstr "Schüsse dokumentieren"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Keine Schüsse dokumentiert"
@ -647,8 +647,8 @@ msgid "Reset your password"
msgstr "Passwort zurücksetzen"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Schüsse dokumentieren"
@ -762,7 +762,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr "Patronen abgefeuert"
@ -1413,7 +1413,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr "Schießkladde editieren"
@ -1451,3 +1451,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr "Datum"

View File

@ -177,13 +177,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/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, 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/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr "Schießkladde erfolgreich gelöscht"
@ -240,7 +240,7 @@ msgstr "Spracheinstellung gespeichert."
msgid "Ammo deleted succesfully"
msgstr "Munitionsgruppe erfolgreich gelöscht"
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr "Munition erfolgreich demarkiert"

View File

@ -420,8 +420,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -456,7 +456,7 @@ msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -641,8 +641,8 @@ msgid "Reset your password"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -756,7 +756,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format
msgid "Rounds shot: %{count}"
msgstr ""
@ -1396,7 +1396,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format
msgid "Edit Shot Record"
msgstr ""
@ -1434,3 +1434,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format
msgid "Dates"
msgstr ""

View File

@ -313,13 +313,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -420,8 +420,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -456,7 +456,7 @@ msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -641,8 +641,8 @@ msgid "Reset your password"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format, fuzzy
msgid "Record Shots"
msgstr ""
@ -756,7 +756,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr ""
@ -1396,7 +1396,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr ""
@ -1434,3 +1434,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr ""

View File

@ -156,13 +156,13 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr ""
@ -219,7 +219,7 @@ msgstr ""
msgid "Ammo deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr ""

View File

@ -326,13 +326,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -427,8 +427,8 @@ msgstr "Contenedor sin etiquetas"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Campo de tiro"
@ -463,7 +463,7 @@ msgid "Record shots"
msgstr "Tiros récord"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "No se han grabado tiros"
@ -648,8 +648,8 @@ msgid "Reset your password"
msgstr "Reestablecer contraseña"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Tiros Récord"
@ -764,7 +764,7 @@ msgstr "Mostrar usadas"
msgid "%{percentage}%"
msgstr "%{percentage}%"
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr "Balas disparadas: %{count}"
@ -1415,7 +1415,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr "Editar Tiros Récord"
@ -1453,3 +1453,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr "Fecha"

View File

@ -176,13 +176,13 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr "Está seguro que desea desmontar esta munición?"
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr "¿Está segure que quiere borrar este récord de disparos?"
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr "Récord de disparos borrado exitosamente"
@ -239,7 +239,7 @@ msgstr "Idioma cambiado exitosamente."
msgid "Ammo deleted succesfully"
msgstr "Munición borrada exitosamente"
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr "Munición descargada exitosamente"

View File

@ -326,13 +326,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -428,8 +428,8 @@ msgstr "Aucun tag pour ce conteneur"
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr "Portée"
@ -464,7 +464,7 @@ msgid "Record shots"
msgstr "Tirs enregistrés"
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr "Aucun tir enregistré"
@ -649,8 +649,8 @@ msgid "Reset your password"
msgstr "Réinitialiser votre mot de passe"
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr "Enregistrer des tirs"
@ -765,7 +765,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr "Cartouches tirées"
@ -1416,7 +1416,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr "Modifier les enregistrements de tir"
@ -1454,3 +1454,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr "Date"

View File

@ -178,13 +178,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/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, 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/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr "Enregistrements de tir supprimés avec succès"
@ -241,7 +241,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:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format, fuzzy
msgid "Ammo unstaged succesfully"
msgstr "Groupe de munition désélectionner avec succès"

View File

@ -324,13 +324,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format, fuzzy
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -422,8 +422,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -458,7 +458,7 @@ msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -643,8 +643,8 @@ msgid "Reset your password"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -758,7 +758,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format, fuzzy
msgid "Rounds shot: %{count}"
msgstr ""
@ -1407,7 +1407,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format, fuzzy
msgid "Edit Shot Record"
msgstr ""
@ -1445,3 +1445,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr ""

View File

@ -167,13 +167,13 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr ""
@ -230,7 +230,7 @@ msgstr ""
msgid "Ammo deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully"
msgstr ""

View File

@ -324,13 +324,13 @@ msgid "View pack of %{pack_count} bullets"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:159
#: lib/cannery_web/live/range_live/index.html.heex:154
#: lib/cannery_web/live/range_live/index.html.heex:169
#, elixir-autogen, elixir-format
msgid "Delete shot record of %{shot_record_count} shots"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:144
#: lib/cannery_web/live/range_live/index.html.heex:137
#: lib/cannery_web/live/range_live/index.html.heex:152
#, elixir-autogen, elixir-format
msgid "Edit shot record of %{shot_record_count} shots"
msgstr ""

View File

@ -431,8 +431,8 @@ msgstr ""
#: lib/cannery_web/components/core_components/topbar.html.heex:48
#: lib/cannery_web/components/pack_table_component.ex:80
#: lib/cannery_web/live/range_live/index.ex:55
#: lib/cannery_web/live/range_live/index.ex:65
#: lib/cannery_web/live/range_live/index.ex:75
#: lib/cannery_web/live/range_live/index.ex:85
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""
@ -467,7 +467,7 @@ msgid "Record shots"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:52
#: lib/cannery_web/live/range_live/index.html.heex:121
#: lib/cannery_web/live/range_live/index.html.heex:136
#, elixir-autogen, elixir-format
msgid "No shots recorded"
msgstr ""
@ -652,8 +652,8 @@ msgid "Reset your password"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:40
#: lib/cannery_web/live/range_live/index.ex:31
#: lib/cannery_web/live/range_live/index.ex:47
#: lib/cannery_web/live/range_live/index.ex:51
#: lib/cannery_web/live/range_live/index.ex:67
#, elixir-autogen, elixir-format
msgid "Record Shots"
msgstr ""
@ -767,7 +767,7 @@ msgstr ""
msgid "%{percentage}%"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:153
#: lib/cannery_web/live/range_live/index.ex:207
#, elixir-autogen, elixir-format
msgid "Rounds shot: %{count}"
msgstr ""
@ -1407,7 +1407,7 @@ msgid "Used up!"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:41
#: lib/cannery_web/live/range_live/index.ex:39
#: lib/cannery_web/live/range_live/index.ex:59
#, elixir-autogen, elixir-format
msgid "Edit Shot Record"
msgstr ""
@ -1445,3 +1445,8 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Any"
msgstr ""
#: lib/cannery_web/live/range_live/index.html.heex:126
#, elixir-autogen, elixir-format, fuzzy
msgid "Dates"
msgstr ""

View File

@ -167,13 +167,13 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr ""
@ -230,7 +230,7 @@ msgstr ""
msgid "Ammo deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully"
msgstr ""

View File

@ -156,13 +156,13 @@ msgid "Are you sure you want to unstage this ammo?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:157
#: lib/cannery_web/live/range_live/index.html.heex:151
#: lib/cannery_web/live/range_live/index.html.heex:166
#, elixir-autogen, elixir-format
msgid "Are you sure you want to delete this shot record?"
msgstr ""
#: lib/cannery_web/live/pack_live/show.ex:79
#: lib/cannery_web/live/range_live/index.ex:78
#: lib/cannery_web/live/range_live/index.ex:98
#, elixir-autogen, elixir-format
msgid "Shot records deleted succesfully"
msgstr ""
@ -219,7 +219,7 @@ msgstr ""
msgid "Ammo deleted succesfully"
msgstr ""
#: lib/cannery_web/live/range_live/index.ex:91
#: lib/cannery_web/live/range_live/index.ex:111
#, elixir-autogen, elixir-format
msgid "Ammo unstaged succesfully"
msgstr ""