From 3197d26342cad97109b104526b2ae2a812200444 Mon Sep 17 00:00:00 2001 From: meagharty <149533950+meagharty@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:59:16 -0400 Subject: [PATCH 1/4] feat: add Phoenix.LiveView.HTMLFormatter for heex files (#1021) * feat: add Phoenix.LiveView.HTMLFormatter for heex files * chore: run mix format for HTMLFormatter changes --- .formatter.exs | 3 +- lib/arrow_web/components/core_components.ex | 26 +++---- .../disruption_html/_form.html.heex | 8 +-- .../disruption_html/edit.html.heex | 3 +- .../disruption_html/index.html.heex | 50 +++++++------- .../disruption_html/show.html.heex | 27 +++++--- .../feed_html/disruption_summary.html.heex | 6 +- .../controllers/feed_html/index.html.heex | 9 ++- .../controllers/layout_html/_flash.html.heex | 4 +- .../controllers/layout_html/_footer.html.heex | 9 ++- .../controllers/layout_html/_header.html.heex | 14 ++-- .../controllers/layout_html/app.html.heex | 2 +- .../controllers/layout_html/live.html.heex | 2 +- .../controllers/layout_html/root.html.heex | 17 +++-- .../controllers/shape_html/new_bulk.html.heex | 2 +- .../controllers/shape_html/select.html.heex | 69 +++++++++++-------- .../shape_html/shape_form.html.heex | 2 +- .../controllers/stop_html/index.html.heex | 52 ++++++++++---- .../unauthorized_html/index.html.heex | 15 ++-- lib/arrow_web/live/stop_live/stop_live.ex | 36 +++++++--- .../live/stop_live/stop_view_live.html.heex | 9 ++- 21 files changed, 224 insertions(+), 141 deletions(-) diff --git a/.formatter.exs b/.formatter.exs index 1e3d79fd..6a9bacda 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,5 +1,6 @@ [ import_deps: [:ecto, :phoenix], - inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}"], + plugins: [Phoenix.LiveView.HTMLFormatter], + inputs: ["*.{heex,ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{heex,ex,exs}"], subdirectories: ["priv/*/migrations"] ] diff --git a/lib/arrow_web/components/core_components.ex b/lib/arrow_web/components/core_components.ex index 125adb18..6e59ca29 100644 --- a/lib/arrow_web/components/core_components.ex +++ b/lib/arrow_web/components/core_components.ex @@ -203,7 +203,7 @@ defmodule ArrowWeb.CoreComponents do ~H""" <.form :let={f} for={@for} as={@as} phx-change="validate" {@rest}> <%= render_slot(@inner_block, f) %> -
+
<%= render_slot(action, f) %>
@@ -490,19 +490,19 @@ defmodule ArrowWeb.CoreComponents do - <%= for %{revisions: [revision]} = disruption <- @disruptions do %> - + diff --git a/lib/arrow_web/controllers/shape_controller.ex b/lib/arrow_web/controllers/shape_controller.ex index ecfac3cc..5db22f03 100644 --- a/lib/arrow_web/controllers/shape_controller.ex +++ b/lib/arrow_web/controllers/shape_controller.ex @@ -51,11 +51,6 @@ defmodule ArrowWeb.ShapeController do conn |> put_flash(:errors, reason) |> render(:new_bulk, errors: reason, shapes_upload: reset_upload) - - error -> - conn - |> put_flash(:errors, error) - |> render(:new_bulk, errors: error, shapes_upload: reset_upload) end end diff --git a/lib/arrow_web/gettext.ex b/lib/arrow_web/gettext.ex index f4a412ed..321caadf 100644 --- a/lib/arrow_web/gettext.ex +++ b/lib/arrow_web/gettext.ex @@ -5,7 +5,7 @@ defmodule ArrowWeb.Gettext do By using [Gettext](https://hexdocs.pm/gettext), your module gains a set of macros for translations, for example: - import ArrowWeb.Gettext + use Gettext, backend: ArrowWeb.Gettext # Simple translation gettext("Here is the string to translate") @@ -20,5 +20,5 @@ defmodule ArrowWeb.Gettext do See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. """ - use Gettext, otp_app: :arrow + use Gettext.Backend, otp_app: :arrow end diff --git a/lib/arrow_web/try_api_token_auth/cognito.ex b/lib/arrow_web/try_api_token_auth/cognito.ex index 9e3c66f5..81acbc5f 100644 --- a/lib/arrow_web/try_api_token_auth/cognito.ex +++ b/lib/arrow_web/try_api_token_auth/cognito.ex @@ -42,7 +42,7 @@ defmodule ArrowWeb.TryApiTokenAuth.Cognito do [] response -> - :ok = Logger.warn("unexpected_aws_api_response: #{inspect(response)}") + :ok = Logger.warning("unexpected_aws_api_response: #{inspect(response)}") [] end diff --git a/lib/arrow_web/try_api_token_auth/keycloak.ex b/lib/arrow_web/try_api_token_auth/keycloak.ex index 8f3d8de1..18bf8fae 100644 --- a/lib/arrow_web/try_api_token_auth/keycloak.ex +++ b/lib/arrow_web/try_api_token_auth/keycloak.ex @@ -17,7 +17,7 @@ defmodule ArrowWeb.TryApiTokenAuth.Keycloak do ) else other -> - Logger.warn( + Logger.warning( "unexpected response when logging #{auth_token.username} in via Keycloak API: #{inspect(other)}" ) diff --git a/mix.exs b/mix.exs index f913fc01..3b99c177 100644 --- a/mix.exs +++ b/mix.exs @@ -14,11 +14,10 @@ defmodule Arrow.MixProject do releases: releases(), dialyzer: [ plt_add_apps: [:mix], - plt_add_deps: :transitive, + plt_add_deps: :app_tree, flags: [ :unmatched_returns - ], - ignore_warnings: ".dialyzer.ignore-warnings" + ] ], preferred_cli_env: ["test.integration": :test], test_coverage: [tool: LcovEx, ignore_paths: ["deps/"]] @@ -60,11 +59,11 @@ defmodule Arrow.MixProject do {:gettext, "~> 0.11"}, {:guardian, "~> 2.0"}, {:hackney, "~> 1.9"}, - {:httpoison, "~> 1.6"}, + {:httpoison, "~> 2.2"}, {:ja_serializer, github: "mbta/ja_serializer", branch: "master"}, {:jason, "~> 1.0"}, {:lcov_ex, "~> 0.2", only: [:dev, :test], runtime: false}, - {:mox, "~> 1.0.0", only: :test}, + {:mox, "~> 1.2", only: :test}, {:oban, "~> 2.18"}, {:phoenix_ecto, "~> 4.0"}, {:phoenix_live_reload, "~> 1.5", only: :dev}, @@ -76,8 +75,8 @@ defmodule Arrow.MixProject do {:phoenix, "~> 1.7.12"}, {:plug_cowboy, "~> 2.1"}, {:telemetry, "~> 1.2", override: true}, - {:telemetry_poller, "~> 0.4"}, - {:telemetry_metrics, "~> 0.4"}, + {:telemetry_poller, "~> 1.1"}, + {:telemetry_metrics, "~> 1.0"}, {:postgrex, ">= 0.0.0"}, # If react_phoenix changes, check assets/src/ReactPhoenix.js, too {:react_phoenix, "1.3.1"}, @@ -85,8 +84,8 @@ defmodule Arrow.MixProject do {:ueberauth_cognito, "0.4.0"}, {:ueberauth_oidcc, "~> 0.4.0"}, {:ueberauth, "~> 0.10"}, - {:wallaby, "~> 0.30.6", runtime: false, only: :test}, - {:sentry, "~> 8.0"}, + {:wallaby, "~> 0.30", runtime: false, only: :test}, + {:sentry, "~> 10.7"}, {:tailwind, "~> 0.2", runtime: Mix.env() == :dev}, {:heroicons, github: "tailwindlabs/heroicons", diff --git a/mix.lock b/mix.lock index 940bc325..ff81aec0 100644 --- a/mix.lock +++ b/mix.lock @@ -1,82 +1,84 @@ %{ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, + "castore": {:hex, :castore, "1.0.9", "5cc77474afadf02c7c017823f460a17daa7908e991b0cc917febc90e466a375c", [:mix], [], "hexpm", "5ea956504f1ba6f2b4eb707061d8e17870de2bee95fb59d512872c2ef06925e7"}, "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, "cowboy": {:hex, :cowboy, "2.12.0", "f276d521a1ff88b2b9b4c54d0e753da6c66dd7be6c9fca3d9418b561828a3731", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "8a7abe6d183372ceb21caa2709bec928ab2b72e18a3911aa1771639bef82651e"}, "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.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, - "credo": {:hex, :credo, "1.7.6", "b8f14011a5443f2839b04def0b252300842ce7388f3af177157c86da18dfbeea", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "146f347fb9f8cbc5f7e39e3f22f70acbef51d441baa6d10169dd604bfbc55296"}, + "credo": {:hex, :credo, "1.7.8", "9722ba1681e973025908d542ec3d95db5f9c549251ba5b028e251ad8c24ab8c5", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cb9e87cc64f152f3ed1c6e325e7b894dea8f5ef2e41123bd864e3cd5ceb44968"}, "csv": {:hex, :csv, "3.2.1", "6d401f1ed33acb2627682a9ab6021e96d33ca6c1c6bccc243d8f7e2197d032f5", [:mix], [], "hexpm", "8f55a0524923ae49e97ff2642122a2ce7c61e159e7fe1184670b2ce847aee6c8"}, - "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, - "ecto": {:hex, :ecto, "3.11.0", "ff8614b4e70a774f9d39af809c426def80852048440e8785d93a6e91f48fec00", [:mix], [{:decimal, "~> 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", "7769dad267ef967310d6e988e92d772659b11b09a0c015f101ce0fff81ce1f81"}, - "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.1", "cdfee5cb21d51af37d14233e4aa3ef38189bf42c499d6a8160a943c990cc74e2", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0 and < 0.20.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "c0a1df8181c87a0419afa881452329a9dfd2c1fb2a737bf147f862dfa44a1af0"}, - "ecto_sql": {:hex, :ecto_sql, "3.11.0", "c787b24b224942b69c9ff7ab9107f258ecdc68326be04815c6cce2941b6fad1c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.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", "77aa3677169f55c2714dda7352d563002d180eb33c0dc29cd36d39c0a1a971f5"}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, - "ex_aws": {:hex, :ex_aws, "2.3.2", "37d6c9d81b641508e1722e69ace6ae7f9f6b3c7984e769e623591f4b2ead766a", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d18fdd9d6827e52e1097b07655fd08977516a2e64e9355c2bcaa30ad092e0ae5"}, + "dialyxir": {:hex, :dialyxir, "1.4.4", "fb3ce8741edeaea59c9ae84d5cec75da00fa89fe401c72d6e047d11a61f65f70", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "cd6111e8017ccd563e65621a4d9a4a1c5cd333df30cebc7face8029cacb4eff6"}, + "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 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", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.2", "79350a53246ac5ec27326d208496aebceb77fa82a91744f66a9154560f0759d3", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0 and < 0.20.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "6149c1c4a5ba6602a76cb09ee7a269eb60dab9694a1dbbb797f032555212de75"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 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", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, + "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, + "esbuild": {:hex, :esbuild, "0.8.2", "5f379dfa383ef482b738e7771daf238b2d1cfb0222bef9d3b20d4c8f06c7a7ac", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "558a8a08ed78eb820efbfda1de196569d8bfa9b51e8371a1934fbb31345feda7"}, + "ex_aws": {:hex, :ex_aws, "2.5.6", "6f642e0f82eff10a9b470044f084b81a791cf15b393d647ea5f3e65da2794e3d", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c69eec59e31fdd89d0beeb1d97e16518dd1b23ad95b3d5c9f1dcfec23d97f960"}, "ex_aws_rds": {:hex, :ex_aws_rds, "2.0.2", "38dd8e83d57cf4b7286c4f6f5c978f700c40c207ffcdd6ca5d738e5eba933f9a", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "9e5b5cc168077874cbd0d29ba65d01caf1877e705fb5cecacf0667dd19bfa75c"}, - "ex_aws_s3": {:hex, :ex_aws_s3, "2.5.3", "422468e5c3e1a4da5298e66c3468b465cfd354b842e512cb1f6fbbe4e2f5bdaf", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "4f09dd372cc386550e484808c5ac5027766c8d0cd8271ccc578b82ee6ef4f3b8"}, + "ex_aws_s3": {:hex, :ex_aws_s3, "2.5.4", "87aaf4a2f24a48f516d7f5aaced9d128dd5d0f655c4431f9037a11a85c71109c", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "c06e7f68b33f7c0acba1361dbd951c79661a28f85aa2e0582990fccca4425355"}, "ex_aws_secretsmanager": {:hex, :ex_aws_secretsmanager, "2.0.0", "deff8c12335f0160882afeb9687e55a97fddcd7d9a82fc3a6fbb270797374773", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "8b2838af536c32263ff797012b29e87bad73ef34f43cfa60ebca8e84576f6d45"}, - "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, - "expo": {:hex, :expo, "0.1.0", "d4e932bdad052c374118e312e35280f1919ac13881cb3ac07a209a54d0c81dd8", [:mix], [], "hexpm", "c22c536021c56de058aaeedeabb4744eb5d48137bacf8c29f04d25b6c6bbbf45"}, - "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, - "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, - "gettext": {:hex, :gettext, "0.21.0", "15bbceb20b317b706a8041061a08e858b5a189654128618b53746bf36c84352b", [:mix], [{:expo, "~> 0.1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "04a66db4103b6d1d18f92240bb2c73167b517229316b7bef84e4eebbfb2f14f6"}, - "guardian": {:hex, :guardian, "2.3.1", "2b2d78dc399a7df182d739ddc0e566d88723299bfac20be36255e2d052fd215d", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bbe241f9ca1b09fad916ad42d6049d2600bbc688aba5b3c4a6c82592a54274c3"}, + "ex_machina": {:hex, :ex_machina, "2.8.0", "a0e847b5712065055ec3255840e2c78ef9366634d62390839d4880483be38abe", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "79fe1a9c64c0c1c1fab6c4fa5d871682cb90de5885320c187d117004627a7729"}, + "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, + "file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"}, + "floki": {:hex, :floki, "0.36.3", "1102f93b16a55bc5383b85ae3ec470f82dee056eaeff9195e8afdf0ef2a43c30", [:mix], [], "hexpm", "fe0158bff509e407735f6d40b3ee0d7deb47f3f3ee7c6c182ad28599f9f6b27a"}, + "gettext": {:hex, :gettext, "0.26.1", "38e14ea5dcf962d1fc9f361b63ea07c0ce715a8ef1f9e82d3dfb8e67e0416715", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "01ce56f188b9dc28780a52783d6529ad2bc7124f9744e571e1ee4ea88bf08734"}, + "guardian": {:hex, :guardian, "2.3.2", "78003504b987f2b189d76ccf9496ceaa6a454bb2763627702233f31eb7212881", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "b189ff38cd46a22a8a824866a6867ca8722942347f13c33f7d23126af8821b52"}, "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, - "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]}, - "httpoison": {:hex, :httpoison, "1.8.2", "9eb9c63ae289296a544842ef816a85d881d4a31f518a0fec089aaa744beae290", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "2bb350d26972e30c96e2ca74a1aaf8293d61d0742ff17f01e0279fef11599921"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]}, + "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inflex": {:hex, :inflex, "1.10.0", "8366a7696e70e1813aca102e61274addf85d99f4a072b2f9c7984054ea1b9d29", [:mix], [], "hexpm", "7b5ccb9b720c26516f5962dc4565fc26f083ca107b0f6c167048506a125d2df3"}, "ja_serializer": {:git, "https://github.com/mbta/ja_serializer.git", "efb1d4489809e31e4b54b4af9e85f0b3ceeb650b", [branch: "master"]}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"}, - "lcov_ex": {:hex, :lcov_ex, "0.2.2", "2dd1ef86ed510ac9c3fe3f11b82cbfd09c92b91b7d6565298932c560f72bd584", [:mix], [], "hexpm", "5e412eddb6a384d2e66cff94eec048ba5c9ed30d6cd9fb5a331456b210de0801"}, + "lcov_ex": {:hex, :lcov_ex, "0.3.3", "1745a88e46606c4f86408299f54878b7d0cd22ea3e9c54b0018b6ed631a9ce87", [:mix], [], "hexpm", "ea373ec4d2df213357c5a464be16ab08d1e58e61ea2de784a483780c22a1e74a"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "mox": {:hex, :mox, "1.0.1", "b651bf0113265cda0ba3a827fcb691f848b683c373b77e7d7439910a8d754d6e", [:mix], [], "hexpm", "35bc0dea5499d18db4ef7fe4360067a59b06c74376eb6ab3bd67e6295b133469"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, + "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_ownership": {:hex, :nimble_ownership, "1.0.0", "3f87744d42c21b2042a0aa1d48c83c77e6dd9dd357e425a038dd4b49ba8b79a1", [:mix], [], "hexpm", "7c16cc74f4e952464220a73055b557a273e8b1b7ace8489ec9d86e9ad56cb2cc"}, "oban": {:hex, :oban, "2.18.3", "1608c04f8856c108555c379f2f56bc0759149d35fa9d3b825cb8a6769f8ae926", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "36ca6ca84ef6518f9c2c759ea88efd438a3c81d667ba23b02b062a0aa785475e"}, - "oidcc": {:hex, :oidcc, "3.2.0", "f80a4826a946ce07dc8cbd8212392b4ff436ae3c4b4cd6680fa0d84d0ff2fec1", [:mix, :rebar3], [{:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.2", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.3.1", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "38fd9092ab5d5d10c71b8011b019316411afe466bef07ba57f57ec3f919278c3"}, + "oidcc": {:hex, :oidcc, "3.2.4", "0bbe0f6059682dcb3bb70f682ede606779ea7b73337803a05c7d8eb3ae76acc0", [:mix, :rebar3], [{:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.2", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.3.1", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "984956348f6f833577b7a6cb72b325936cab3fd1c9cf28d7d54773d3ea48a20a"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, - "phoenix": {:hex, :phoenix, "1.7.12", "1cc589e0eab99f593a8aa38ec45f15d25297dd6187ee801c8de8947090b5a9d3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"}, "phoenix_html": {:hex, :phoenix_html, "3.3.4", "42a09fc443bbc1da37e372a5c8e6755d046f22b9b11343bf885067357da21cb3", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0249d3abec3714aff3415e7ee3d9786cb325be3151e6c4b3021502c585bf53fb"}, - "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [: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]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, - "phoenix_live_react": {:hex, :phoenix_live_react, "0.4.2", "8a37f3cccd26c3d992ffd677a7b8ecbd7746980caf560ac5d9c5efb7eb260910", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.11 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "eb0fb004afc0904510915b6b3e9458fc3144694dcd5a736d9d2feb00197becdc"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4", "4508e481f791ce62ec6a096e13b061387158cbeefacca68c6c1928e1305e23ed", [: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]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "2984aae96994fbc5c61795a73b8fb58153b41ff934019cfb522343d2d3817d59"}, + "phoenix_live_react": {:hex, :phoenix_live_react, "0.5.0", "8ef46146fcf9957b377e3f3187e85574e6f407b19d822a131501c32e6c16f4b1", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.11 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "cb64d778ca26e5cfc89153a0799a43b790cbbb5d6fe025e4e11d97ca5ef8e72d"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.14", "70fa101aa0539e81bed4238777498f6215e9dda3461bdaa067cad6908110c364", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, - "plug": {:hex, :plug, "1.16.0", "1d07d50cb9bb05097fdf187b31cf087c7297aafc3fed8299aac79c128a707e47", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cbf53aa1f5c4d758a7559c0bd6d59e286c2be0c6a1fac8cc3eee2f638243b93e"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.7.1", "87677ffe3b765bc96a89be7960f81703223fe2e21efa42c125fcd0127dd9d6b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "02dbd5f9ab571b864ae39418db7811618506256f6d13b4a45037e5fe78dc5de3"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, "poison": {:hex, :poison, "5.0.0", "d2b54589ab4157bbb82ec2050757779bfed724463a544b6e20d79855a9e43b24", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "11dc6117c501b80c62a7594f941d043982a1bd05a1184280c0d9166eb4d8d3fc"}, - "postgrex": {:hex, :postgrex, "0.17.3", "c92cda8de2033a7585dae8c61b1d420a1a1322421df84da9a82a6764580c503d", [:mix], [{: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", "946cf46935a4fdca7a81448be76ba3503cff082df42c6ec1ff16a4bdfbfb098d"}, + "postgrex": {:hex, :postgrex, "0.19.2", "34d6884a332c7bf1e367fc8b9a849d23b43f7da5c6e263def92784d03f9da468", [:mix], [{: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", "618988886ab7ae8561ebed9a3c7469034bf6a88b8995785a3378746a4b9835ec"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "react_phoenix": {:hex, :react_phoenix, "1.3.1", "b2abb625ce7304a3b2ac5eea3126c30ef1e1c860f9ef27290ee726ab1fa3a87a", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.11 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "a10de67f02f6c5cf04f6987cef7413400d671936b4df97e0b9ac3c227ba27e6b"}, - "sax_map": {:hex, :sax_map, "1.2.1", "e0278054268c70f429084700680bf01c77a99508ea73713c9ed6b7b216e0a5da", [:mix], [{:saxy, "~> 1.3", [hex: :saxy, repo: "hexpm", optional: false]}], "hexpm", "98348ea9777c0577e074cba2e2d769cdd842dce8f79c89d1d59616e428d9cacc"}, - "saxy": {:hex, :saxy, "1.5.0", "0141127f2d042856f135fb2d94e0beecda7a2306f47546dbc6411fc5b07e28bf", [:mix], [], "hexpm", "ea7bb6328fbd1f2aceffa3ec6090bfb18c85aadf0f8e5030905e84235861cf89"}, - "sentry": {:hex, :sentry, "8.0.6", "c8de1bf0523bc120ec37d596c55260901029ecb0994e7075b0973328779ceef7", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "051a2d0472162f3137787c7c9d6e6e4ef239de9329c8c45b1f1bf1e9379e1883"}, + "sax_map": {:hex, :sax_map, "1.3.0", "d79ce48edf2c25720e79a2f62e3ee091ebd8b918d0e3a16f58010c7014a07d89", [:mix], [{:saxy, "~> 1.3", [hex: :saxy, repo: "hexpm", optional: false]}], "hexpm", "5f9086c757aae9f951a7ef0139a9ae56586a126c0da150b71d5ec6cd25309d85"}, + "saxy": {:hex, :saxy, "1.6.0", "02cb4e9bd045f25ac0c70fae8164754878327ee393c338a090288210b02317ee", [:mix], [], "hexpm", "ef42eb4ac983ca77d650fbdb68368b26570f6cc5895f0faa04d34a6f384abad3"}, + "sentry": {:hex, :sentry, "10.7.1", "33392222d80ccff99c503f972998d2858b4c1e5aca2219a34269b68dacba8e7d", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_ownership, "~> 0.3.0 or ~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "56291312397bf2b6afab6cf4f7aa1f27413b0eb2ceeb63b8aab2d7658aaea882"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "sweet_xml": {:hex, :sweet_xml, "0.7.4", "a8b7e1ce7ecd775c7e8a65d501bc2cd933bff3a9c41ab763f5105688ef485d08", [:mix], [], "hexpm", "e7c4b0bdbf460c928234951def54fe87edf1a170f6896675443279e2dbeba167"}, "table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"}, - "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, + "tailwind": {:hex, :tailwind, "0.2.4", "5706ec47182d4e7045901302bf3a333e80f3d1af65c442ba9a9eed152fb26c2e", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "c6e4a82b8727bab593700c998a4d98cf3d8025678bfde059aed71d0000c3e463"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, - "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, - "telemetry_poller": {:hex, :telemetry_poller, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, - "telemetry_registry": {:hex, :telemetry_registry, "0.3.1", "14a3319a7d9027bdbff7ebcacf1a438f5f5c903057b93aee484cca26f05bdcba", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6d0ca77b691cf854ed074b459a93b87f4c7f5512f8f7743c635ca83da81f939e"}, - "tesla": {:hex, :tesla, "1.8.0", "d511a4f5c5e42538d97eef7c40ec4f3e44effdc5068206f42ed859e09e51d1fd", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "10501f360cd926a309501287470372af1a6e1cbed0f43949203a4c13300bc79f"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, + "telemetry_registry": {:hex, :telemetry_registry, "0.3.2", "701576890320be6428189bff963e865e8f23e0ff3615eade8f78662be0fc003c", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7ed191eb1d115a3034af8e1e35e4e63d5348851d556646d46ca3d1b4e16bab9"}, + "tesla": {:hex, :tesla, "1.13.0", "24a068a48d107080dd7c943a593997eee265977a38020eb2ab657cca78a12502", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:mox, "~> 1.0", [hex: :mox, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "7b8fc8f6b0640fa0d090af7889d12eb396460e044b6f8688a8e55e30406a2200"}, "tzdata": {:hex, :tzdata, "1.1.2", "45e5f1fcf8729525ec27c65e163be5b3d247ab1702581a94674e008413eef50b", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "cec7b286e608371602318c414f344941d5eb0375e14cfdab605cca2fe66cba8b"}, "ueberauth": {:hex, :ueberauth, "0.10.8", "ba78fbcbb27d811a6cd06ad851793aaf7d27c3b30c9e95349c2c362b344cd8f0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "f2d3172e52821375bccb8460e5fa5cb91cfd60b19b636b6e57e9759b6f8c10c1"}, "ueberauth_cognito": {:hex, :ueberauth_cognito, "0.4.0", "62daa3f675298c2b03002d2e1b7e5a30cbc513400e5732a264864a26847e71ac", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.0", [hex: :jose, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "62378f4f34c8569cd95cc4e7463c56e9981c8afc83fdc516922065f0e1302a35"}, "ueberauth_oidcc": {:hex, :ueberauth_oidcc, "0.4.0", "3fbfbc38735b4dba54ed8bf3e9b80f5054f73cc1ec9af6ae88b7886d25934768", [:mix], [{:oidcc, "~> 3.2.0", [hex: :oidcc, repo: "hexpm", optional: false]}, {:plug, "~> 1.11", [hex: :plug, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.10", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "cdd8517d773cfe499c0b692f795f213b2eb33119afbec34aefd8be0a85c62b21"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "unzip": {:hex, :unzip, "0.12.0", "beed92238724732418b41eba77dcb7f51e235b707406c05b1732a3052d1c0f36", [:mix], [], "hexpm", "95655b72db368e5a84951f0bed586ac053b55ee3815fd96062fce10ce4fc998d"}, - "wallaby": {:hex, :wallaby, "0.30.6", "7dc4c1213f3b52c4152581d126632bc7e06892336d3a0f582853efeeabd45a71", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:httpoison, "~> 0.12 or ~> 1.0 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_ecto, ">= 3.0.0", [hex: :phoenix_ecto, repo: "hexpm", optional: true]}, {:web_driver_client, "~> 0.2.0", [hex: :web_driver_client, repo: "hexpm", optional: false]}], "hexpm", "50950c1d968549b54c20e16175c68c7fc0824138e2bb93feb11ef6add8eb23d4"}, + "wallaby": {:hex, :wallaby, "0.30.9", "51d60682092c3c428c63b656b818e2258202b9f9a31ec37230659647ae20325b", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:httpoison, "~> 0.12 or ~> 1.0 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_ecto, ">= 3.0.0", [hex: :phoenix_ecto, repo: "hexpm", optional: true]}, {:web_driver_client, "~> 0.2.0", [hex: :web_driver_client, repo: "hexpm", optional: false]}], "hexpm", "62e3ccb89068b231b50ed046219022020516d44f443eebef93a19db4be95b808"}, "web_driver_client": {:hex, :web_driver_client, "0.2.0", "63b76cd9eb3b0716ec5467a0f8bead73d3d9612e63f7560d21357f03ad86e31a", [:mix], [{:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "83cc6092bc3e74926d1c8455f0ce927d5d1d36707b74d9a65e38c084aab0350f"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"}, } diff --git a/test/arrow_web/controllers/shape_controller_test.exs b/test/arrow_web/controllers/shape_controller_test.exs index 69809a55..18cac68e 100644 --- a/test/arrow_web/controllers/shape_controller_test.exs +++ b/test/arrow_web/controllers/shape_controller_test.exs @@ -27,13 +27,6 @@ defmodule ArrowWeb.ShapeControllerTest do filename: "invalid_file.kml" } } - @invalid_whitespace_attrs %{ - name: nil, - filename: %Plug.Upload{ - path: "test/support/fixtures/kml/invalid_whitespace_shape.kml", - filename: "invalid_whitespace_shape.kml" - } - } @file_read_fail_attrs %{ name: nil, filename: %Plug.Upload{ @@ -141,18 +134,6 @@ defmodule ArrowWeb.ShapeControllerTest do assert html_response(conn, 200) =~ "Components.ShapeViewMap" end - @tag :authenticated_admin - test "renders errors when data is invalid due to invalid whitespace in XML", %{conn: conn} do - conn = post(conn, ~p"/shapes_upload", shapes_upload: @invalid_whitespace_attrs) - - assert html_response(conn, 200) =~ - "Failed to parse shape from kml, no coordinates were found." - - assert html_response(conn, 200) =~ "Check your whitespace." - assert html_response(conn, 200) =~ "new shapes" - assert html_response(conn, 200) =~ "Components.ShapeViewMap" - end - @tag :authenticated_admin test "renders errors when file read fails", %{conn: conn} do conn = post(conn, ~p"/shapes_upload", shapes_upload: @file_read_fail_attrs) diff --git a/test/arrow_web/controllers/stop_controller_test.exs b/test/arrow_web/controllers/stop_controller_test.exs index da8ab49c..0c0d66b7 100644 --- a/test/arrow_web/controllers/stop_controller_test.exs +++ b/test/arrow_web/controllers/stop_controller_test.exs @@ -40,7 +40,7 @@ defmodule ArrowWeb.StopControllerTest do conn = post(conn, ~p"/stops", stop: invalid_attrs) assert redirected_to(conn) == ~p"/stops/new" - assert get_flash(conn, :errors) == + assert Phoenix.Flash.get(conn.assigns.flash, :errors) == {"Error creating stop, please try again", ["Stop id can\'t be blank"]} end end diff --git a/test/arrow_web/try_api_token_auth_test.exs b/test/arrow_web/try_api_token_auth_test.exs index dcfcbb61..3c5f2f2e 100644 --- a/test/arrow_web/try_api_token_auth_test.exs +++ b/test/arrow_web/try_api_token_auth_test.exs @@ -75,7 +75,7 @@ defmodule ArrowWeb.TryApiTokenAuthTest do token = Arrow.AuthToken.get_or_create_token_for_user("foo@mbta.com") log = - capture_log([level: :warn], fn -> + capture_log([level: :warning], fn -> conn = conn |> put_req_header("x-api-key", token) diff --git a/test/support/fixtures/kml/invalid_whitespace_shape.kml b/test/support/fixtures/kml/invalid_whitespace_shape.kml deleted file mode 100644 index f93e61fd..00000000 --- a/test/support/fixtures/kml/invalid_whitespace_shape.kml +++ /dev/null @@ -1,402 +0,0 @@ - - - - May 23 test - - RL: Alewife - Harvard - Via Holyoke Gate - Harvard - SPACES - - - -71.14163,42.39551 - -71.14163,42.39551 - -71.14163,42.39551 - -71.14209,42.39643 - -71.14285,42.39624 - -71.14292,42.39623 - -71.14301,42.3962 - -71.14305,42.3963 - -71.14307,42.39637 - -71.14307,42.39642 - -71.14302,42.39647 - -71.14295,42.3965 - -71.14192,42.39672 - -71.14192,42.39672 - -71.14137,42.39684 - -71.1412,42.39688 - -71.14092,42.39694 - -71.14074,42.39698 - -71.14046,42.39704 - -71.1404,42.39706 - -71.14034,42.39708 - -71.1403,42.39713 - -71.14027,42.39717 - -71.14026,42.39723 - -71.14027,42.39729 - -71.14035,42.39752 - -71.14038,42.39759 - -71.14042,42.39765 - -71.14047,42.3977 - -71.14053,42.39774 - -71.1406,42.39777 - -71.14068,42.3978 - -71.14075,42.39781 - -71.14082,42.39782 - -71.1409,42.39782 - -71.14096,42.39783 - -71.14102,42.39784 - -71.14107,42.39786 - -71.14112,42.39788 - -71.14116,42.39791 - -71.14118,42.39794 - -71.14121,42.39797 - -71.14123,42.39802 - -71.14124,42.39807 - -71.14122,42.39817 - -71.14121,42.39827 - -71.14117,42.39839 - -71.14113,42.39852 - -71.14107,42.39865 - -71.14096,42.39891 - -71.14087,42.39902 - -71.14077,42.39911 - -71.14065,42.39922 - -71.14052,42.39931 - -71.14032,42.39942 - -71.14006,42.39954 - -71.13991,42.3996 - -71.13974,42.39966 - -71.13957,42.3997 - -71.13939,42.39974 - -71.13915,42.39977 - -71.13891,42.39979 - -71.13839,42.39984 - -71.1382,42.39985 - -71.138,42.39987 - -71.13781,42.3999 - -71.13762,42.39993 - -71.13746,42.39997 - -71.13729,42.40002 - -71.13714,42.40008 - -71.13699,42.40014 - -71.13674,42.40029 - -71.1366,42.40039 - -71.13648,42.40049 - -71.13638,42.40059 - -71.13625,42.40071 - -71.13613,42.40082 - -71.1361,42.40085 - -71.13604,42.40091 - -71.13596,42.40099 - -71.1359,42.40105 - -71.13588,42.40107 - -71.13579,42.40117 - -71.13567,42.40132 - -71.13567,42.40133 - -71.13538,42.40166 - -71.13523,42.40183 - -71.13506,42.40198 - -71.13478,42.40225 - -71.13456,42.40246 - -71.13444,42.40262 - -71.13442,42.40267 - -71.13435,42.40281 - -71.13431,42.40295 - -71.13429,42.40309 - -71.13429,42.40353 - -71.13429,42.40354 - -71.13429,42.40354 - -71.13429,42.40376 - -71.1343,42.40401 - -71.13431,42.4043 - -71.1343,42.40438 - -71.13432,42.40468 - -71.13433,42.40505 - -71.13434,42.40528 - -71.13434,42.40541 - -71.13432,42.40553 - -71.13431,42.40563 - -71.13428,42.40574 - -71.13424,42.40589 - -71.13419,42.40602 - -71.13414,42.40612 - -71.13409,42.40621 - -71.13396,42.40641 - -71.13388,42.40652 - -71.1338,42.40663 - -71.13369,42.40676 - -71.13362,42.40684 - -71.13355,42.40692 - -71.13347,42.40688 - -71.13297,42.40662 - -71.13285,42.40656 - -71.13281,42.40654 - -71.13261,42.40645 - -71.13217,42.40623 - -71.13209,42.40619 - -71.13199,42.40614 - -71.13164,42.40596 - -71.1314,42.40585 - -71.13133,42.40582 - -71.13128,42.40579 - -71.13094,42.40562 - -71.13071,42.40552 - -71.13033,42.40523 - -71.13026,42.40518 - -71.13018,42.40512 - -71.13016,42.4051 - -71.1297,42.40476 - -71.12968,42.40474 - -71.12968,42.40474 - -71.12961,42.40469 - -71.12918,42.40437 - -71.1291,42.40432 - -71.12866,42.404 - -71.12862,42.40397 - -71.12859,42.40395 - -71.12854,42.40391 - -71.12849,42.40388 - -71.12812,42.40369 - -71.12762,42.40345 - -71.12738,42.40336 - -71.12725,42.40329 - -71.1271,42.40313 - -71.12706,42.40305 - -71.12704,42.40301 - -71.12701,42.40292 - -71.12701,42.40291 - -71.127,42.40288 - -71.12678,42.40243 - -71.12652,42.4018 - -71.12651,42.40178 - -71.12647,42.40169 - -71.12636,42.40144 - -71.12629,42.40129 - -71.12624,42.40118 - -71.12622,42.40112 - -71.12619,42.40105 - -71.12613,42.40098 - -71.12609,42.40093 - -71.12569,42.40043 - -71.12567,42.40041 - -71.12557,42.40028 - -71.12542,42.40009 - -71.12542,42.40009 - -71.12524,42.39986 - -71.12492,42.39947 - -71.12468,42.39916 - -71.12458,42.39904 - -71.12417,42.39852 - -71.12389,42.39819 - -71.12364,42.39789 - -71.12346,42.39767 - -71.12343,42.39763 - -71.12339,42.39759 - -71.1229,42.39697 - -71.12284,42.39689 - -71.12284,42.39689 - -71.12279,42.39679 - -71.12262,42.39658 - -71.12256,42.3965 - -71.1224,42.39624 - -71.12238,42.3962 - -71.12226,42.39599 - -71.12219,42.39586 - -71.12205,42.39561 - -71.12186,42.39533 - -71.12182,42.39527 - -71.1215,42.3948 - -71.12146,42.39474 - -71.12135,42.39458 - -71.12101,42.394 - -71.12094,42.39388 - -71.1209,42.39383 - -71.12082,42.39372 - -71.12049,42.39316 - -71.12038,42.39297 - -71.12031,42.39289 - -71.12025,42.39282 - -71.12022,42.39278 - -71.1198,42.39232 - -71.1198,42.39232 - -71.11938,42.39187 - -71.11914,42.39162 - -71.11909,42.39157 - -71.1192,42.39151 - -71.11942,42.3914 - -71.11957,42.39129 - -71.11967,42.3912 - -71.11991,42.39104 - -71.11996,42.39101 - -71.12001,42.39098 - -71.1203,42.39078 - -71.1203,42.39078 - -71.1208,42.39043 - -71.12087,42.39038 - -71.12096,42.39032 - -71.12105,42.39026 - -71.12097,42.39021 - -71.12072,42.39001 - -71.12053,42.38984 - -71.12051,42.38982 - -71.12008,42.3894 - -71.12004,42.38935 - -71.11992,42.3892 - -71.11987,42.38914 - -71.1198,42.38902 - -71.11973,42.38891 - -71.11971,42.38888 - -71.11967,42.38879 - -71.11964,42.38873 - -71.11961,42.38858 - -71.11953,42.38829 - -71.11951,42.38825 - -71.11948,42.38817 - -71.11946,42.38811 - -71.11939,42.38786 - -71.11934,42.38769 - -71.1193,42.38752 - -71.11926,42.38736 - -71.11924,42.3872 - -71.11924,42.38699 - -71.11924,42.38692 - -71.11925,42.38689 - -71.11925,42.38683 - -71.11926,42.38677 - -71.11927,42.38655 - -71.1193,42.38633 - -71.11931,42.38621 - -71.11935,42.38581 - -71.11938,42.38556 - -71.1194,42.38539 - -71.11943,42.38506 - -71.11944,42.38498 - -71.11945,42.38491 - -71.11946,42.38483 - -71.11946,42.38477 - -71.11948,42.38466 - -71.1195,42.38444 - -71.11953,42.38414 - -71.11956,42.38388 - -71.11956,42.38388 - -71.11956,42.38386 - -71.11957,42.38379 - -71.11958,42.38372 - -71.11958,42.38369 - -71.11962,42.38336 - -71.11975,42.38224 - -71.11979,42.38189 - -71.11979,42.38186 - -71.1198,42.3818 - -71.11981,42.3817 - -71.11981,42.38169 - -71.11985,42.38127 - -71.11987,42.38106 - -71.11989,42.38084 - -71.11994,42.38043 - -71.11997,42.38013 - -71.11997,42.3801 - -71.11999,42.37999 - -71.11999,42.37992 - -71.12004,42.37945 - -71.12005,42.37938 - -71.12009,42.37898 - -71.12011,42.37882 - -71.12014,42.37861 - -71.12014,42.37861 - -71.12017,42.37837 - -71.12021,42.378 - -71.12021,42.3779 - -71.12021,42.37786 - -71.12021,42.37777 - -71.12019,42.37769 - -71.12017,42.3776 - -71.12012,42.37749 - -71.11988,42.37686 - -71.11986,42.37682 - -71.11976,42.37657 - -71.11972,42.37646 - -71.11968,42.37637 - -71.11962,42.37622 - -71.11956,42.3761 - -71.1194,42.37573 - -71.11939,42.37572 - -71.11917,42.37521 - -71.11913,42.37511 - -71.11902,42.37505 - -71.11895,42.37502 - -71.11889,42.37501 - -71.1188,42.37501 - -71.11875,42.37502 - -71.11871,42.37503 - -71.11869,42.37504 - -71.11864,42.37505 - -71.11858,42.37509 - -71.11855,42.37521 - -71.11854,42.37527 - -71.1185,42.37541 - -71.11845,42.37554 - -71.11839,42.37562 - -71.11829,42.37574 - -71.11817,42.37581 - -71.11799,42.37589 - -71.11785,42.37592 - -71.11771,42.37593 - -71.11759,42.37592 - -71.11622,42.37564 - -71.11573,42.37554 - -71.11554,42.37547 - -71.11544,42.37542 - -71.11512,42.37523 - -71.11497,42.37514 - -71.11453,42.37487 - -71.11445,42.37483 - -71.1145,42.37475 - -71.11475,42.37376 - -71.11475,42.37376 - -71.11475,42.37376 - -71.11497,42.37291 - -71.11512,42.37238 - -71.11515,42.37231 - -71.11522,42.37233 - -71.11526,42.37234 - -71.11533,42.37236 - -71.11547,42.3724 - -71.11577,42.37249 - -71.11581,42.3725 - -71.11585,42.37251 - -71.1159,42.37252 - -71.11597,42.37254 - -71.11603,42.37256 - -71.11604,42.37256 - -71.11606,42.37257 - -71.11607,42.37258 - -71.11609,42.37259 - -71.1161,42.3726 - -71.11613,42.37261 - -71.11614,42.37262 - -71.11616,42.37263 - -71.11618,42.37263 - -71.11619,42.37264 - -71.1162,42.37264 - -71.11622,42.37265 - -71.11623,42.37265 - -71.11626,42.37266 - -71.1163,42.37267 - -71.11634,42.37268 - -71.1164,42.3727 - -71.11645,42.37271 - -71.11659,42.37274 - -71.11668,42.37277 - -71.11678,42.3728 - -71.11688,42.37282 - -71.11699,42.37285 - -71.1171,42.37288 - -71.11712,42.37289 - -71.11719,42.37291 - -71.11727,42.37294 - -71.11742,42.37298 - -71.11746,42.37299 - - - - - From 88495a7eabe60333b32fa1ec910dd1f5e348a0f7 Mon Sep 17 00:00:00 2001 From: Eddie Maldonado Date: Tue, 29 Oct 2024 16:15:28 -0400 Subject: [PATCH 4/4] feat: place form and map side by side on shuttle stop page (#1025) --- .../live/stop_live/stop_view_live.html.heex | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/arrow_web/live/stop_live/stop_view_live.html.heex b/lib/arrow_web/live/stop_live/stop_view_live.html.heex index 23229170..18d97686 100644 --- a/lib/arrow_web/live/stop_live/stop_view_live.html.heex +++ b/lib/arrow_web/live/stop_live/stop_view_live.html.heex @@ -2,10 +2,19 @@ <%= @title %> -<%= live_react_component("Components.StopViewMap", [stop: @stop_map_props], id: "stop-view-map") %> -<.stop_form - form={@form} - action={@form_action} - http_action={@http_action} - trigger_submit={@trigger_submit} -/> +
+
+
+ <.stop_form + form={@form} + action={@form_action} + http_action={@http_action} + trigger_submit={@trigger_submit} + /> +
+ <%= live_react_component("Components.StopViewMap", [stop: @stop_map_props], + id: "stop-view-map", + container: [class: "col-lg-6"] + ) %> +
+
- <%= if col[:link] do %> - <.link href={col[:link]}> - <%= if String.ends_with?(col[:link], "desc") do %> - <.icon name="hero-bars-arrow-down" class="h-4 w-4" /> - <% else %> - <.icon name="hero-bars-arrow-up" class="h-4 w-4" /> - <% end %> + + <%= if col[:link] do %> + <.link href={col[:link]}> + <%= if String.ends_with?(col[:link], "desc") do %> + <.icon name="hero-bars-arrow-down" class="h-4 w-4" /> + <% else %> + <.icon name="hero-bars-arrow-up" class="h-4 w-4" /> + <% end %> + <%= col[:label] %> + + <% else %> <%= col[:label] %> - - <% else %> - <%= col[:label] %> - <% end %> + <% end %> <%= gettext("Actions") %> diff --git a/lib/arrow_web/controllers/disruption_html/_form.html.heex b/lib/arrow_web/controllers/disruption_html/_form.html.heex index 45a6ed75..dc29b0fe 100644 --- a/lib/arrow_web/controllers/disruption_html/_form.html.heex +++ b/lib/arrow_web/controllers/disruption_html/_form.html.heex @@ -9,9 +9,9 @@
<%= link("cancel", - to: @cancel_path, - class: "w-100 btn btn-outline-primary", - data: [confirm: @cancel_confirmation] - ) %> + to: @cancel_path, + class: "w-100 btn btn-outline-primary", + data: [confirm: @cancel_confirmation] + ) %>
diff --git a/lib/arrow_web/controllers/disruption_html/edit.html.heex b/lib/arrow_web/controllers/disruption_html/edit.html.heex index 29431ea6..067c7dbe 100644 --- a/lib/arrow_web/controllers/disruption_html/edit.html.heex +++ b/lib/arrow_web/controllers/disruption_html/edit.html.heex @@ -1,8 +1,7 @@ <%= form_tag Routes.disruption_path(@conn, :update, @id), method: "put", class: "col-lg-8" do %>

- edit disruption - ID + edit disruption ID <%= @id %>

diff --git a/lib/arrow_web/controllers/disruption_html/index.html.heex b/lib/arrow_web/controllers/disruption_html/index.html.heex index 45d193d5..ddc484c7 100644 --- a/lib/arrow_web/controllers/disruption_html/index.html.heex +++ b/lib/arrow_web/controllers/disruption_html/index.html.heex @@ -20,10 +20,10 @@ <%= if @filters.search do %>
<%= link("✖", - class: "btn btn-outline-secondary", - title: "clear search", - to: update_filters_path(@conn, %{@filters | search: nil}) - ) %> + class: "btn btn-outline-secondary", + title: "clear search", + to: update_filters_path(@conn, %{@filters | search: nil}) + ) %>
<% end %> @@ -42,40 +42,40 @@ <% active_class = if(show_as_active?, do: "active", else: "") %> <%= link( - adjustment_kind_icon(@conn, kind, "lg"), - class: "d-flex mr-1 m-disruption-index__route_filter #{active_class}", - "aria-label": kind |> to_string() |> String.replace("_", " "), - to: update_filters_path(@conn, Filters.toggle_kind(@filters, kind)) - ) %> + adjustment_kind_icon(@conn, kind, "lg"), + class: "d-flex mr-1 m-disruption-index__route_filter #{active_class}", + "aria-label": kind |> to_string() |> String.replace("_", " "), + to: update_filters_path(@conn, Filters.toggle_kind(@filters, kind)) + ) %> <% end %> <%= if not Filters.calendar?(@filters) do %> <%= link("include past", - class: - "mx-2 btn btn-outline-secondary" <> - if(@filters.view.include_past?, do: " active", else: ""), - to: update_view_path(@conn, @filters, :include_past?, !@filters.view.include_past?) - ) %> + class: + "mx-2 btn btn-outline-secondary" <> + if(@filters.view.include_past?, do: " active", else: ""), + to: update_view_path(@conn, @filters, :include_past?, !@filters.view.include_past?) + ) %> <% end %> <%= link("approved", - class: - "mx-2 btn btn-outline-secondary" <> - if(@filters.only_approved?, do: " active", else: ""), - to: update_filters_path(@conn, Filters.toggle_only_approved(@filters)) - ) %> + class: + "mx-2 btn btn-outline-secondary" <> + if(@filters.only_approved?, do: " active", else: ""), + to: update_filters_path(@conn, Filters.toggle_only_approved(@filters)) + ) %> <%= if Filters.resettable?(@filters) do %> <%= link("reset filters", - class: "btn btn-link", - to: update_filters_path(@conn, Filters.reset(@filters)) - ) %> + class: "btn btn-link", + to: update_filters_path(@conn, Filters.reset(@filters)) + ) %> <% end %> <%= link("⬒ #{if(Filters.calendar?(@filters), do: "list", else: "calendar")} view", - class: "ml-auto btn btn-outline-secondary", - to: update_filters_path(@conn, Filters.toggle_view(@filters)) - ) %> + class: "ml-auto btn btn-outline-secondary", + to: update_filters_path(@conn, Filters.toggle_view(@filters)) + ) %> diff --git a/lib/arrow_web/controllers/disruption_html/show.html.heex b/lib/arrow_web/controllers/disruption_html/show.html.heex index b6508112..f99c7017 100644 --- a/lib/arrow_web/controllers/disruption_html/show.html.heex +++ b/lib/arrow_web/controllers/disruption_html/show.html.heex @@ -25,8 +25,13 @@
inactive_class}>
-

approval status

- inactive_class}> +
+

approval status

+
+ inactive_class} + > <%= if @revision.row_approved, do: "approved", else: "pending" %>
@@ -36,8 +41,10 @@

date range

- <%= format_date(@revision.start_date, "(no start date)") %> - – <%= format_date(@revision.end_date, "(no end date)") %> + <%= format_date(@revision.start_date, "(no start date)") %> – <%= format_date( + @revision.end_date, + "(no end date)" + ) %>
@@ -46,7 +53,7 @@
<%= for {day, times} <- DaysOfWeek.describe(@revision.days_of_week) do %> -
<%= day %>
<%= times %>
+
<%= day %>
<%= times %>
<% end %>
@@ -57,8 +64,8 @@
<%= @revision.trip_short_names - |> Enum.map(& &1.trip_short_name) - |> Enum.join(", ") %> + |> Enum.map(& &1.trip_short_name) + |> Enum.join(", ") %>
<% end %> @@ -83,8 +90,10 @@
<%= if Permissions.authorize?(:update_disruption, @user) do %> <%= form_tag Routes.disruption_path(@conn, :update_row_status, @revision.disruption_id), method: "put" do %> - <%= hidden_input :revision, :row_approved, value: !@revision.row_approved %> - <%= submit mark_as_approved_or_pending(@revision.row_approved), class: "btn btn-primary"%> + <%= hidden_input(:revision, :row_approved, value: !@revision.row_approved) %> + <%= submit(mark_as_approved_or_pending(@revision.row_approved), + class: "btn btn-primary" + ) %> <% end %> <.link class="btn btn-tertiary" navigate={Routes.disruption_path(@conn, :edit, @id)}> <._button_description conn={@conn} kind={:edit} /> diff --git a/lib/arrow_web/controllers/feed_html/disruption_summary.html.heex b/lib/arrow_web/controllers/feed_html/disruption_summary.html.heex index 9e3c2e46..9963ed69 100644 --- a/lib/arrow_web/controllers/feed_html/disruption_summary.html.heex +++ b/lib/arrow_web/controllers/feed_html/disruption_summary.html.heex @@ -4,7 +4,7 @@
ROW Status
-
<%= if @revision.row_approved, do: "Approved", else: "Pending" %>
+
<%= if @revision.row_approved, do: "Approved", else: "Pending" %>
Adjustments
@@ -30,7 +30,9 @@ None <% else %> <%= for exc <- @revision.exceptions do %> - <%= exc.excluded_date %> + + <%= exc.excluded_date %> + <% end %> <% end %>
diff --git a/lib/arrow_web/controllers/feed_html/index.html.heex b/lib/arrow_web/controllers/feed_html/index.html.heex index a927a9cf..577513bd 100644 --- a/lib/arrow_web/controllers/feed_html/index.html.heex +++ b/lib/arrow_web/controllers/feed_html/index.html.heex @@ -1,18 +1,18 @@ -

Feed

Disruptions with differences compared to their GTFS version.

-
+
<%= for d <- @disruptions do %>

- <%= link "Disruption ##{d.id}", + <%= link("Disruption ##{d.id}", to: Routes.disruption_path(@conn, :show, d.id), - class: "text-blue-500 underline" %> + class: "text-blue-500 underline" + ) %>

<%= case d.revisions do %> @@ -22,7 +22,6 @@ <.disruption_summary revision={latest} /> from the published version: <.disruption_summary revision={published} /> - <% [revision] -> %>
A new, unpublished disruption: diff --git a/lib/arrow_web/controllers/layout_html/_flash.html.heex b/lib/arrow_web/controllers/layout_html/_flash.html.heex index fe82568e..59e1803d 100644 --- a/lib/arrow_web/controllers/layout_html/_flash.html.heex +++ b/lib/arrow_web/controllers/layout_html/_flash.html.heex @@ -3,7 +3,9 @@ <% end %> <%= with message when is_binary(message) <- Phoenix.Flash.get(@flash, :error) do %> - + <% end %> <%= with {message, errors} <- Phoenix.Flash.get(@flash, :errors) do %> diff --git a/lib/arrow_web/controllers/layout_html/_footer.html.heex b/lib/arrow_web/controllers/layout_html/_footer.html.heex index c0131846..751f4418 100644 --- a/lib/arrow_web/controllers/layout_html/_footer.html.heex +++ b/lib/arrow_web/controllers/layout_html/_footer.html.heex @@ -7,10 +7,9 @@
Contact Us -
- Slack: #disruptions -
- Email: transitdata@mbta.com +
Slack: + #disruptions +
Email: transitdata@mbta.com
- \ No newline at end of file + diff --git a/lib/arrow_web/controllers/layout_html/_header.html.heex b/lib/arrow_web/controllers/layout_html/_header.html.heex index 77c8ea6c..a88d17fb 100644 --- a/lib/arrow_web/controllers/layout_html/_header.html.heex +++ b/lib/arrow_web/controllers/layout_html/_header.html.heex @@ -8,15 +8,15 @@
- \ No newline at end of file + diff --git a/lib/arrow_web/controllers/layout_html/app.html.heex b/lib/arrow_web/controllers/layout_html/app.html.heex index 6436619e..162a6ffc 100644 --- a/lib/arrow_web/controllers/layout_html/app.html.heex +++ b/lib/arrow_web/controllers/layout_html/app.html.heex @@ -7,4 +7,4 @@ <._footer /> -<%= content_tag(:script, "", type: "text/javascript", src: ~p"/assets/app.js") %> \ No newline at end of file +<%= content_tag(:script, "", type: "text/javascript", src: ~p"/assets/app.js") %> diff --git a/lib/arrow_web/controllers/layout_html/live.html.heex b/lib/arrow_web/controllers/layout_html/live.html.heex index d2e909e1..793ce506 100644 --- a/lib/arrow_web/controllers/layout_html/live.html.heex +++ b/lib/arrow_web/controllers/layout_html/live.html.heex @@ -1,4 +1,4 @@ -<._header logout_url={@logout_url} view="live"/> +<._header logout_url={@logout_url} view="live" />
<._flash flash={@flash} /> diff --git a/lib/arrow_web/controllers/layout_html/root.html.heex b/lib/arrow_web/controllers/layout_html/root.html.heex index f81edc0c..b27200c0 100644 --- a/lib/arrow_web/controllers/layout_html/root.html.heex +++ b/lib/arrow_web/controllers/layout_html/root.html.heex @@ -1,19 +1,18 @@ - - - + + + - - - - - + + + + Arrow - <%= tag :link, rel: "stylesheet", href: ~p"/assets/app.css" %> + <%= tag(:link, rel: "stylesheet", href: ~p"/assets/app.css") %> diff --git a/lib/arrow_web/controllers/shape_html/new_bulk.html.heex b/lib/arrow_web/controllers/shape_html/new_bulk.html.heex index 3101183b..b2be5e3f 100644 --- a/lib/arrow_web/controllers/shape_html/new_bulk.html.heex +++ b/lib/arrow_web/controllers/shape_html/new_bulk.html.heex @@ -6,7 +6,7 @@ <%= react_component("Components.ShapeViewMap", %{}) %> <.simple_form :let={f} for={@shapes_upload} action={~p"/shapes_upload"} multipart> - <.input field={f[:filename]} type="file" label="Filename" required="true"/> + <.input field={f[:filename]} type="file" label="Filename" required="true" /> <:actions> <.button class="btn-primary">upload file diff --git a/lib/arrow_web/controllers/shape_html/select.html.heex b/lib/arrow_web/controllers/shape_html/select.html.heex index 3d59799f..e484ad0b 100644 --- a/lib/arrow_web/controllers/shape_html/select.html.heex +++ b/lib/arrow_web/controllers/shape_html/select.html.heex @@ -6,32 +6,47 @@ <%= react_component("Components.ShapeViewMap", shapes_map_view(@form)) %>
-<.simple_form :let={f} for={@form} action={~p"/shapes_upload"} multipart> - <.error :if={@form.action}> - Oops, something went wrong! Please check the errors below. - - <%= if f[:shapes] do %> -
-
Uploaded Name
-
New Name
-
Save?
- <.inputs_for :let={f_nested} field={f[:shapes]} id="shapes" as={:shapes} skip_hidden={:true}> - <.input field={f_nested[:name]} class="flex align-items-center" disabled /> - <.input field={f_nested[:name]} class="flex align-items-center" /> - <.input field={f_nested[:save]} type="checkbox" /> - - -
+ <.simple_form :let={f} for={@form} action={~p"/shapes_upload"} multipart> + <.error :if={@form.action}> + Oops, something went wrong! Please check the errors below. + + <%= if f[:shapes] do %> +
+
Uploaded Name
+
New Name
+
Save?
+ <.inputs_for + :let={f_nested} + field={f[:shapes]} + id="shapes" + as={:shapes} + skip_hidden={true} + > + <.input field={f_nested[:name]} class="flex align-items-center" disabled /> + <.input field={f_nested[:name]} class="flex align-items-center" /> + <.input field={f_nested[:save]} type="checkbox" /> + + +
<% end %> - <:actions> -
- <.button type="submit" class="btn-primary w-100">save selected shapes -
-
- <.link_button href={~p"/shapes_upload"} class="btn-outline-primary w-100" data-confirm="Are you sure you want to cancel? All changes will be lost!">cancel -
- - + <:actions> +
+ <.button type="submit" class="btn-primary w-100">save selected shapes +
+
+ <.link_button + href={~p"/shapes_upload"} + class="btn-outline-primary w-100" + data-confirm="Are you sure you want to cancel? All changes will be lost!" + > + cancel + +
+ +
diff --git a/lib/arrow_web/controllers/shape_html/shape_form.html.heex b/lib/arrow_web/controllers/shape_html/shape_form.html.heex index 50b8b9c5..d3aebaed 100644 --- a/lib/arrow_web/controllers/shape_html/shape_form.html.heex +++ b/lib/arrow_web/controllers/shape_html/shape_form.html.heex @@ -2,7 +2,7 @@ <.error :if={@changeset.action}> Oops, something went wrong! Please check the errors below. - <.input field={f[:filename]} type="file" label="Filename" required="true"/> + <.input field={f[:filename]} type="file" label="Filename" required="true" /> <.input field={f[:name]} type="text" label="Name" /> <:actions> <.button class="btn-primary">Save Shape diff --git a/lib/arrow_web/controllers/stop_html/index.html.heex b/lib/arrow_web/controllers/stop_html/index.html.heex index 233b45cf..0c48e492 100644 --- a/lib/arrow_web/controllers/stop_html/index.html.heex +++ b/lib/arrow_web/controllers/stop_html/index.html.heex @@ -9,20 +9,46 @@ <.table id="stops" rows={@stops} row_click={&JS.navigate(~p"/stops/#{&1}/edit")}> <:col :let={stop} label="Stop" link={sort_link(@order_by, "stop_id")}><%= stop.stop_id %> - <:col :let={stop} label="Stop name" link={sort_link(@order_by, "stop_name")}><%= stop.stop_name %> - <:col :let={stop} label="Stop desc" link={sort_link(@order_by, "stop_desc")}><%= stop.stop_desc %> - <:col :let={stop} label="Platform code" link={sort_link(@order_by, "platform_code")}><%= stop.platform_code %> - <:col :let={stop} label="Platform name" link={sort_link(@order_by, "platform_name")}><%= stop.platform_name %> - <:col :let={stop} label="Stop lat" link={sort_link(@order_by, "stop_lat")}><%= stop.stop_lat %> - <:col :let={stop} label="Stop long" link={sort_link(@order_by, "stop_lon")}><%= stop.stop_lon %> - <:col :let={stop} label="Stop address" link={sort_link(@order_by, "stop_address")}><%= stop.stop_address %> + <:col :let={stop} label="Stop name" link={sort_link(@order_by, "stop_name")}> + <%= stop.stop_name %> + + <:col :let={stop} label="Stop desc" link={sort_link(@order_by, "stop_desc")}> + <%= stop.stop_desc %> + + <:col :let={stop} label="Platform code" link={sort_link(@order_by, "platform_code")}> + <%= stop.platform_code %> + + <:col :let={stop} label="Platform name" link={sort_link(@order_by, "platform_name")}> + <%= stop.platform_name %> + + <:col :let={stop} label="Stop lat" link={sort_link(@order_by, "stop_lat")}> + <%= stop.stop_lat %> + + <:col :let={stop} label="Stop long" link={sort_link(@order_by, "stop_lon")}> + <%= stop.stop_lon %> + + <:col :let={stop} label="Stop address" link={sort_link(@order_by, "stop_address")}> + <%= stop.stop_address %> + <:col :let={stop} label="Zone" link={sort_link(@order_by, "zone_id")}><%= stop.zone_id %> - <:col :let={stop} label="Level" link={sort_link(@order_by, "level_id")}><%= stop.level_id %> - <:col :let={stop} label="Parent station" link={sort_link(@order_by, "parent_station")}><%= stop.parent_station %> - <:col :let={stop} label="Municipality" link={sort_link(@order_by, "municipality")}><%= stop.municipality %> - <:col :let={stop} label="On street" link={sort_link(@order_by, "on_street")}><%= stop.on_street %> - <:col :let={stop} label="At street" link={sort_link(@order_by, "at_street")}><%= stop.at_street %> - <:col :let={stop} label="Last updated" link={sort_link(@order_by, "updated_at")}><%= format_timestamp(stop.updated_at) %> + <:col :let={stop} label="Level" link={sort_link(@order_by, "level_id")}> + <%= stop.level_id %> + + <:col :let={stop} label="Parent station" link={sort_link(@order_by, "parent_station")}> + <%= stop.parent_station %> + + <:col :let={stop} label="Municipality" link={sort_link(@order_by, "municipality")}> + <%= stop.municipality %> + + <:col :let={stop} label="On street" link={sort_link(@order_by, "on_street")}> + <%= stop.on_street %> + + <:col :let={stop} label="At street" link={sort_link(@order_by, "at_street")}> + <%= stop.at_street %> + + <:col :let={stop} label="Last updated" link={sort_link(@order_by, "updated_at")}> + <%= format_timestamp(stop.updated_at) %> + <:action :let={stop}> <.link navigate={~p"/stops/#{stop}/edit"}>Edit diff --git a/lib/arrow_web/controllers/unauthorized_html/index.html.heex b/lib/arrow_web/controllers/unauthorized_html/index.html.heex index 284329ad..f6b480e4 100644 --- a/lib/arrow_web/controllers/unauthorized_html/index.html.heex +++ b/lib/arrow_web/controllers/unauthorized_html/index.html.heex @@ -1,10 +1,17 @@

Whoops! You are not authorized to access this page.

<%= if "read-only" in @roles or "admin" in @roles do %> + + Were you looking for a <%= link("list of disruptions", + to: Routes.disruption_path(@conn, :index) + ) %> or a <%= link("calendar schedule", + to: Routes.disruption_path(@conn, :index, view: "calendar") + ) %>? + + <% end %> - Were you looking for a <%= link("list of disruptions", to: Routes.disruption_path(@conn, :index)) %> - or a <%= link("calendar schedule", to: Routes.disruption_path(@conn, :index, view: "calendar")) %>? + To request access to this page, please contact <%= link("transitdata@mbta.com", + to: "mailto:transitdata@mbta.com" + ) %>. - <% end %> - To request access to this page, please contact <%= link("transitdata@mbta.com", to: "mailto:transitdata@mbta.com") %>.
diff --git a/lib/arrow_web/live/stop_live/stop_live.ex b/lib/arrow_web/live/stop_live/stop_live.ex index f4fe91d2..5fe5fa02 100644 --- a/lib/arrow_web/live/stop_live/stop_live.ex +++ b/lib/arrow_web/live/stop_live/stop_live.ex @@ -15,14 +15,28 @@ defmodule ArrowWeb.StopViewLive do def stop_form(assigns) do ~H""" -

+

- * required field + * required field -
- View Shuttle Stop Conventions +
+ + View Shuttle Stop Conventions +

- <.simple_form :let={f} for={@form} as={:stop} action={@http_action} phx-change="validate" phx-submit={@action} phx-trigger-action={@trigger_submit} id="stop-form"> + <.simple_form + :let={f} + for={@form} + as={:stop} + action={@http_action} + phx-change="validate" + phx-submit={@action} + phx-trigger-action={@trigger_submit} + id="stop-form" + > <.error :if={@form.action}> Oops, something went wrong! Please check the errors below. @@ -42,8 +56,8 @@ defmodule ArrowWeb.StopViewLive do
- <.input class="col-md-6" field={f[:stop_lat]} type="number" label="Latitude*" step="any" /> - <.input class="col-md-6" field={f[:stop_lon]} type="number" label="Longitude*" step="any" /> + <.input class="col-md-6" field={f[:stop_lat]} type="number" label="Latitude*" step="any" /> + <.input class="col-md-6" field={f[:stop_lon]} type="number" label="Longitude*" step="any" />
<.input field={f[:municipality]} type="text" label="Municipality*" /> <.input field={f[:stop_address]} type="text" label="Stop Address" /> @@ -54,7 +68,13 @@ defmodule ArrowWeb.StopViewLive do <.button type="submit" class="btn-primary w-100">Save Shuttle Stop
- <.link_button href={~p"/stops"} class="btn-outline-primary w-100" data-confirm="Are you sure you want to cancel? All changes will be lost!">Cancel + <.link_button + href={~p"/stops"} + class="btn-outline-primary w-100" + data-confirm="Are you sure you want to cancel? All changes will be lost!" + > + Cancel +
diff --git a/lib/arrow_web/live/stop_live/stop_view_live.html.heex b/lib/arrow_web/live/stop_live/stop_view_live.html.heex index d43ed326..23229170 100644 --- a/lib/arrow_web/live/stop_live/stop_view_live.html.heex +++ b/lib/arrow_web/live/stop_live/stop_view_live.html.heex @@ -1,6 +1,11 @@ <.header> - <%= @title %> + <%= @title %> <%= live_react_component("Components.StopViewMap", [stop: @stop_map_props], id: "stop-view-map") %> -<.stop_form form={@form} action={@form_action} http_action={@http_action} trigger_submit={@trigger_submit} /> +<.stop_form + form={@form} + action={@form_action} + http_action={@http_action} + trigger_submit={@trigger_submit} +/> From 9242444ef300b288075dedf2a85a3d017788d0a8 Mon Sep 17 00:00:00 2001 From: meagharty <149533950+meagharty@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:43:56 -0400 Subject: [PATCH 2/4] feat: add shuttle route definition to shuttles (#1022) * feat: add disrupted route input as string identifier * fix: update priv/repo/seeds.exs after import-gtfs updates * feat: modify disrupted_route_id to fk gtfs_route_id * feat: add select of heavy + light rail gtfs routes by id * feat: don't allow a shuttle to be set as active for now * tests: add tests for shuttle updates * feat: add route directions for shuttle * tests: updates for adding route to Shuttle struct, copy * feat: add styling and link to shuttle conventions doc * fix: run mix format on heex files * feat: add list of shuttles to form, update association * tests: add tests for updating shuttle route, shuttle route shape id * fix: fix default preload order to be by direction_id * feat: default shuttle status to draft on new --- lib/arrow/shuttles.ex | 36 +++++++-- lib/arrow/shuttles/route.ex | 7 +- lib/arrow/shuttles/route_stop.ex | 2 +- lib/arrow/shuttles/shuttle.ex | 29 +++++++ lib/arrow_web/components/core_components.ex | 2 +- .../controllers/shuttle_controller.ex | 45 +++++++++-- lib/arrow_web/controllers/shuttle_html.ex | 2 + .../controllers/shuttle_html/edit.html.heex | 9 ++- .../controllers/shuttle_html/index.html.heex | 3 +- .../controllers/shuttle_html/new.html.heex | 9 ++- .../controllers/shuttle_html/show.html.heex | 3 +- .../shuttle_html/shuttle_form.html.heex | 80 +++++++++++++++++-- ...41018202407_add_fk_gtfs_route_shuttles.exs | 10 +++ priv/repo/seeds.exs | 43 +++++----- priv/repo/structure.sql | 18 ++++- test/arrow/shuttles_test.exs | 59 +++++++++++++- .../controllers/shuttle_controller_test.exs | 12 +-- test/support/fixtures/shuttles_fixtures.ex | 35 +++++++- 18 files changed, 344 insertions(+), 60 deletions(-) create mode 100644 priv/repo/migrations/20241018202407_add_fk_gtfs_route_shuttles.exs diff --git a/lib/arrow/shuttles.ex b/lib/arrow/shuttles.ex index cfafdcd0..18138366 100644 --- a/lib/arrow/shuttles.ex +++ b/lib/arrow/shuttles.ex @@ -8,6 +8,7 @@ defmodule Arrow.Shuttles do alias Arrow.Repo alias ArrowWeb.ErrorHelpers + alias Arrow.Gtfs.Route, as: GtfsRoute alias Arrow.Shuttles.KML alias Arrow.Shuttles.Shape alias Arrow.Shuttles.ShapesUpload @@ -244,7 +245,7 @@ defmodule Arrow.Shuttles do """ def list_shuttles do - Repo.all(Shuttle) + Repo.all(Shuttle) |> Repo.preload(routes: [:shape]) end @doc """ @@ -261,7 +262,9 @@ defmodule Arrow.Shuttles do ** (Ecto.NoResultsError) """ - def get_shuttle!(id), do: Repo.get!(Shuttle, id) + def get_shuttle!(id) do + Repo.get!(Shuttle, id) |> Repo.preload(routes: [:shape]) + end @doc """ Creates a shuttle. @@ -276,9 +279,15 @@ defmodule Arrow.Shuttles do """ def create_shuttle(attrs \\ %{}) do - %Shuttle{} - |> Shuttle.changeset(attrs) - |> Repo.insert() + created_shuttle = + %Shuttle{} + |> Shuttle.changeset(attrs) + |> Repo.insert() + + case created_shuttle do + {:ok, shuttle} -> {:ok, Repo.preload(shuttle, routes: [:shape])} + err -> err + end end @doc """ @@ -294,9 +303,15 @@ defmodule Arrow.Shuttles do """ def update_shuttle(%Shuttle{} = shuttle, attrs) do - shuttle - |> Shuttle.changeset(attrs) - |> Repo.update() + updated_shuttle = + shuttle + |> Shuttle.changeset(attrs) + |> Repo.update() + + case updated_shuttle do + {:ok, shuttle} -> {:ok, Repo.preload(shuttle, routes: [:shape])} + err -> err + end end @doc """ @@ -311,4 +326,9 @@ defmodule Arrow.Shuttles do def change_shuttle(%Shuttle{} = shuttle, attrs \\ %{}) do Shuttle.changeset(shuttle, attrs) end + + def list_disruptable_routes do + query = from(r in GtfsRoute, where: r.type in [:light_rail, :heavy_rail]) + Repo.all(query) + end end diff --git a/lib/arrow/shuttles/route.ex b/lib/arrow/shuttles/route.ex index d270d9da..042c2a44 100644 --- a/lib/arrow/shuttles/route.ex +++ b/lib/arrow/shuttles/route.ex @@ -9,8 +9,8 @@ defmodule Arrow.Shuttles.Route do field :direction_id, Ecto.Enum, values: [:"0", :"1"] field :direction_desc, :string field :waypoint, :string - field :shuttle_id, :id - field :shape_id, :id + belongs_to :shuttle, Arrow.Shuttles.Shuttle + belongs_to :shape, Arrow.Shuttles.Shape timestamps(type: :utc_datetime) end @@ -18,7 +18,8 @@ defmodule Arrow.Shuttles.Route do @doc false def changeset(route, attrs) do route - |> cast(attrs, [:direction_id, :direction_desc, :destination, :waypoint, :suffix]) + |> cast(attrs, [:direction_id, :direction_desc, :destination, :waypoint, :suffix, :shape_id]) + |> foreign_key_constraint(:shape_id) |> validate_required([:direction_id, :direction_desc, :destination]) end end diff --git a/lib/arrow/shuttles/route_stop.ex b/lib/arrow/shuttles/route_stop.ex index 91aa461c..50ba60b6 100644 --- a/lib/arrow/shuttles/route_stop.ex +++ b/lib/arrow/shuttles/route_stop.ex @@ -8,7 +8,7 @@ defmodule Arrow.Shuttles.RouteStop do field :stop_id, :string field :stop_sequence, :integer field :time_to_next_stop, :decimal - field :shuttle_route_id, :id + belongs_to :route, Arrow.Shuttles.Route timestamps(type: :utc_datetime) end diff --git a/lib/arrow/shuttles/shuttle.ex b/lib/arrow/shuttles/shuttle.ex index 7189071b..dded4de7 100644 --- a/lib/arrow/shuttles/shuttle.ex +++ b/lib/arrow/shuttles/shuttle.ex @@ -7,6 +7,7 @@ defmodule Arrow.Shuttles.Shuttle do field :status, Ecto.Enum, values: [:draft, :active, :inactive] field :shuttle_name, :string field :disrupted_route_id, :string + has_many :routes, Arrow.Shuttles.Route, preload_order: [asc: :direction_id] timestamps(type: :utc_datetime) end @@ -15,7 +16,35 @@ defmodule Arrow.Shuttles.Shuttle do def changeset(shuttle, attrs) do shuttle |> cast(attrs, [:shuttle_name, :disrupted_route_id, :status]) + |> cast_assoc(:routes, with: &Arrow.Shuttles.Route.changeset/2) |> validate_required([:shuttle_name, :status]) + |> validate_required_for(:status) + |> foreign_key_constraint(:disrupted_route_id) |> unique_constraint(:shuttle_name) end + + def validate_required_for(changeset, :status) do + # Placeholder validation until form is complete + status = get_field(changeset, :status) + # Set error on status field for now + fields = [:status] + + case status do + :active -> + message = "can't be set to active when required fields are missing" + + %{ + changeset + | errors: + Enum.map( + fields, + &{&1, {message, [validation: :required]}} + ), + valid?: false + } + + _ -> + changeset + end + end end diff --git a/lib/arrow_web/components/core_components.ex b/lib/arrow_web/components/core_components.ex index 6e59ca29..7f624ef7 100644 --- a/lib/arrow_web/components/core_components.ex +++ b/lib/arrow_web/components/core_components.ex @@ -408,7 +408,7 @@ defmodule ArrowWeb.CoreComponents do def label(assigns) do ~H""" -
<%= revision.title %>