Compare commits
	
		
			14 Commits
		
	
	
		
			0.8.0
			...
			0b27c8f80b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0b27c8f80b | |||
| 0ad1ee47de | |||
| 8ea2b06487 | |||
| 1e4accec9d | |||
| 076d5eea18 | |||
| 5b6bd00047 | |||
| 8dd471afa8 | |||
| 09d3754f92 | |||
| fa67fd5a3b | |||
| 0a56b32b17 | |||
| 5f214ab7f9 | |||
| 0c95fa88f4 | |||
| 61f8776d2e | |||
| 26f75c7d15 | 
@@ -1,3 +1,9 @@
 | 
			
		||||
# v0.8.1
 | 
			
		||||
- Update dependencies
 | 
			
		||||
- Show topbar on form submit/page refresh
 | 
			
		||||
- Make loading/reconnection less intrusive
 | 
			
		||||
- Add QR code for invite link
 | 
			
		||||
 | 
			
		||||
# v0.8.0
 | 
			
		||||
- Add search to catalog, ammo, container, tag and range index pages
 | 
			
		||||
- Tweak urls for catalog, ammo, containers, tags and shot records
 | 
			
		||||
 
 | 
			
		||||
@@ -144,3 +144,4 @@ Thank you so much for your contributions!
 | 
			
		||||
- kaia (https://shitposter.club/users/kaia)
 | 
			
		||||
- duponin (https://udongein.xyz/users/duponin)
 | 
			
		||||
- kalli (https://twitter.com/t0kkuro)
 | 
			
		||||
- brea (https://refusal.biz/users/tarperfume)
 | 
			
		||||
 
 | 
			
		||||
@@ -25,12 +25,13 @@ $fa-font-path: "@fortawesome/fontawesome-free/webfonts";
 | 
			
		||||
  100% { scale: 1.0; opacity: 1; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-connected > #disconnect, #loading {
 | 
			
		||||
// disconnect toast
 | 
			
		||||
.phx-connected > #disconnect {
 | 
			
		||||
  opacity: 0 !important;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.phx-loading:not(.phx-error) > #loading, .phx-error > #disconnect {
 | 
			
		||||
.phx-error > #disconnect {
 | 
			
		||||
  opacity: 0.95 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ import 'phoenix_html'
 | 
			
		||||
// Establish Phoenix Socket and LiveView configuration.
 | 
			
		||||
import { Socket } from 'phoenix'
 | 
			
		||||
import { LiveSocket } from 'phoenix_live_view'
 | 
			
		||||
import topbar from '../vendor/topbar'
 | 
			
		||||
import topbar from 'topbar'
 | 
			
		||||
import MaintainAttrs from './maintain_attrs'
 | 
			
		||||
import ShotLogChart from './shot_log_chart'
 | 
			
		||||
import Alpine from 'alpinejs'
 | 
			
		||||
@@ -48,6 +48,8 @@ Alpine.start()
 | 
			
		||||
topbar.config({ barColors: { 0: '#29d' }, shadowColor: 'rgba(0, 0, 0, .3)' })
 | 
			
		||||
window.addEventListener('phx:page-loading-start', info => topbar.show())
 | 
			
		||||
window.addEventListener('phx:page-loading-stop', info => topbar.hide())
 | 
			
		||||
window.addEventListener('submit', info => topbar.show())
 | 
			
		||||
window.addEventListener('beforeunload', info => topbar.show())
 | 
			
		||||
 | 
			
		||||
// connect if there are any LiveViews on the page
 | 
			
		||||
liveSocket.connect()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								assets/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										36
									
								
								assets/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -6215,9 +6215,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/json5": {
 | 
			
		||||
      "version": "2.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
 | 
			
		||||
      "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
 | 
			
		||||
      "version": "2.2.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
 | 
			
		||||
      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "json5": "lib/cli.js"
 | 
			
		||||
@@ -6333,9 +6333,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/loader-utils": {
 | 
			
		||||
      "version": "2.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "big.js": "^5.2.2",
 | 
			
		||||
@@ -9639,9 +9639,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsconfig-paths/node_modules/json5": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "minimist": "^1.2.0"
 | 
			
		||||
@@ -14763,9 +14763,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "json5": {
 | 
			
		||||
      "version": "2.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
 | 
			
		||||
      "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
 | 
			
		||||
      "version": "2.2.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
 | 
			
		||||
      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "jsx-ast-utils": {
 | 
			
		||||
@@ -14850,9 +14850,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "loader-utils": {
 | 
			
		||||
      "version": "2.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "big.js": "^5.2.2",
 | 
			
		||||
@@ -17080,9 +17080,9 @@
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "json5": {
 | 
			
		||||
          "version": "1.0.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
 | 
			
		||||
          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
 | 
			
		||||
          "version": "1.0.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
 | 
			
		||||
          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "minimist": "^1.2.0"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										157
									
								
								assets/vendor/topbar.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										157
									
								
								assets/vendor/topbar.js
									
									
									
									
										vendored
									
									
								
							@@ -1,157 +0,0 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @license MIT
 | 
			
		||||
 * topbar 1.0.0, 2021-01-06
 | 
			
		||||
 * https://buunguyen.github.io/topbar
 | 
			
		||||
 * Copyright (c) 2021 Buu Nguyen
 | 
			
		||||
 */
 | 
			
		||||
(function (window, document) {
 | 
			
		||||
  "use strict";
 | 
			
		||||
 | 
			
		||||
  // https://gist.github.com/paulirish/1579671
 | 
			
		||||
  (function () {
 | 
			
		||||
    var lastTime = 0;
 | 
			
		||||
    var vendors = ["ms", "moz", "webkit", "o"];
 | 
			
		||||
    for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
 | 
			
		||||
      window.requestAnimationFrame =
 | 
			
		||||
        window[vendors[x] + "RequestAnimationFrame"];
 | 
			
		||||
      window.cancelAnimationFrame =
 | 
			
		||||
        window[vendors[x] + "CancelAnimationFrame"] ||
 | 
			
		||||
        window[vendors[x] + "CancelRequestAnimationFrame"];
 | 
			
		||||
    }
 | 
			
		||||
    if (!window.requestAnimationFrame)
 | 
			
		||||
      window.requestAnimationFrame = function (callback, element) {
 | 
			
		||||
        var currTime = new Date().getTime();
 | 
			
		||||
        var timeToCall = Math.max(0, 16 - (currTime - lastTime));
 | 
			
		||||
        var id = window.setTimeout(function () {
 | 
			
		||||
          callback(currTime + timeToCall);
 | 
			
		||||
        }, timeToCall);
 | 
			
		||||
        lastTime = currTime + timeToCall;
 | 
			
		||||
        return id;
 | 
			
		||||
      };
 | 
			
		||||
    if (!window.cancelAnimationFrame)
 | 
			
		||||
      window.cancelAnimationFrame = function (id) {
 | 
			
		||||
        clearTimeout(id);
 | 
			
		||||
      };
 | 
			
		||||
  })();
 | 
			
		||||
 | 
			
		||||
  var canvas,
 | 
			
		||||
    progressTimerId,
 | 
			
		||||
    fadeTimerId,
 | 
			
		||||
    currentProgress,
 | 
			
		||||
    showing,
 | 
			
		||||
    addEvent = function (elem, type, handler) {
 | 
			
		||||
      if (elem.addEventListener) elem.addEventListener(type, handler, false);
 | 
			
		||||
      else if (elem.attachEvent) elem.attachEvent("on" + type, handler);
 | 
			
		||||
      else elem["on" + type] = handler;
 | 
			
		||||
    },
 | 
			
		||||
    options = {
 | 
			
		||||
      autoRun: true,
 | 
			
		||||
      barThickness: 3,
 | 
			
		||||
      barColors: {
 | 
			
		||||
        0: "rgba(26,  188, 156, .9)",
 | 
			
		||||
        ".25": "rgba(52,  152, 219, .9)",
 | 
			
		||||
        ".50": "rgba(241, 196, 15,  .9)",
 | 
			
		||||
        ".75": "rgba(230, 126, 34,  .9)",
 | 
			
		||||
        "1.0": "rgba(211, 84,  0,   .9)",
 | 
			
		||||
      },
 | 
			
		||||
      shadowBlur: 10,
 | 
			
		||||
      shadowColor: "rgba(0,   0,   0,   .6)",
 | 
			
		||||
      className: null,
 | 
			
		||||
    },
 | 
			
		||||
    repaint = function () {
 | 
			
		||||
      canvas.width = window.innerWidth;
 | 
			
		||||
      canvas.height = options.barThickness * 5; // need space for shadow
 | 
			
		||||
 | 
			
		||||
      var ctx = canvas.getContext("2d");
 | 
			
		||||
      ctx.shadowBlur = options.shadowBlur;
 | 
			
		||||
      ctx.shadowColor = options.shadowColor;
 | 
			
		||||
 | 
			
		||||
      var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
 | 
			
		||||
      for (var stop in options.barColors)
 | 
			
		||||
        lineGradient.addColorStop(stop, options.barColors[stop]);
 | 
			
		||||
      ctx.lineWidth = options.barThickness;
 | 
			
		||||
      ctx.beginPath();
 | 
			
		||||
      ctx.moveTo(0, options.barThickness / 2);
 | 
			
		||||
      ctx.lineTo(
 | 
			
		||||
        Math.ceil(currentProgress * canvas.width),
 | 
			
		||||
        options.barThickness / 2
 | 
			
		||||
      );
 | 
			
		||||
      ctx.strokeStyle = lineGradient;
 | 
			
		||||
      ctx.stroke();
 | 
			
		||||
    },
 | 
			
		||||
    createCanvas = function () {
 | 
			
		||||
      canvas = document.createElement("canvas");
 | 
			
		||||
      var style = canvas.style;
 | 
			
		||||
      style.position = "fixed";
 | 
			
		||||
      style.top = style.left = style.right = style.margin = style.padding = 0;
 | 
			
		||||
      style.zIndex = 100001;
 | 
			
		||||
      style.display = "none";
 | 
			
		||||
      if (options.className) canvas.classList.add(options.className);
 | 
			
		||||
      document.body.appendChild(canvas);
 | 
			
		||||
      addEvent(window, "resize", repaint);
 | 
			
		||||
    },
 | 
			
		||||
    topbar = {
 | 
			
		||||
      config: function (opts) {
 | 
			
		||||
        for (var key in opts)
 | 
			
		||||
          if (options.hasOwnProperty(key)) options[key] = opts[key];
 | 
			
		||||
      },
 | 
			
		||||
      show: function () {
 | 
			
		||||
        if (showing) return;
 | 
			
		||||
        showing = true;
 | 
			
		||||
        if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId);
 | 
			
		||||
        if (!canvas) createCanvas();
 | 
			
		||||
        canvas.style.opacity = 1;
 | 
			
		||||
        canvas.style.display = "block";
 | 
			
		||||
        topbar.progress(0);
 | 
			
		||||
        if (options.autoRun) {
 | 
			
		||||
          (function loop() {
 | 
			
		||||
            progressTimerId = window.requestAnimationFrame(loop);
 | 
			
		||||
            topbar.progress(
 | 
			
		||||
              "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
 | 
			
		||||
            );
 | 
			
		||||
          })();
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      progress: function (to) {
 | 
			
		||||
        if (typeof to === "undefined") return currentProgress;
 | 
			
		||||
        if (typeof to === "string") {
 | 
			
		||||
          to =
 | 
			
		||||
            (to.indexOf("+") >= 0 || to.indexOf("-") >= 0
 | 
			
		||||
              ? currentProgress
 | 
			
		||||
              : 0) + parseFloat(to);
 | 
			
		||||
        }
 | 
			
		||||
        currentProgress = to > 1 ? 1 : to;
 | 
			
		||||
        repaint();
 | 
			
		||||
        return currentProgress;
 | 
			
		||||
      },
 | 
			
		||||
      hide: function () {
 | 
			
		||||
        if (!showing) return;
 | 
			
		||||
        showing = false;
 | 
			
		||||
        if (progressTimerId != null) {
 | 
			
		||||
          window.cancelAnimationFrame(progressTimerId);
 | 
			
		||||
          progressTimerId = null;
 | 
			
		||||
        }
 | 
			
		||||
        (function loop() {
 | 
			
		||||
          if (topbar.progress("+.1") >= 1) {
 | 
			
		||||
            canvas.style.opacity -= 0.05;
 | 
			
		||||
            if (canvas.style.opacity <= 0.05) {
 | 
			
		||||
              canvas.style.display = "none";
 | 
			
		||||
              fadeTimerId = null;
 | 
			
		||||
              return;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          fadeTimerId = window.requestAnimationFrame(loop);
 | 
			
		||||
        })();
 | 
			
		||||
      },
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  if (typeof module === "object" && typeof module.exports === "object") {
 | 
			
		||||
    module.exports = topbar;
 | 
			
		||||
  } else if (typeof define === "function" && define.amd) {
 | 
			
		||||
    define(function () {
 | 
			
		||||
      return topbar;
 | 
			
		||||
    });
 | 
			
		||||
  } else {
 | 
			
		||||
    this.topbar = topbar;
 | 
			
		||||
  }
 | 
			
		||||
}.call(this, window, document));
 | 
			
		||||
@@ -15,17 +15,18 @@ end
 | 
			
		||||
config :cannery, CanneryWeb.ViewHelpers, shibao_mode: System.get_env("SHIBAO_MODE") == "true"
 | 
			
		||||
 | 
			
		||||
# Set default locale
 | 
			
		||||
config :gettext, :default_locale, System.get_env("LOCALE") || "en_US"
 | 
			
		||||
config :gettext, :default_locale, System.get_env("LOCALE", "en_US")
 | 
			
		||||
 | 
			
		||||
maybe_ipv6 = if System.get_env("ECTO_IPV6") == "true", do: [:inet6], else: []
 | 
			
		||||
 | 
			
		||||
database_url =
 | 
			
		||||
  if config_env() == :test do
 | 
			
		||||
    System.get_env("TEST_DATABASE_URL") ||
 | 
			
		||||
    System.get_env(
 | 
			
		||||
      "TEST_DATABASE_URL",
 | 
			
		||||
      "ecto://postgres:postgres@localhost/cannery_test#{System.get_env("MIX_TEST_PARTITION")}"
 | 
			
		||||
    )
 | 
			
		||||
  else
 | 
			
		||||
    System.get_env("DATABASE_URL") ||
 | 
			
		||||
      "ecto://postgres:postgres@cannery-db/cannery"
 | 
			
		||||
    System.get_env("DATABASE_URL", "ecto://postgres:postgres@cannery-db/cannery")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
host =
 | 
			
		||||
@@ -40,7 +41,7 @@ interface =
 | 
			
		||||
config :cannery, Cannery.Repo,
 | 
			
		||||
  # ssl: true,
 | 
			
		||||
  url: database_url,
 | 
			
		||||
  pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
 | 
			
		||||
  pool_size: String.to_integer(System.get_env("POOL_SIZE", "10")),
 | 
			
		||||
  socket_options: maybe_ipv6
 | 
			
		||||
 | 
			
		||||
config :cannery, CanneryWeb.Endpoint,
 | 
			
		||||
@@ -49,10 +50,10 @@ config :cannery, CanneryWeb.Endpoint,
 | 
			
		||||
    # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
 | 
			
		||||
    # for details about using IPv6 vs IPv4 and loopback vs public addresses.
 | 
			
		||||
    ip: interface,
 | 
			
		||||
    port: String.to_integer(System.get_env("PORT") || "4000")
 | 
			
		||||
    port: String.to_integer(System.get_env("PORT", "4000"))
 | 
			
		||||
  ],
 | 
			
		||||
  server: true,
 | 
			
		||||
  registration: System.get_env("REGISTRATION") || "invite"
 | 
			
		||||
  registration: System.get_env("REGISTRATION", "invite")
 | 
			
		||||
 | 
			
		||||
if config_env() == :prod do
 | 
			
		||||
  # The secret key base is used to sign/encrypt cookies and other secrets.
 | 
			
		||||
@@ -76,12 +77,12 @@ if config_env() == :prod do
 | 
			
		||||
  config :cannery, Cannery.Mailer,
 | 
			
		||||
    adapter: Swoosh.Adapters.SMTP,
 | 
			
		||||
    relay: System.get_env("SMTP_HOST") || raise("No SMTP_HOST set!"),
 | 
			
		||||
    port: System.get_env("SMTP_PORT") || 587,
 | 
			
		||||
    port: System.get_env("SMTP_PORT", 587),
 | 
			
		||||
    username: System.get_env("SMTP_USERNAME") || raise("No SMTP_USERNAME set!"),
 | 
			
		||||
    password: System.get_env("SMTP_PASSWORD") || raise("No SMTP_PASSWORD set!"),
 | 
			
		||||
    ssl: System.get_env("SMTP_SSL") == "true",
 | 
			
		||||
    email_from: System.get_env("EMAIL_FROM") || "no-reply@#{System.get_env("HOST")}",
 | 
			
		||||
    email_name: System.get_env("EMAIL_NAME") || "Cannery"
 | 
			
		||||
    email_from: System.get_env("EMAIL_FROM", "no-reply@#{System.get_env("HOST")}"),
 | 
			
		||||
    email_name: System.get_env("EMAIL_NAME", "Cannery")
 | 
			
		||||
 | 
			
		||||
  # ## Using releases
 | 
			
		||||
  #
 | 
			
		||||
 
 | 
			
		||||
@@ -55,13 +55,13 @@ defmodule CanneryWeb.Components.AmmoGroupCard do
 | 
			
		||||
 | 
			
		||||
        <span class="rounded-lg title text-lg">
 | 
			
		||||
          <%= gettext("Purchased on:") %>
 | 
			
		||||
          <%= @ammo_group.purchased_on |> display_date() %>
 | 
			
		||||
          <.date date={@ammo_group.purchased_on} />
 | 
			
		||||
        </span>
 | 
			
		||||
 | 
			
		||||
        <%= if @ammo_group |> Ammo.get_last_used_shot_group() do %>
 | 
			
		||||
          <span class="rounded-lg title text-lg">
 | 
			
		||||
            <%= gettext("Last used on:") %>
 | 
			
		||||
            <%= @ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date) |> display_date() %>
 | 
			
		||||
            <.date date={@ammo_group |> Ammo.get_last_used_shot_group() |> Map.get(:date)} />
 | 
			
		||||
          </span>
 | 
			
		||||
        <% end %>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -157,7 +157,7 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
 | 
			
		||||
 | 
			
		||||
    {purchased_on,
 | 
			
		||||
     ~H"""
 | 
			
		||||
     <%= @purchased_on |> display_date() %>
 | 
			
		||||
     <.date date={@purchased_on} />
 | 
			
		||||
     """}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@@ -173,7 +173,7 @@ defmodule CanneryWeb.Components.AmmoGroupTableComponent do
 | 
			
		||||
    {last_shot_group_date,
 | 
			
		||||
     ~H"""
 | 
			
		||||
     <%= if @last_shot_group_date do %>
 | 
			
		||||
       <%= @last_shot_group_date |> display_date() %>
 | 
			
		||||
       <.date date={@last_shot_group_date} />
 | 
			
		||||
     <% else %>
 | 
			
		||||
       <%= gettext("Never used") %>
 | 
			
		||||
     <% end %>
 | 
			
		||||
 
 | 
			
		||||
@@ -27,8 +27,14 @@ defmodule CanneryWeb.Components.InviteCard do
 | 
			
		||||
 | 
			
		||||
      <%= if @invite.disabled_at |> is_nil() do %>
 | 
			
		||||
        <h2 class="title text-md">
 | 
			
		||||
          <%= gettext("Uses Left:") %>
 | 
			
		||||
          <%= @invite.uses_left || "Unlimited" %>
 | 
			
		||||
          <%= if @invite.uses_left do %>
 | 
			
		||||
            <%= gettext(
 | 
			
		||||
              "Uses Left: %{uses_left}",
 | 
			
		||||
              uses_left: @invite.uses_left
 | 
			
		||||
            ) %>
 | 
			
		||||
          <% else %>
 | 
			
		||||
            <%= gettext("Uses Left: Unlimited") %>
 | 
			
		||||
          <% end %>
 | 
			
		||||
        </h2>
 | 
			
		||||
      <% else %>
 | 
			
		||||
        <h2 class="title text-md">
 | 
			
		||||
@@ -36,6 +42,11 @@ defmodule CanneryWeb.Components.InviteCard do
 | 
			
		||||
        </h2>
 | 
			
		||||
      <% end %>
 | 
			
		||||
 | 
			
		||||
      <.qr_code
 | 
			
		||||
        content={Routes.user_registration_url(Endpoint, :new, invite: @invite.token)}
 | 
			
		||||
        filename={@invite.name}
 | 
			
		||||
      />
 | 
			
		||||
 | 
			
		||||
      <div class="flex flex-row flex-wrap justify-center items-center">
 | 
			
		||||
        <code
 | 
			
		||||
          id={"code-#{@invite.id}"}
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,11 @@ defmodule CanneryWeb.Components.ShotGroupTableComponent do
 | 
			
		||||
    {ammo_type_name, name_block}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp get_row_value(:date, %{date: date}, _extra_data), do: date |> display_date()
 | 
			
		||||
  defp get_row_value(:date, assigns = %{date: _date}, _extra_data) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <.date date={@date} />
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp get_row_value(:actions, shot_group, %{actions: actions}) do
 | 
			
		||||
    assigns = %{actions: actions, shot_group: shot_group}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
      <tr>
 | 
			
		||||
        <%= for %{key: key, label: label} = column <- @columns do %>
 | 
			
		||||
          <%= if column |> Map.get(:sortable, true) do %>
 | 
			
		||||
            <th class={"p-2 #{column[:class]}"}>
 | 
			
		||||
            <th class={["p-2", column[:class]]}>
 | 
			
		||||
              <span
 | 
			
		||||
                class="cursor-pointer flex justify-center items-center space-x-2"
 | 
			
		||||
                phx-click="sort_by"
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
              </span>
 | 
			
		||||
            </th>
 | 
			
		||||
          <% else %>
 | 
			
		||||
            <th class={"p-2 cursor-not-allowed #{column[:class]}"}>
 | 
			
		||||
            <th class={["p-2 cursor-not-allowed", column[:class]]}>
 | 
			
		||||
              <%= label %>
 | 
			
		||||
            </th>
 | 
			
		||||
          <% end %>
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
      <%= for {values, i} <- @rows |> Enum.with_index() do %>
 | 
			
		||||
        <tr class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class}>
 | 
			
		||||
          <%= for %{key: key} = value <- @columns do %>
 | 
			
		||||
            <td class={"p-2 #{value[:class]}"}>
 | 
			
		||||
            <td class={["p-2", value[:class]]}>
 | 
			
		||||
              <%= case values |> Map.get(key) do %>
 | 
			
		||||
                <% {_custom_sort_value, value} -> %>
 | 
			
		||||
                  <%= value %>
 | 
			
		||||
 
 | 
			
		||||
@@ -23,16 +23,23 @@ defmodule CanneryWeb.Components.UserCard do
 | 
			
		||||
 | 
			
		||||
      <h3 class="px-4 py-2 rounded-lg title text-lg">
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= if @user.confirmed_at |> is_nil() do %>
 | 
			
		||||
            Email unconfirmed
 | 
			
		||||
          <%= if @user.confirmed_at do %>
 | 
			
		||||
            <%= gettext(
 | 
			
		||||
              "User was confirmed at%{confirmed_datetime}",
 | 
			
		||||
              confirmed_datetime: ""
 | 
			
		||||
            ) %>
 | 
			
		||||
            <.datetime datetime={@user.confirmed_at} />
 | 
			
		||||
          <% else %>
 | 
			
		||||
            User was confirmed at <%= @user.confirmed_at |> display_datetime() %>
 | 
			
		||||
            <%= gettext("Email unconfirmed") %>
 | 
			
		||||
          <% end %>
 | 
			
		||||
        </p>
 | 
			
		||||
 | 
			
		||||
        <p>
 | 
			
		||||
          <%= gettext("User registered on") %>
 | 
			
		||||
          <%= @user.inserted_at |> display_datetime() %>
 | 
			
		||||
          <%= gettext(
 | 
			
		||||
            "User registered on%{registered_datetime}",
 | 
			
		||||
            registered_datetime: ""
 | 
			
		||||
          ) %>
 | 
			
		||||
          <.datetime datetime={@user.inserted_at} />
 | 
			
		||||
        </p>
 | 
			
		||||
      </h3>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,12 @@ defmodule CanneryWeb.AmmoGroupLive.Show do
 | 
			
		||||
      value =
 | 
			
		||||
        case key do
 | 
			
		||||
          :date ->
 | 
			
		||||
            {date, date |> display_date()}
 | 
			
		||||
            assigns = %{date: date}
 | 
			
		||||
 | 
			
		||||
            {date,
 | 
			
		||||
             ~H"""
 | 
			
		||||
             <.date date={@date} />
 | 
			
		||||
             """}
 | 
			
		||||
 | 
			
		||||
          :actions ->
 | 
			
		||||
            ~H"""
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
 | 
			
		||||
    <span class="rounded-lg title text-lg">
 | 
			
		||||
      <%= gettext("Purchased on:") %>
 | 
			
		||||
      <%= @ammo_group.purchased_on |> display_date() %>
 | 
			
		||||
      <.date date={@ammo_group.purchased_on} />
 | 
			
		||||
    </span>
 | 
			
		||||
 | 
			
		||||
    <%= if @ammo_group.price_paid do %>
 | 
			
		||||
 
 | 
			
		||||
@@ -124,7 +124,7 @@
 | 
			
		||||
    </h3>
 | 
			
		||||
 | 
			
		||||
    <span class="text-primary-600">
 | 
			
		||||
      <%= @ammo_type.inserted_at |> display_datetime() %>
 | 
			
		||||
      <.datetime datetime={@ammo_type.inserted_at} />
 | 
			
		||||
    </span>
 | 
			
		||||
 | 
			
		||||
    <%= if @avg_cost_per_round do %>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,15 +11,17 @@ defmodule CanneryWeb.Router do
 | 
			
		||||
    plug :protect_from_forgery
 | 
			
		||||
    plug :put_secure_browser_headers
 | 
			
		||||
    plug :fetch_current_user
 | 
			
		||||
    plug :put_user_locale, default: Application.compile_env(:gettext, :default_locale, "en_US")
 | 
			
		||||
    plug :put_user_locale
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp put_user_locale(%{assigns: %{current_user: %{locale: locale}}} = conn, default: default) do
 | 
			
		||||
  defp put_user_locale(%{assigns: %{current_user: %{locale: locale}}} = conn, _opts) do
 | 
			
		||||
    default = Application.fetch_env!(:gettext, :default_locale)
 | 
			
		||||
    Gettext.put_locale(locale || default)
 | 
			
		||||
    conn |> put_session(:locale, locale || default)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp put_user_locale(conn, default: default) do
 | 
			
		||||
  defp put_user_locale(conn, _opts) do
 | 
			
		||||
    default = Application.fetch_env!(:gettext, :default_locale)
 | 
			
		||||
    Gettext.put_locale(default)
 | 
			
		||||
    conn |> put_session(:locale, default)
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
<main class="mb-8 min-w-full">
 | 
			
		||||
<main class="pb-8 min-w-full">
 | 
			
		||||
  <header>
 | 
			
		||||
    <.topbar current_user={assigns[:current_user]}></.topbar>
 | 
			
		||||
 | 
			
		||||
@@ -27,28 +27,16 @@
 | 
			
		||||
  </div>
 | 
			
		||||
</main>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
  id="loading"
 | 
			
		||||
  class="fixed opacity-0 top-0 left-0 w-screen h-screen bg-white z-50
 | 
			
		||||
  flex flex-col justify-center items-center space-y-4
 | 
			
		||||
  transition-opacity ease-in-out duration-500"
 | 
			
		||||
>
 | 
			
		||||
  <h1 class="title text-2xl title-primary-500">
 | 
			
		||||
    <%= gettext("Loading...") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <i class="fas fa-3x fa-spin fa-gear"></i>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
  id="disconnect"
 | 
			
		||||
  class="fixed opacity-0 top-0 left-0 w-screen h-screen bg-white z-50
 | 
			
		||||
  flex flex-col justify-center items-center space-y-4
 | 
			
		||||
  transition-opacity ease-in-out duration-500"
 | 
			
		||||
  class="z-50 fixed opacity-0 bottom-12 right-12 px-8 py-4 w-max h-max
 | 
			
		||||
  border border-primary-200 shadow-lg rounded-lg bg-white
 | 
			
		||||
  flex justify-center items-center space-x-4
 | 
			
		||||
  transition-opacity ease-in-out duration-500 delay-[2000ms]"
 | 
			
		||||
>
 | 
			
		||||
  <h1 class="title text-2xl title-primary-500">
 | 
			
		||||
  <i class="fas fa-fade text-md fa-satellite-dish"></i>
 | 
			
		||||
 | 
			
		||||
  <h1 class="title text-md title-primary-500">
 | 
			
		||||
    <%= gettext("Reconnecting...") %>
 | 
			
		||||
  </h1>
 | 
			
		||||
 | 
			
		||||
  <i class="fas fa-3x fa-fade fa-satellite-dish"></i>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,8 @@
 | 
			
		||||
      type="image/jpg"
 | 
			
		||||
      href={Routes.static_path(@conn, "/images/cannery.svg")}
 | 
			
		||||
    />
 | 
			
		||||
    <.live_title suffix=" | Cannery">
 | 
			
		||||
      <%= assigns[:page_title] || "Cannery" %>
 | 
			
		||||
    <.live_title suffix={" | #{gettext("Cannery")}"}>
 | 
			
		||||
      <%= assigns[:page_title] || gettext("Cannery") %>
 | 
			
		||||
    </.live_title>
 | 
			
		||||
    <link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/css/app.css")} />
 | 
			
		||||
    <script
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
    </script>
 | 
			
		||||
  </head>
 | 
			
		||||
 | 
			
		||||
  <body class="m-0 p-0 w-full h-full bg-white">
 | 
			
		||||
  <body class="m-0 p-0 w-full h-full subpixel-antialiased">
 | 
			
		||||
    <%= @inner_content %>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ defmodule CanneryWeb.ErrorHelpers do
 | 
			
		||||
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= for error <- Keyword.get_values(@form.errors, @field) do %>
 | 
			
		||||
      <span class={"invalid-feedback #{@extra_class}"} phx-feedback-for={input_name(@form, @field)}>
 | 
			
		||||
      <span class={["invalid-feedback", @extra_class]} phx-feedback-for={input_name(@form, @field)}>
 | 
			
		||||
        <%= translate_error(error) %>
 | 
			
		||||
      </span>
 | 
			
		||||
    <% end %>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,64 +5,62 @@ defmodule CanneryWeb.ViewHelpers do
 | 
			
		||||
  :view`
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  import Phoenix.Component
 | 
			
		||||
 | 
			
		||||
  @id_length 16
 | 
			
		||||
  use Phoenix.Component
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Returns a <time> element that renders the naivedatetime in the user's local
 | 
			
		||||
  timezone with Alpine.js
 | 
			
		||||
  Phoenix.Component for a <time> element that renders the naivedatetime in the
 | 
			
		||||
  user's local timezone with Alpine.js
 | 
			
		||||
  """
 | 
			
		||||
  @spec display_datetime(NaiveDateTime.t() | nil) :: Phoenix.LiveView.Rendered.t()
 | 
			
		||||
  def display_datetime(nil), do: ""
 | 
			
		||||
 | 
			
		||||
  def display_datetime(datetime) do
 | 
			
		||||
    assigns = %{
 | 
			
		||||
      id: :crypto.strong_rand_bytes(@id_length) |> Base.url_encode64(),
 | 
			
		||||
      datetime: datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601(:extended)
 | 
			
		||||
    }
 | 
			
		||||
  attr :datetime, :any, required: true, doc: "A `DateTime` struct or nil"
 | 
			
		||||
 | 
			
		||||
  def datetime(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= if @datetime do %>
 | 
			
		||||
      <time
 | 
			
		||||
      id={@id}
 | 
			
		||||
      datetime={@datetime}
 | 
			
		||||
        datetime={cast_datetime(@datetime)}
 | 
			
		||||
        x-data={"{
 | 
			
		||||
        date:
 | 
			
		||||
          datetime:
 | 
			
		||||
            Intl.DateTimeFormat([], {dateStyle: 'short', timeStyle: 'long'})
 | 
			
		||||
            .format(new Date(\"#{@datetime}\"))
 | 
			
		||||
              .format(new Date(\"#{cast_datetime(@datetime)}\"))
 | 
			
		||||
        }"}
 | 
			
		||||
      x-text="date"
 | 
			
		||||
        x-text="datetime"
 | 
			
		||||
      >
 | 
			
		||||
      <%= @datetime %>
 | 
			
		||||
        <%= cast_datetime(@datetime) %>
 | 
			
		||||
      </time>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec cast_datetime(NaiveDateTime.t() | nil) :: String.t()
 | 
			
		||||
  defp cast_datetime(%NaiveDateTime{} = datetime) do
 | 
			
		||||
    datetime |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601(:extended)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp cast_datetime(_datetime), do: ""
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Returns a <date> element that renders the Date in the user's local
 | 
			
		||||
  timezone with Alpine.js
 | 
			
		||||
  Phoenix.Component for a <date> element that renders the Date in the user's
 | 
			
		||||
  local timezone with Alpine.js
 | 
			
		||||
  """
 | 
			
		||||
  @spec display_date(Date.t() | nil) :: Phoenix.LiveView.Rendered.t()
 | 
			
		||||
  def display_date(nil), do: ""
 | 
			
		||||
 | 
			
		||||
  def display_date(date) do
 | 
			
		||||
    assigns = %{
 | 
			
		||||
      id: :crypto.strong_rand_bytes(@id_length) |> Base.url_encode64(),
 | 
			
		||||
      date: date |> Date.to_iso8601(:extended)
 | 
			
		||||
    }
 | 
			
		||||
  attr :date, :any, required: true, doc: "A `Date` struct or nil"
 | 
			
		||||
 | 
			
		||||
  def date(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <%= if @date do %>
 | 
			
		||||
      <time
 | 
			
		||||
      id={@id}
 | 
			
		||||
      datetime={@date}
 | 
			
		||||
        datetime={@date |> Date.to_iso8601(:extended)}
 | 
			
		||||
        x-data={"{
 | 
			
		||||
          date:
 | 
			
		||||
          Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'}).format(new Date(\"#{@date}\"))
 | 
			
		||||
            Intl.DateTimeFormat([], {timeZone: 'Etc/UTC', dateStyle: 'short'})
 | 
			
		||||
              .format(new Date(\"#{@date |> Date.to_iso8601(:extended)}\"))
 | 
			
		||||
        }"}
 | 
			
		||||
        x-text="date"
 | 
			
		||||
      >
 | 
			
		||||
      <%= @date %>
 | 
			
		||||
        <%= @date |> Date.to_iso8601(:extended) %>
 | 
			
		||||
      </time>
 | 
			
		||||
    <% end %>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@@ -70,12 +68,44 @@ defmodule CanneryWeb.ViewHelpers do
 | 
			
		||||
  Displays emoji as text emoji if SHIBAO_MODE is set to true :)
 | 
			
		||||
  """
 | 
			
		||||
  @spec display_emoji(String.t()) :: String.t()
 | 
			
		||||
  def display_emoji("😔"),
 | 
			
		||||
    do:
 | 
			
		||||
      if(Application.get_env(:cannery, CanneryWeb.ViewHelpers)[:shibao_mode], do: "q_q", else: "😔")
 | 
			
		||||
  def display_emoji("😔") do
 | 
			
		||||
    if Application.get_env(:cannery, CanneryWeb.ViewHelpers)[:shibao_mode], do: "q_q", else: "😔"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def display_emoji(other_emoji), do: other_emoji
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Displays content in a QR code as a base64 encoded PNG
 | 
			
		||||
  """
 | 
			
		||||
  @spec qr_code_image(String.t()) :: String.t()
 | 
			
		||||
  @spec qr_code_image(String.t(), width :: non_neg_integer()) :: String.t()
 | 
			
		||||
  def qr_code_image(content, width \\ 384) do
 | 
			
		||||
    img_data =
 | 
			
		||||
      content
 | 
			
		||||
      |> EQRCode.encode()
 | 
			
		||||
      |> EQRCode.png(width: width)
 | 
			
		||||
      |> Base.encode64()
 | 
			
		||||
 | 
			
		||||
    "data:image/png;base64," <> img_data
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Creates a downloadable QR Code element
 | 
			
		||||
  """
 | 
			
		||||
 | 
			
		||||
  attr :content, :string, required: true
 | 
			
		||||
  attr :filename, :string, default: "qrcode", doc: "filename without .png extension"
 | 
			
		||||
  attr :image_class, :string, default: "w-64 h-max"
 | 
			
		||||
  attr :width, :integer, default: 384, doc: "width of png to generate"
 | 
			
		||||
 | 
			
		||||
  def qr_code(assigns) do
 | 
			
		||||
    ~H"""
 | 
			
		||||
    <a href={qr_code_image(@content)} download={@filename <> ".png"}>
 | 
			
		||||
      <img class={@image_class} alt={@filename} src={qr_code_image(@content)} />
 | 
			
		||||
    </a>
 | 
			
		||||
    """
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @doc """
 | 
			
		||||
  Get a random color in `#ffffff` hex format
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								mix.exs
									
									
									
									
									
								
							@@ -4,7 +4,7 @@ defmodule Cannery.MixProject do
 | 
			
		||||
  def project do
 | 
			
		||||
    [
 | 
			
		||||
      app: :cannery,
 | 
			
		||||
      version: "0.8.0",
 | 
			
		||||
      version: "0.8.1",
 | 
			
		||||
      elixir: "1.14.1",
 | 
			
		||||
      elixirc_paths: elixirc_paths(Mix.env()),
 | 
			
		||||
      compilers: Mix.compilers(),
 | 
			
		||||
@@ -13,7 +13,7 @@ defmodule Cannery.MixProject do
 | 
			
		||||
      deps: deps(),
 | 
			
		||||
      dialyzer: [plt_add_apps: [:ex_unit]],
 | 
			
		||||
      consolidate_protocols: Mix.env() not in [:dev, :test],
 | 
			
		||||
      preferred_cli_env: [test: :test, "test.all": :test],
 | 
			
		||||
      preferred_cli_env: ["test.all": :test],
 | 
			
		||||
      # ExDoc
 | 
			
		||||
      name: "Cannery",
 | 
			
		||||
      source_url: "https://gitea.bubbletea.dev/shibao/cannery",
 | 
			
		||||
@@ -70,6 +70,7 @@ defmodule Cannery.MixProject do
 | 
			
		||||
      {:jason, "~> 1.2"},
 | 
			
		||||
      {:plug_cowboy, "~> 2.5"},
 | 
			
		||||
      {:ecto_psql_extras, "~> 0.6"},
 | 
			
		||||
      {:eqrcode, "~> 0.1.10"},
 | 
			
		||||
      {:credo, "~> 1.5", only: [:dev, :test], runtime: false},
 | 
			
		||||
      {:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}
 | 
			
		||||
    ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								mix.lock
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								mix.lock
									
									
									
									
									
								
							@@ -1,44 +1,42 @@
 | 
			
		||||
%{
 | 
			
		||||
  "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.1", "5114d780459a04f2b4aeef52307de23de961b69e13a5cd98a911e39fda13f420", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "42182d5f46764def15bf9af83739e3bf4ad22661b1c34fc3e88558efced07279"},
 | 
			
		||||
  "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
 | 
			
		||||
  "castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"},
 | 
			
		||||
  "castore": {:hex, :castore, "0.1.22", "4127549e411bedd012ca3a308dede574f43819fe9394254ca55ab4895abfa1a2", [:mix], [], "hexpm", "c17576df47eb5aa1ee40cc4134316a99f5cad3e215d5c77b8dd3cfef12a22cac"},
 | 
			
		||||
  "comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
 | 
			
		||||
  "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
 | 
			
		||||
  "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
 | 
			
		||||
  "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
 | 
			
		||||
  "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
 | 
			
		||||
  "credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"},
 | 
			
		||||
  "db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"},
 | 
			
		||||
  "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
 | 
			
		||||
  "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
 | 
			
		||||
  "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"},
 | 
			
		||||
  "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"},
 | 
			
		||||
  "ecto": {:hex, :ecto, "3.9.1", "67173b1687afeb68ce805ee7420b4261649d5e2deed8fe5550df23bab0bc4396", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c80bb3d736648df790f7f92f81b36c922d9dd3203ca65be4ff01d067f54eb304"},
 | 
			
		||||
  "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.4", "5d43fd088d39a158c860b17e8d210669587f63ec89ea122a4654861c8c6e2db4", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.15.7", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "311db02f1b772e3d0dc7f56a05044b5e1499d78ed6abf38885e1ca70059449e5"},
 | 
			
		||||
  "ecto_sql": {:hex, :ecto_sql, "3.9.0", "2bb21210a2a13317e098a420a8c1cc58b0c3421ab8e3acfa96417dab7817918c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a8f3f720073b8b1ac4c978be25fa7960ed7fd44997420c304a4a2e200b596453"},
 | 
			
		||||
  "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
 | 
			
		||||
  "ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"},
 | 
			
		||||
  "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"},
 | 
			
		||||
  "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"},
 | 
			
		||||
  "elixir_make": {:hex, :elixir_make, "0.7.3", "c37fdae1b52d2cc51069713a58c2314877c1ad40800a57efb213f77b078a460d", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "24ada3e3996adbed1fa024ca14995ef2ba3d0d17b678b0f3f2b1f66e6ce2b274"},
 | 
			
		||||
  "eqrcode": {:hex, :eqrcode, "0.1.10", "6294fece9d68ad64eef1c3c92cf111cfd6469f4fbf230a2d4cc905a682178f3f", [:mix], [], "hexpm", "da30e373c36a0fd37ab6f58664b16029919896d6c45a68a95cc4d713e81076f1"},
 | 
			
		||||
  "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
 | 
			
		||||
  "esbuild": {:hex, :esbuild, "0.4.0", "9f17db148aead4cf1e6e6a584214357287a93407b5fb51a031f122b61385d4c2", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "b61e4e6b92ffe45e4ee4755a22de6211a67c67987dc02afb35a425a0add1d447"},
 | 
			
		||||
  "ex_doc": {:hex, :ex_doc, "0.29.0", "4a1cb903ce746aceef9c1f9ae8a6c12b742a5461e6959b9d3b24d813ffbea146", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "f096adb8bbca677d35d278223361c7792d496b3fc0d0224c9d4bc2f651af5db1"},
 | 
			
		||||
  "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"},
 | 
			
		||||
  "expo": {:hex, :expo, "0.3.0", "13127c1d5f653b2927f2616a4c9ace5ae372efd67c7c2693b87fd0fdc30c6feb", [:mix], [], "hexpm", "fb3cd4bf012a77bc1608915497dae2ff684a06f0fa633c7afa90c4d72b881823"},
 | 
			
		||||
  "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
 | 
			
		||||
  "floki": {:hex, :floki, "0.34.0", "002d0cc194b48794d74711731db004fafeb328fe676976f160685262d43706a8", [:mix], [], "hexpm", "9c3a9f43f40dde00332a589bd9d389b90c1f518aef500364d00636acc5ebc99c"},
 | 
			
		||||
  "gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"},
 | 
			
		||||
  "gettext": {:hex, :gettext, "0.20.0", "75ad71de05f2ef56991dbae224d35c68b098dd0e26918def5bb45591d5c8d429", [:mix], [], "hexpm", "1c03b177435e93a47441d7f681a7040bd2a816ece9e2666d1c9001035121eb3d"},
 | 
			
		||||
  "heex_formatter": {:git, "https://github.com/feliperenan/heex_formatter.git", "dfefc9ae267fb0874c287ceb6c47dda106c59552", []},
 | 
			
		||||
  "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
 | 
			
		||||
  "hut": {:hex, :hut, "1.3.0", "71f2f054e657c03f959cf1acc43f436ea87580696528ca2a55c8afb1b06c85e7", [:"erlang.mk", :rebar, :rebar3], [], "hexpm", "7e15d28555d8a1f2b5a3a931ec120af0753e4853a4c66053db354f35bf9ab563"},
 | 
			
		||||
  "gettext": {:hex, :gettext, "0.22.0", "a25d71ec21b1848957d9207b81fd61cb25161688d282d58bdafef74c2270bdc4", [:mix], [{:expo, "~> 0.3.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "cb0675141576f73720c8e49b4f0fd3f2c69f0cd8c218202724d4aebab8c70ace"},
 | 
			
		||||
  "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"},
 | 
			
		||||
  "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
 | 
			
		||||
  "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
 | 
			
		||||
  "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
 | 
			
		||||
  "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"},
 | 
			
		||||
  "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
 | 
			
		||||
  "oban": {:hex, :oban, "2.13.4", "b4c4f48f4c89cc01036670eefa28aa9c03d09aadd402655475b936983d597006", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a7d26f82b409e2d7928fbb75a17716e06ad3f783ebe9af260e3dd23abed7f124"},
 | 
			
		||||
  "oban": {:hex, :oban, "2.13.6", "a0cb1bce3bd393770512231fb5a3695fa19fd3af10d7575bf73f837aee7abf43", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c1c5eb16f377b3cbbf2ea14be24d20e3d91285af9d1ac86260b7c2af5464887"},
 | 
			
		||||
  "phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"},
 | 
			
		||||
  "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
 | 
			
		||||
  "phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
 | 
			
		||||
  "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.1", "b0bf8f3348dec4910907a2ad1453e642f6fe4d444376c1c9b26222d63c73cf97", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "b6c5d744bf4b40692b1b361d3608bdfd05aeab83e17c7bc217d730f007f31abf"},
 | 
			
		||||
  "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.0", "4fe222c0be55fdc3f9c711e24955fc42a7cd9b7a2f5f406f2580a567c335a573", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "bebf0fc2d2113b61cb5968f585367234b7b4c21d963d691de7b4b2dc6cdaae6f"},
 | 
			
		||||
  "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.2", "635cf07de947235deb030cd6b776c71a3b790ab04cebf526aa8c879fe17c7784", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6 or ~> 1.7", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "da287a77327e996cc166e4c440c3ad5ab33ccdb151b91c793209b39ebbce5b75"},
 | 
			
		||||
  "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
 | 
			
		||||
  "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.2", "635cf07de947235deb030cd6b776c71a3b790ab04cebf526aa8c879fe17c7784", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "da287a77327e996cc166e4c440c3ad5ab33ccdb151b91c793209b39ebbce5b75"},
 | 
			
		||||
  "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
 | 
			
		||||
  "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.1.0", "f8e4780705c9f254cc853f7a40e25f7198ba4d91102bcfad2226669b69766b35", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "aa82f10afd9a4b6080fdf3274dbb9432b25b210d42b4b6b55308f6e59cd87c3d"},
 | 
			
		||||
  "phoenix_view": {:hex, :phoenix_view, "1.1.2", "1b82764a065fb41051637872c7bd07ed2fdb6f5c3bd89684d4dca6e10115c95a", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "7ae90ad27b09091266f6adbb61e1d2516a7c3d7062c6789d46a7554ec40f3a56"},
 | 
			
		||||
@@ -47,10 +45,9 @@
 | 
			
		||||
  "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"},
 | 
			
		||||
  "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
 | 
			
		||||
  "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
 | 
			
		||||
  "set_locale": {:hex, :set_locale, "0.2.9", "33350ba3c66f1c560dffc43019eea4b573f91c5cbe3e461fe0e5395d2d6ba2c3", [:mix], [{:gettext, "~>0.14", [hex: :gettext, repo: "hexpm", optional: false]}, {:phoenix, ">1.3.0", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "e46348b64b7c5d725d0c90a6524942a19b65e6ce27372ddf9a727dfb64ba236c"},
 | 
			
		||||
  "swoosh": {:hex, :swoosh, "1.8.2", "af9a22ab2c0d20b266f61acca737fa11a121902de9466a39e91bacdce012101c", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d058ba750eafadb6c09a84a352c14c5d1eeeda6e84945fcc95785b7f3067b7db"},
 | 
			
		||||
  "swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"},
 | 
			
		||||
  "table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
 | 
			
		||||
  "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"},
 | 
			
		||||
  "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
 | 
			
		||||
  "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
 | 
			
		||||
  "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -194,7 +194,7 @@ msgstr "Brandmunition"
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr "Instanzinformationen"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr "Einladung deaktiviert"
 | 
			
		||||
@@ -441,11 +441,6 @@ msgstr "Art:"
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr "Benutzer"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr "Verbleibende Nutzung:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -632,16 +627,11 @@ msgstr "Demarkiert"
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr "Patronenhülsenform"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr "Neu verbinden..."
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr "Lädt..."
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -739,11 +729,6 @@ msgstr "Kopien"
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr "Hinzugefügt am:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr "Benutzer registriert am"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1151,3 +1136,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr "Benutzer registriert am"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr "Verbleibende Nutzung:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr "Verbleibende Nutzung:"
 | 
			
		||||
 
 | 
			
		||||
@@ -208,7 +208,7 @@ msgstr "Schüsse erfolgreich dokumentiert"
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
@@ -179,7 +179,7 @@ msgstr ""
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
@@ -424,11 +424,6 @@ msgstr ""
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -615,16 +610,11 @@ msgstr ""
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -722,11 +712,6 @@ msgstr ""
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1134,3 +1119,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: en\n"
 | 
			
		||||
"Plural-Forms: nplurals=2\n"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/ammo_group_live/index.ex:54
 | 
			
		||||
#: lib/cannery_web/live/ammo_group_live/index.ex:62
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: en\n"
 | 
			
		||||
"Plural-Forms: nplurals=2\n"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/home_live.ex:47
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -180,7 +179,7 @@ msgstr ""
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
@@ -425,11 +424,6 @@ msgstr ""
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -616,16 +610,11 @@ msgstr ""
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -723,11 +712,6 @@ msgstr ""
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1135,3 +1119,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: en\n"
 | 
			
		||||
"Plural-Forms: nplurals=2\n"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery/accounts/email.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: en\n"
 | 
			
		||||
"Plural-Forms: nplurals=2\n"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/ammo_type_live/form_component.ex:86
 | 
			
		||||
#: lib/cannery_web/live/container_live/form_component.ex:89
 | 
			
		||||
@@ -188,7 +187,7 @@ msgstr ""
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
@@ -194,7 +194,7 @@ msgstr "Incendiaria"
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr "Información de Instancia"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr "Invitación Desactivada"
 | 
			
		||||
@@ -442,11 +442,6 @@ msgstr "Tipo:"
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr "Usuarios"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr "Usos Restantes:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -633,16 +628,11 @@ msgstr "Retirar"
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr "Tipo de fuego"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr "Reconectando..."
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr "Cargando..."
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -740,11 +730,6 @@ msgstr "Copias"
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr "Añadido en:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr "Usuario registrado en"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1153,3 +1138,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr "Logo de cannery"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr "Usuario registrado en"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr "Usos Restantes:"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr "Usos Restantes:"
 | 
			
		||||
 
 | 
			
		||||
@@ -207,7 +207,7 @@ msgstr "Tiros registrados exitosamente"
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
@@ -194,7 +194,7 @@ msgstr "Incendiaire"
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr "Information de l’instance"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr "Invitation désactivée"
 | 
			
		||||
@@ -443,11 +443,6 @@ msgstr "Type :"
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr "Utilisateurs"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr "Utilisations restantes :"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -634,16 +629,11 @@ msgstr "Désélectionner"
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr "Type d’allumage"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr "Reconnexion en cours…"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr "Chargement en cours…"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -741,11 +731,6 @@ msgstr "Exemplaires"
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr "Ajouté le :"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr "Utilisateur·ice enregistré·e le"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1154,3 +1139,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr "Logo de Cannery"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr "Utilisateur·ice enregistré·e le"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr "Utilisations restantes :"
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr "Utilisations restantes :"
 | 
			
		||||
 
 | 
			
		||||
@@ -209,7 +209,7 @@ msgstr "Tirs enregistré avec succès"
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ msgstr ""
 | 
			
		||||
msgid "Instance Information"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:35
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:41
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Invite Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
@@ -435,11 +435,6 @@ msgstr ""
 | 
			
		||||
msgid "Users"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:30
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses Left:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/invite_live/form_component.html.heex:24
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Uses left"
 | 
			
		||||
@@ -626,16 +621,11 @@ msgstr ""
 | 
			
		||||
msgid "Firing type"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:50
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:40
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Reconnecting..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/live.html.heex:37
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Loading..."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/live/container_live/index.ex:32
 | 
			
		||||
#: lib/cannery_web/live/container_live/show.ex:113
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -733,11 +723,6 @@ msgstr ""
 | 
			
		||||
msgid "Added on:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:34
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User registered on"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/user_registration/new.html.heex:37
 | 
			
		||||
#: lib/cannery_web/templates/user_settings/edit.html.heex:130
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
@@ -1145,3 +1130,34 @@ msgstr ""
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Spanish"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:13
 | 
			
		||||
#: lib/cannery_web/templates/layout/root.html.heex:14
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Cannery"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:33
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Email unconfirmed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:38
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "User registered on%{registered_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/user_card.ex:27
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "User was confirmed at%{confirmed_datetime}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:31
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: %{uses_left}"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: lib/cannery_web/components/invite_card.ex:36
 | 
			
		||||
#, elixir-autogen, elixir-format, fuzzy
 | 
			
		||||
msgid "Uses Left: Unlimited"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,7 @@ msgstr ""
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
@@ -187,7 +187,7 @@ msgstr ""
 | 
			
		||||
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/ammo_group_live/show.ex:142
 | 
			
		||||
#: lib/cannery_web/live/range_live/index.html.heex:118
 | 
			
		||||
#, elixir-autogen, elixir-format
 | 
			
		||||
msgid "Are you sure you want to delete this shot record?"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user