From 4e65dbc4c24ec663f95707e63d47147416fdad22 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:36:01 -0400 Subject: [PATCH 01/25] fix: commit CoreComponents from a phoenix 7 new app --- lib/arrow_web/components/core_components.ex | 676 ++++++++++++++++++++ 1 file changed, 676 insertions(+) create mode 100644 lib/arrow_web/components/core_components.ex diff --git a/lib/arrow_web/components/core_components.ex b/lib/arrow_web/components/core_components.ex new file mode 100644 index 00000000..bebd1d9c --- /dev/null +++ b/lib/arrow_web/components/core_components.ex @@ -0,0 +1,676 @@ +defmodule ArrowWeb.CoreComponents do + @moduledoc """ + Provides core UI components. + + At first glance, this module may seem daunting, but its goal is to provide + core building blocks for your application, such as modals, tables, and + forms. The components consist mostly of markup and are well-documented + with doc strings and declarative assigns. You may customize and style + them in any way you want, based on your application growth and needs. + + The default components use Tailwind CSS, a utility-first CSS framework. + See the [Tailwind CSS documentation](https://tailwindcss.com) to learn + how to customize them or feel free to swap in another framework altogether. + + Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. + """ + use Phoenix.Component + + alias Phoenix.LiveView.JS + import ArrowWeb.Gettext + + @doc """ + Renders a modal. + + ## Examples + + <.modal id="confirm-modal"> + This is a modal. + + + JS commands may be passed to the `:on_cancel` to configure + the closing/cancel event, for example: + + <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> + This is another modal. + + + """ + attr :id, :string, required: true + attr :show, :boolean, default: false + attr :on_cancel, JS, default: %JS{} + slot :inner_block, required: true + + def modal(assigns) do + ~H""" + + """ + end + + def input(%{type: "select"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + def input(%{type: "textarea"} = assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + # All other inputs text, datetime-local, url, password, etc. are handled here... + def input(assigns) do + ~H""" +
+ <.label for={@id}><%= @label %> + + <.error :for={msg <- @errors}><%= msg %> +
+ """ + end + + @doc """ + Renders a label. + """ + attr :for, :string, default: nil + slot :inner_block, required: true + + def label(assigns) do + ~H""" + + """ + end + + @doc """ + Generates a generic error message. + """ + slot :inner_block, required: true + + def error(assigns) do + ~H""" +

+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> + <%= render_slot(@inner_block) %> +

+ """ + end + + @doc """ + Renders a header with title. + """ + attr :class, :string, default: nil + + slot :inner_block, required: true + slot :subtitle + slot :actions + + def header(assigns) do + ~H""" +
+
+

+ <%= render_slot(@inner_block) %> +

+

+ <%= render_slot(@subtitle) %> +

+
+
<%= render_slot(@actions) %>
+
+ """ + end + + @doc ~S""" + Renders a table with generic styling. + + ## Examples + + <.table id="users" rows={@users}> + <:col :let={user} label="id"><%= user.id %> + <:col :let={user} label="username"><%= user.username %> + + """ + attr :id, :string, required: true + attr :rows, :list, required: true + attr :row_id, :any, default: nil, doc: "the function for generating the row id" + attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" + + attr :row_item, :any, + default: &Function.identity/1, + doc: "the function for mapping each row before calling the :col and :action slots" + + slot :col, required: true do + attr :label, :string + end + + slot :action, doc: "the slot for showing user actions in the last table column" + + def table(assigns) do + assigns = + with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do + assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) + end + + ~H""" +
+ + + + + + + + + + + + + +
<%= col[:label] %> + <%= gettext("Actions") %> +
+
+ + + <%= render_slot(col, @row_item.(row)) %> + +
+
+
+ + + <%= render_slot(action, @row_item.(row)) %> + +
+
+
+ """ + end + + @doc """ + Renders a data list. + + ## Examples + + <.list> + <:item title="Title"><%= @post.title %> + <:item title="Views"><%= @post.views %> + + """ + slot :item, required: true do + attr :title, :string, required: true + end + + def list(assigns) do + ~H""" +
+
+
+
<%= item.title %>
+
<%= render_slot(item) %>
+
+
+
+ """ + end + + @doc """ + Renders a back navigation link. + + ## Examples + + <.back navigate={~p"/posts"}>Back to posts + """ + attr :navigate, :any, required: true + slot :inner_block, required: true + + def back(assigns) do + ~H""" +
+ <.link + navigate={@navigate} + class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700" + > + <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> + <%= render_slot(@inner_block) %> + +
+ """ + end + + @doc """ + Renders a [Heroicon](https://heroicons.com). + + Heroicons come in three styles – outline, solid, and mini. + By default, the outline style is used, but solid and mini may + be applied by using the `-solid` and `-mini` suffix. + + You can customize the size and colors of the icons by setting + width, height, and background color classes. + + Icons are extracted from the `deps/heroicons` directory and bundled within + your compiled app.css by the plugin in your `assets/tailwind.config.js`. + + ## Examples + + <.icon name="hero-x-mark-solid" /> + <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" /> + """ + attr :name, :string, required: true + attr :class, :string, default: nil + + def icon(%{name: "hero-" <> _} = assigns) do + ~H""" + + """ + end + + ## JS Commands + + def show(js \\ %JS{}, selector) do + JS.show(js, + to: selector, + transition: + {"transition-all transform ease-out duration-300", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", + "opacity-100 translate-y-0 sm:scale-100"} + ) + end + + def hide(js \\ %JS{}, selector) do + JS.hide(js, + to: selector, + time: 200, + transition: + {"transition-all transform ease-in duration-200", + "opacity-100 translate-y-0 sm:scale-100", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} + ) + end + + def show_modal(js \\ %JS{}, id) when is_binary(id) do + js + |> JS.show(to: "##{id}") + |> JS.show( + to: "##{id}-bg", + transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"} + ) + |> show("##{id}-container") + |> JS.add_class("overflow-hidden", to: "body") + |> JS.focus_first(to: "##{id}-content") + end + + def hide_modal(js \\ %JS{}, id) do + js + |> JS.hide( + to: "##{id}-bg", + transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"} + ) + |> hide("##{id}-container") + |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"}) + |> JS.remove_class("overflow-hidden", to: "body") + |> JS.pop_focus() + end + + @doc """ + Translates an error message using gettext. + """ + def translate_error({msg, opts}) do + # When using gettext, we typically pass the strings we want + # to translate as a static argument: + # + # # Translate the number of files with plural rules + # dngettext("errors", "1 file", "%{count} files", count) + # + # However the error messages in our forms and APIs are generated + # dynamically, so we need to translate them by calling Gettext + # with our gettext backend as first argument. Translations are + # available in the errors.po file (as we use the "errors" domain). + if count = opts[:count] do + Gettext.dngettext(ArrowWeb.Gettext, "errors", msg, msg, count, opts) + else + Gettext.dgettext(ArrowWeb.Gettext, "errors", msg, opts) + end + end + + @doc """ + Translates the errors for a field from a keyword list of errors. + """ + def translate_errors(errors, field) when is_list(errors) do + for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) + end +end From 88f441f29d00527ad518fea920def9ac9ee3cca9 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:36:41 -0400 Subject: [PATCH 02/25] fix: update arrow_web.ex to match new phoenix app, use CoreComponents --- lib/arrow_web.ex | 49 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/lib/arrow_web.ex b/lib/arrow_web.ex index be6e1e32..24c9df9d 100644 --- a/lib/arrow_web.ex +++ b/lib/arrow_web.ex @@ -18,6 +18,22 @@ defmodule ArrowWeb do below. Instead, define any helper function in modules and import those modules here. """ + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router + import Plug.Conn + import Phoenix.Controller + end + end + + def channel do + quote do + use Phoenix.Channel + import ArrowWeb.Gettext + end + end def controller do quote do @@ -26,12 +42,21 @@ defmodule ArrowWeb do import Plug.Conn import ArrowWeb.Gettext alias ArrowWeb.Router.Helpers, as: Routes + + unquote(verified_routes()) end end def html do quote do use Phoenix.Component + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + # Use all HTML functionality (forms, tags, etc) # Still needed for old style Phoenix HTML like , use Phoenix.HTML @@ -45,18 +70,28 @@ defmodule ArrowWeb do end end - def router do + defp html_helpers do quote do - use Phoenix.Router - import Plug.Conn - import Phoenix.Controller + # HTML escaping functionality + import Phoenix.HTML + # Core UI components and translation + import ArrowWeb.CoreComponents + import ArrowWeb.Gettext + + # Shortcut for generating JS commands + alias Phoenix.LiveView.JS + + # Routes generation with the ~p sigil + unquote(verified_routes()) end end - def channel do + def verified_routes do quote do - use Phoenix.Channel - import ArrowWeb.Gettext + use Phoenix.VerifiedRoutes, + endpoint: ArrowWeb.Endpoint, + router: ArrowWeb.Router, + statics: ArrowWeb.static_paths() end end From 91222d07eca15f98144398b5a5fdb336466b8a8a Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:38:05 -0400 Subject: [PATCH 03/25] chore: commit cosmetic npm lockfile change --- assets/package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/package-lock.json b/assets/package-lock.json index d0e88072..f1e39eb2 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -47,6 +47,7 @@ "version": "3.3.4" }, "../deps/react_phoenix": { + "name": "react-phoenix", "version": "1.3.1", "license": "MIT", "devDependencies": { From a7ee6f2be1c8bde0de038173e59738d75c656da1 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:03:53 -0400 Subject: [PATCH 04/25] feat: hook up phoenix 1.7 verified_routes to endpoint.ex --- lib/arrow_web/endpoint.ex | 2 +- test/support/conn_case.ex | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/arrow_web/endpoint.ex b/lib/arrow_web/endpoint.ex index 4aa8f3d9..c44969d6 100644 --- a/lib/arrow_web/endpoint.ex +++ b/lib/arrow_web/endpoint.ex @@ -18,7 +18,7 @@ defmodule ArrowWeb.Endpoint do at: "/", from: :arrow, gzip: false, - only: ~w(assets fonts images icons favicon.ico robots.txt) + only: ArrowWeb.static_paths() # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint. diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index dfc62568..a4585e99 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -20,13 +20,15 @@ defmodule ArrowWeb.ConnCase do using do quote do + # The default endpoint for testing + @endpoint ArrowWeb.Endpoint + + use ArrowWeb, :verified_routes + # Import conveniences for testing with connections import Plug.Conn import Phoenix.ConnTest alias ArrowWeb.Router.Helpers, as: Routes - - # The default endpoint for testing - @endpoint ArrowWeb.Endpoint end end From 0b47d5fa42d15e9a28ff3b1ad8005d6c79b0929f Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:37:16 -0400 Subject: [PATCH 05/25] fix: fix icons by adding to static path list --- lib/arrow_web.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/arrow_web.ex b/lib/arrow_web.ex index 24c9df9d..1af69e9a 100644 --- a/lib/arrow_web.ex +++ b/lib/arrow_web.ex @@ -18,7 +18,7 @@ defmodule ArrowWeb do below. Instead, define any helper function in modules and import those modules here. """ - def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + def static_paths, do: ~w(assets fonts images icons favicon.ico robots.txt) def router do quote do From 73f7d4acc7ccb65cd7c9b1169436971617738f54 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:53:09 -0400 Subject: [PATCH 06/25] feat: add tailwind css & hero icons for CoreComponents 1.7 --- assets/css/tailwind.css | 3 + assets/tailwind.config.js | 75 +++++++++++++++++++ config/config.exs | 14 +++- config/dev.exs | 17 ++++- .../controllers/feed_html/index.html.heex | 1 - .../controllers/layout_html/app.html.heex | 1 + mix.exs | 10 ++- mix.lock | 2 + 8 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 assets/css/tailwind.css create mode 100644 assets/tailwind.config.js diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css new file mode 100644 index 00000000..76fcadcc --- /dev/null +++ b/assets/css/tailwind.css @@ -0,0 +1,3 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js new file mode 100644 index 00000000..2a7f6cb3 --- /dev/null +++ b/assets/tailwind.config.js @@ -0,0 +1,75 @@ +// See the Tailwind configuration guide for advanced usage +// https://tailwindcss.com/docs/configuration + +const plugin = require("tailwindcss/plugin") +const fs = require("fs") +const path = require("path") + +module.exports = { + content: [ + "./js/**/*.js", + "../lib/arrow_web.ex", + "../lib/arrow_web/**/*.*ex" + ], + theme: { + extend: { + colors: { + brand: "#FD4F00", + } + }, + }, + plugins: [ + require("@tailwindcss/forms"), + // Allows prefixing tailwind classes with LiveView classes to add rules + // only when LiveView classes are applied, for example: + // + //
+ // + plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])), + plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])), + plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])), + plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])), + + // Embeds Heroicons (https://heroicons.com) into your app.css bundle + // See your `CoreComponents.icon/1` for more information. + // + plugin(function({matchComponents, theme}) { + let iconsDir = path.join(__dirname, "../deps/heroicons/optimized") + let values = {} + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"], + ["-micro", "/16/solid"] + ] + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { + let name = path.basename(file, ".svg") + suffix + values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + }) + }) + matchComponents({ + "hero": ({name, fullPath}) => { + let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") + let size = theme("spacing.6") + if (name.endsWith("-mini")) { + size = theme("spacing.5") + } else if (name.endsWith("-micro")) { + size = theme("spacing.4") + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + "mask": `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + "display": "inline-block", + "width": size, + "height": size + } + } + }, {values}) + }) + ] +} diff --git a/config/config.exs b/config/config.exs index cd07d2c0..3b968a1f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -58,6 +58,18 @@ config :esbuild, env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} ] +# Configure tailwind (the version is required) +config :tailwind, + version: "3.4.0", + arrow: [ + args: ~w( + --config=tailwind.config.js + --input=css/tailwind.css + --output=../priv/static/assets/tailwind.css + ), + cd: Path.expand("../assets", __DIR__) + ] + config :arrow, ArrowWeb.AuthManager, issuer: "arrow" config :ueberauth, Ueberauth, @@ -98,4 +110,4 @@ config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. -import_config "#{Mix.env()}.exs" +import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs index 56de819a..387350b9 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -23,7 +23,9 @@ config :arrow, ArrowWeb.Endpoint, secret_key_base: "local_secret_key_base_at_least_64_bytes_________________________________", watchers: [ esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, - node: ~w(assets/node_modules/.bin/tsc --project assets --noEmit --watch --preserveWatchOutput) + node: + ~w(assets/node_modules/.bin/tsc --project assets --noEmit --watch --preserveWatchOutput), + tailwind: {Tailwind, :install_and_run, [:arrow, ~w(--watch)]} ] config :arrow, ArrowWeb.AuthManager, secret_key: "test key" @@ -58,8 +60,7 @@ config :arrow, ArrowWeb.Endpoint, patterns: [ ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", ~r"priv/gettext/.*(po)$", - ~r"lib/arrow_web/{live,views}/.*(ex)$", - ~r"lib/arrow_web/templates/.*(eex)$" + ~r"lib/arrow_web/(controllers|live|components)/.*(ex|heex)$" ] ] @@ -70,6 +71,9 @@ config :ueberauth, Ueberauth, config :arrow, :redirect_http?, false +# Enable dev routes for dashboard and mailbox +config :arrow, dev_routes: true + # Do not include metadata nor timestamps in development logs config :logger, :console, format: "[$level] $message\n" @@ -79,3 +83,10 @@ config :phoenix, :stacktrace_depth, 20 # Initialize plugs at runtime for faster development compilation config :phoenix, :plug_init_mode, :runtime + +config :phoenix_live_view, + # Include HEEx debug annotations as HTML comments in rendered markup + debug_heex_annotations: true + +# Enable helpful, but potentially expensive runtime checks +# enable_expensive_runtime_checks: true diff --git a/lib/arrow_web/controllers/feed_html/index.html.heex b/lib/arrow_web/controllers/feed_html/index.html.heex index acb28086..a927a9cf 100644 --- a/lib/arrow_web/controllers/feed_html/index.html.heex +++ b/lib/arrow_web/controllers/feed_html/index.html.heex @@ -1,4 +1,3 @@ -

Feed

diff --git a/lib/arrow_web/controllers/layout_html/app.html.heex b/lib/arrow_web/controllers/layout_html/app.html.heex index 5b4cb10d..2fe485c4 100644 --- a/lib/arrow_web/controllers/layout_html/app.html.heex +++ b/lib/arrow_web/controllers/layout_html/app.html.heex @@ -12,6 +12,7 @@ Arrow + <%= tag :link, rel: "stylesheet", href: Routes.static_path(@conn, "/assets/tailwind.css") %> <%= tag :link, rel: "stylesheet", href: Routes.static_path(@conn, "/assets/app.css") %> diff --git a/mix.exs b/mix.exs index c5810ded..22b605e5 100644 --- a/mix.exs +++ b/mix.exs @@ -75,7 +75,15 @@ defmodule Arrow.MixProject do {:ueberauth_oidcc, "~> 0.4.0"}, {:ueberauth, "~> 0.10"}, {:wallaby, "~> 0.30.6", runtime: false, only: :test}, - {:sentry, "~> 8.0"} + {:sentry, "~> 8.0"}, + {:tailwind, "~> 0.2", runtime: Mix.env() == :dev}, + {:heroicons, + github: "tailwindlabs/heroicons", + tag: "v2.1.1", + sparse: "optimized", + app: false, + compile: false, + depth: 1} ] end diff --git a/mix.lock b/mix.lock index 582be2d1..fab1a604 100644 --- a/mix.lock +++ b/mix.lock @@ -24,6 +24,7 @@ "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"}, "guardian_phoenix": {:hex, :guardian_phoenix, "2.0.1", "89a817265af09a6ddf7cb1e77f17ffca90cea2db10ff888375ef34502b2731b1", [:mix], [{:guardian, "~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.3", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "21f439246715192b231f228680465d1ed5fbdf01555a4a3b17165532f5f9a08c"}, "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"}, "inflex": {:hex, :inflex, "1.10.0", "8366a7696e70e1813aca102e61274addf85d99f4a072b2f9c7984054ea1b9d29", [:mix], [], "hexpm", "7b5ccb9b720c26516f5962dc4565fc26f083ca107b0f6c167048506a125d2df3"}, @@ -54,6 +55,7 @@ "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"}, "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"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, + "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, "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, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, From 3eb2ada188054cf5a2c3f080fea416c3c73df882 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 18:04:40 -0400 Subject: [PATCH 07/25] fix: format tailwind.config.js with prettier --- assets/tailwind.config.js | 95 +++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js index 2a7f6cb3..51fd61cd 100644 --- a/assets/tailwind.config.js +++ b/assets/tailwind.config.js @@ -6,16 +6,12 @@ const fs = require("fs") const path = require("path") module.exports = { - content: [ - "./js/**/*.js", - "../lib/arrow_web.ex", - "../lib/arrow_web/**/*.*ex" - ], + content: ["./js/**/*.js", "../lib/arrow_web.ex", "../lib/arrow_web/**/*.*ex"], theme: { extend: { colors: { brand: "#FD4F00", - } + }, }, }, plugins: [ @@ -25,51 +21,74 @@ module.exports = { // //
// - plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])), - plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])), - plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])), - plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])), + plugin(({ addVariant }) => + addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"]) + ), + plugin(({ addVariant }) => + addVariant("phx-click-loading", [ + ".phx-click-loading&", + ".phx-click-loading &", + ]) + ), + plugin(({ addVariant }) => + addVariant("phx-submit-loading", [ + ".phx-submit-loading&", + ".phx-submit-loading &", + ]) + ), + plugin(({ addVariant }) => + addVariant("phx-change-loading", [ + ".phx-change-loading&", + ".phx-change-loading &", + ]) + ), // Embeds Heroicons (https://heroicons.com) into your app.css bundle // See your `CoreComponents.icon/1` for more information. // - plugin(function({matchComponents, theme}) { + plugin(function ({ matchComponents, theme }) { let iconsDir = path.join(__dirname, "../deps/heroicons/optimized") let values = {} let icons = [ ["", "/24/outline"], ["-solid", "/24/solid"], ["-mini", "/20/solid"], - ["-micro", "/16/solid"] + ["-micro", "/16/solid"], ] icons.forEach(([suffix, dir]) => { - fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { + fs.readdirSync(path.join(iconsDir, dir)).forEach((file) => { let name = path.basename(file, ".svg") + suffix - values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + values[name] = { name, fullPath: path.join(iconsDir, dir, file) } }) }) - matchComponents({ - "hero": ({name, fullPath}) => { - let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") - let size = theme("spacing.6") - if (name.endsWith("-mini")) { - size = theme("spacing.5") - } else if (name.endsWith("-micro")) { - size = theme("spacing.4") - } - return { - [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, - "-webkit-mask": `var(--hero-${name})`, - "mask": `var(--hero-${name})`, - "mask-repeat": "no-repeat", - "background-color": "currentColor", - "vertical-align": "middle", - "display": "inline-block", - "width": size, - "height": size - } - } - }, {values}) - }) - ] + matchComponents( + { + hero: ({ name, fullPath }) => { + let content = fs + .readFileSync(fullPath) + .toString() + .replace(/\r?\n|\r/g, "") + let size = theme("spacing.6") + if (name.endsWith("-mini")) { + size = theme("spacing.5") + } else if (name.endsWith("-micro")) { + size = theme("spacing.4") + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + mask: `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + display: "inline-block", + width: size, + height: size, + } + }, + }, + { values } + ) + }), + ], } From 3976c72e73c593ab02aabe3e518bc873e0c84ed8 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Fri, 7 Jun 2024 08:15:26 -0400 Subject: [PATCH 08/25] fix: add phx.digest output to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 61d6650f..cc0e5067 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,9 @@ npm-debug.log # Ignore assets that are produced by build tools. /priv/static/assets +# Ignore digested assets cache. +/priv/static/cache_manifest.json + # Code coverage from React tests /assets/coverage/ From 9bb6d02995f107d9ed146861debf3f2ddbe79bfe Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:21:02 -0400 Subject: [PATCH 09/25] fix: add tailwind to mix assets.build, assets.deploy --- mix.exs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 22b605e5..97516aa3 100644 --- a/mix.exs +++ b/mix.exs @@ -100,8 +100,9 @@ defmodule Arrow.MixProject do "ecto.reset": ["ecto.drop", "ecto.setup"], "ecto.rollback": ["ecto.rollback", "ecto.dump --quiet"], test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], - "assets.build": ["esbuild default --sourcemap=inline"], - "assets.deploy": ["esbuild default --minify", "phx.digest"], + "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], + "assets.build": ["tailwind default", "esbuild default --sourcemap=inline"], + "assets.deploy": ["esbuild default --minify", "tailwind default --minify", "phx.digest"], "test.integration": [ "assets.build", "ecto.create --quiet", From e07c97226e18cfadcd613b2ef2156676aac34855 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:31:52 -0400 Subject: [PATCH 10/25] fix: fix dev config name for watching tailwind changes --- config/config.exs | 2 +- config/dev.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.exs b/config/config.exs index 3b968a1f..07390a93 100644 --- a/config/config.exs +++ b/config/config.exs @@ -61,7 +61,7 @@ config :esbuild, # Configure tailwind (the version is required) config :tailwind, version: "3.4.0", - arrow: [ + default: [ args: ~w( --config=tailwind.config.js --input=css/tailwind.css diff --git a/config/dev.exs b/config/dev.exs index 387350b9..34102fe1 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -25,7 +25,7 @@ config :arrow, ArrowWeb.Endpoint, esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}, node: ~w(assets/node_modules/.bin/tsc --project assets --noEmit --watch --preserveWatchOutput), - tailwind: {Tailwind, :install_and_run, [:arrow, ~w(--watch)]} + tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]} ] config :arrow, ArrowWeb.AuthManager, secret_key: "test key" From 41e35df35a996e72e9de485e4a37053084e56e25 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:25:43 -0400 Subject: [PATCH 11/25] fix: have phoenix serve static files like images, fonts, icons --- {assets => priv/static}/fonts/Inter-Black.woff | Bin {assets => priv/static}/fonts/Inter-Bold.woff | Bin {assets => priv/static}/fonts/Inter-Medium.woff | Bin .../static}/fonts/Inter-Regular.woff | Bin .../about-eed0975ea5871e1732ad8ef93297c32e.txt | 6 ++++++ ...bout-eed0975ea5871e1732ad8ef93297c32e.txt.gz | Bin 0 -> 246 bytes priv/static/icons/about.txt.gz | Bin 0 -> 246 bytes ...192x192-2ece7b61582954dac85d742a9a993327.png | Bin 0 -> 13684 bytes ...512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png | Bin 0 -> 45985 bytes ...ch-icon-96718819aa0c472399f15bcd996fa37d.png | Bin 0 -> 12946 bytes ...t-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png | Bin 0 -> 259 bytes ...t-icons-f8c65969eed5f278a8c211b8f770c88e.png | Bin 0 -> 368 bytes ...n-16x16-879106ff1a0d3dd8df7dde421955ec7f.png | Bin 0 -> 671 bytes ...n-32x32-acf684893f4d6958b65054cb267c08af.png | Bin 0 -> 1513 bytes ...favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico | Bin 0 -> 15406 bytes ...053100cb84a50d2ae7f5492f7dd7f25e.webmanifest | 1 + ...e-small-5927f3a1356a24480390fc0a4fedb697.svg | 7 +++++++ ...mall-5927f3a1356a24480390fc0a4fedb697.svg.gz | Bin 0 -> 595 bytes priv/static/images/icon-blue-line-small.svg.gz | Bin 0 -> 595 bytes ...b-small-28f4efe18e70efad0c0154c08854b0d6.svg | 7 +++++++ ...mall-28f4efe18e70efad0c0154c08854b0d6.svg.gz | Bin 0 -> 560 bytes .../images/icon-green-line-b-small.svg.gz | Bin 0 -> 560 bytes ...c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg | 7 +++++++ ...mall-739dbf5cf8980e91871b4cd16f22e7f6.svg.gz | Bin 0 -> 573 bytes .../images/icon-green-line-c-small.svg.gz | Bin 0 -> 573 bytes ...d-small-aa2e6dc17c0eef5659e475a8cea91e7d.svg | 7 +++++++ ...mall-aa2e6dc17c0eef5659e475a8cea91e7d.svg.gz | Bin 0 -> 441 bytes .../images/icon-green-line-d-small.svg.gz | Bin 0 -> 441 bytes ...e-small-dede36b99b451faa097194789cb1eeb2.svg | 7 +++++++ ...mall-dede36b99b451faa097194789cb1eeb2.svg.gz | Bin 0 -> 226 bytes .../images/icon-green-line-e-small.svg.gz | Bin 0 -> 226 bytes ...e-small-ca0e3538d8db115aa6b9f5f028484cc5.svg | 1 + ...mall-ca0e3538d8db115aa6b9f5f028484cc5.svg.gz | Bin 0 -> 496 bytes priv/static/images/icon-green-line-small.svg.gz | Bin 0 -> 496 bytes ...e-small-995fa04733fbf96671e40d4700db4028.svg | 7 +++++++ ...mall-995fa04733fbf96671e40d4700db4028.svg.gz | Bin 0 -> 250 bytes .../images/icon-mattapan-line-small.svg.gz | Bin 0 -> 250 bytes ...s-small-24ec463ca1d98809a6ecd537f94139d7.svg | 1 + ...mall-24ec463ca1d98809a6ecd537f94139d7.svg.gz | Bin 0 -> 523 bytes priv/static/images/icon-mode-bus-small.svg.gz | Bin 0 -> 523 bytes ...l-small-4422f18823348d5a7377c5f156de893d.svg | 11 +++++++++++ ...mall-4422f18823348d5a7377c5f156de893d.svg.gz | Bin 0 -> 677 bytes .../images/icon-mode-commuter-rail-small.svg.gz | Bin 0 -> 677 bytes ...y-small-31860b63cda9ee17cb66f05339cb5fe8.svg | 1 + ...mall-31860b63cda9ee17cb66f05339cb5fe8.svg.gz | Bin 0 -> 385 bytes .../static/images/icon-mode-subway-small.svg.gz | Bin 0 -> 385 bytes ...e-small-04c308713f052f0db6c9765305366541.svg | 10 ++++++++++ ...mall-04c308713f052f0db6c9765305366541.svg.gz | Bin 0 -> 591 bytes .../static/images/icon-orange-line-small.svg.gz | Bin 0 -> 591 bytes ...e-small-3f542b6fae94745db7cc0ff530cb9390.svg | 10 ++++++++++ ...mall-3f542b6fae94745db7cc0ff530cb9390.svg.gz | Bin 0 -> 583 bytes priv/static/images/icon-red-line-small.svg.gz | Bin 0 -> 583 bytes ...e-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg | 1 + ...mall-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg.gz | Bin 0 -> 1173 bytes .../static/images/icon-silver-line-small.svg.gz | Bin 0 -> 1173 bytes .../logo-5c8510ba5230b9ab92430432aba36aa9.svg | 1 + ...logo-5c8510ba5230b9ab92430432aba36aa9.svg.gz | Bin 0 -> 207 bytes priv/static/images/logo.svg.gz | Bin 0 -> 207 bytes 58 files changed, 85 insertions(+) rename {assets => priv/static}/fonts/Inter-Black.woff (100%) rename {assets => priv/static}/fonts/Inter-Bold.woff (100%) rename {assets => priv/static}/fonts/Inter-Medium.woff (100%) rename {assets => priv/static}/fonts/Inter-Regular.woff (100%) create mode 100644 priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt create mode 100644 priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz create mode 100644 priv/static/icons/about.txt.gz create mode 100644 priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png create mode 100644 priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png create mode 100644 priv/static/icons/apple-touch-icon-96718819aa0c472399f15bcd996fa37d.png create mode 100644 priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png create mode 100644 priv/static/icons/edit-soft-icons-f8c65969eed5f278a8c211b8f770c88e.png create mode 100644 priv/static/icons/favicon-16x16-879106ff1a0d3dd8df7dde421955ec7f.png create mode 100644 priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png create mode 100644 priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico create mode 100644 priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest create mode 100644 priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg create mode 100644 priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg.gz create mode 100644 priv/static/images/icon-blue-line-small.svg.gz create mode 100644 priv/static/images/icon-green-line-b-small-28f4efe18e70efad0c0154c08854b0d6.svg create mode 100644 priv/static/images/icon-green-line-b-small-28f4efe18e70efad0c0154c08854b0d6.svg.gz create mode 100644 priv/static/images/icon-green-line-b-small.svg.gz create mode 100644 priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg create mode 100644 priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg.gz create mode 100644 priv/static/images/icon-green-line-c-small.svg.gz create mode 100644 priv/static/images/icon-green-line-d-small-aa2e6dc17c0eef5659e475a8cea91e7d.svg create mode 100644 priv/static/images/icon-green-line-d-small-aa2e6dc17c0eef5659e475a8cea91e7d.svg.gz create mode 100644 priv/static/images/icon-green-line-d-small.svg.gz create mode 100644 priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg create mode 100644 priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg.gz create mode 100644 priv/static/images/icon-green-line-e-small.svg.gz create mode 100644 priv/static/images/icon-green-line-small-ca0e3538d8db115aa6b9f5f028484cc5.svg create mode 100644 priv/static/images/icon-green-line-small-ca0e3538d8db115aa6b9f5f028484cc5.svg.gz create mode 100644 priv/static/images/icon-green-line-small.svg.gz create mode 100644 priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg create mode 100644 priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg.gz create mode 100644 priv/static/images/icon-mattapan-line-small.svg.gz create mode 100644 priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg create mode 100644 priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg.gz create mode 100644 priv/static/images/icon-mode-bus-small.svg.gz create mode 100644 priv/static/images/icon-mode-commuter-rail-small-4422f18823348d5a7377c5f156de893d.svg create mode 100644 priv/static/images/icon-mode-commuter-rail-small-4422f18823348d5a7377c5f156de893d.svg.gz create mode 100644 priv/static/images/icon-mode-commuter-rail-small.svg.gz create mode 100644 priv/static/images/icon-mode-subway-small-31860b63cda9ee17cb66f05339cb5fe8.svg create mode 100644 priv/static/images/icon-mode-subway-small-31860b63cda9ee17cb66f05339cb5fe8.svg.gz create mode 100644 priv/static/images/icon-mode-subway-small.svg.gz create mode 100644 priv/static/images/icon-orange-line-small-04c308713f052f0db6c9765305366541.svg create mode 100644 priv/static/images/icon-orange-line-small-04c308713f052f0db6c9765305366541.svg.gz create mode 100644 priv/static/images/icon-orange-line-small.svg.gz create mode 100644 priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg create mode 100644 priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg.gz create mode 100644 priv/static/images/icon-red-line-small.svg.gz create mode 100644 priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg create mode 100644 priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg.gz create mode 100644 priv/static/images/icon-silver-line-small.svg.gz create mode 100644 priv/static/images/logo-5c8510ba5230b9ab92430432aba36aa9.svg create mode 100644 priv/static/images/logo-5c8510ba5230b9ab92430432aba36aa9.svg.gz create mode 100644 priv/static/images/logo.svg.gz diff --git a/assets/fonts/Inter-Black.woff b/priv/static/fonts/Inter-Black.woff similarity index 100% rename from assets/fonts/Inter-Black.woff rename to priv/static/fonts/Inter-Black.woff diff --git a/assets/fonts/Inter-Bold.woff b/priv/static/fonts/Inter-Bold.woff similarity index 100% rename from assets/fonts/Inter-Bold.woff rename to priv/static/fonts/Inter-Bold.woff diff --git a/assets/fonts/Inter-Medium.woff b/priv/static/fonts/Inter-Medium.woff similarity index 100% rename from assets/fonts/Inter-Medium.woff rename to priv/static/fonts/Inter-Medium.woff diff --git a/assets/fonts/Inter-Regular.woff b/priv/static/fonts/Inter-Regular.woff similarity index 100% rename from assets/fonts/Inter-Regular.woff rename to priv/static/fonts/Inter-Regular.woff diff --git a/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt b/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt new file mode 100644 index 00000000..9b12b75a --- /dev/null +++ b/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following graphics from Twitter Twemoji: + +- Graphics Title: 1f3f9.svg +- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) +- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f3f9.svg +- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz b/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..98b98a26dd28141d2993d32ec5a8d5fef86a2073 GIT binary patch literal 246 zcmVfBr(vM=(gn6tM3*g0BeW~3 zdd}64^o4a%Y~k&uXi*1W!>)hoUrJfR{q8VpB(9;M>C70S!oJ#9w|kH9o*dY80?O$O z8BH0xS&0Q6qUt2IF#$EsUFm2vdiCY{!?C%K`k# w5uHzx?>5c$^%I`U>X*#1w~C9;86zbriGvxgdNJMEWU<*4-=?Lo&Uyg=0FK&#I{*Lx literal 0 HcmV?d00001 diff --git a/priv/static/icons/about.txt.gz b/priv/static/icons/about.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..98b98a26dd28141d2993d32ec5a8d5fef86a2073 GIT binary patch literal 246 zcmVfBr(vM=(gn6tM3*g0BeW~3 zdd}64^o4a%Y~k&uXi*1W!>)hoUrJfR{q8VpB(9;M>C70S!oJ#9w|kH9o*dY80?O$O z8BH0xS&0Q6qUt2IF#$EsUFm2vdiCY{!?C%K`k# w5uHzx?>5c$^%I`U>X*#1w~C9;86zbriGvxgdNJMEWU<*4-=?Lo&Uyg=0FK&#I{*Lx literal 0 HcmV?d00001 diff --git a/priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png b/priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png new file mode 100644 index 0000000000000000000000000000000000000000..0332d397d8e5953f2998309f0115b69cb8b72da0 GIT binary patch literal 13684 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 literal 0 HcmV?d00001 diff --git a/priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png b/priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4f2f0572348d4f02df4e9e3791a9d31ed16eb8 GIT binary patch literal 45985 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 literal 0 HcmV?d00001 diff --git a/priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png b/priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png new file mode 100644 index 0000000000000000000000000000000000000000..f24732246424e440071f209cdcb6e23dd6dc7bf8 GIT binary patch literal 259 zcmV+e0sQ`nP)F%p)*x=atTw!I=!|gcwNyP8 zoR{mwfjCwo>mW$=07$e6FIPX<9n1WH=@qxiv6D|A4Dp*i^ey-}EVe~uK8v&Z<;G9^ z1%E+8AhwNB%6}a&-2!5nX#q-bCtZwu7LA#G-9|)Mw9=%B?_ibS3lOuRVGyhgrl!43#3nYBghBcZh{@DV*n}90G$ie9 zNof74-g{nyxN>u~xvh8nojlL)yg3JHW0Y;neLNxWXP0iK6LgfKlHQ?yk*B!4PNPr+ zAh5tLJyAP3{dQH~c!($XIKK)YP>Rah9%4Jh_D!^&ZddZSk%g8^JC2kRo01=%mfP_; z`79Kretjo5BeP;9w?s8;(L_X=HCw3+wWFLH>HWRL4pz}ZT^NG{pleN5P=aN8VF2~= z%5(M@BN_%>1HkyR+00No%=wP`CdUY`%y=^I4U|xB0Y_2`ZnIyYgtEC!wGH@J&>;+9 zh~rR6?{)+OXoaaI`T3R}cw&@@x!4j0(EkJbU!hIdCkPEi2`A?R!vJ5>@apUJsE8*3 O0000Px%SxH1eR5(wS(_ctaQ5*;G-|yTz=bu~;Tgsf8HJn;Qs)ry0l_Jy7O`rS!=ZRIvsofxp%o;~``tF2ddcEg^&0m}H75rJNd19RQYEr`^bsZ#ce z0kTcc!OxFFH}Vdjpz9shrhSInZ}Jw(LUF)r(cPyM)Ri`uK@6Y(I8jjeKrP$f8s$(` zyf6{`J<8L~`bLft_gVXB_;0`YOX=yW2R=>?ApkGz{Rst(61b2{I2Zr`002ovPDHLk FV1hvJICB61 literal 0 HcmV?d00001 diff --git a/priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png b/priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2aafe4abf3d7584603a0bcb609a5f86476c52d GIT binary patch literal 1513 zcmVPx)qe(}3w!Tr?!po>kawx^ z{E5BVZ%eo+>ImJty%^KmBRlT7*ZXPVAE z3=8FaXN!?^y5k*!F+fL}C4MFSrD?VQ2jpz=dczRYI}UZP5{oH}WZe@wJ*r84BQL-B zG{8|ky$tZ{?Sre=|2(KL7MN2^r@9J$G&N4|5Ci=0DcoC#=AICGokUKdFiBwH#l+r1 z5q(&2kYI!c$3AJUKX&{S1H%A>0BDw-%7_*~LGcPOXY>sYM0jX0h_TzikuOI_QZeItiO-D5(6 zinvy*%$T|*!+9vMIfIEm0MM(mfCMx$<2V6TOnebc^$>hVKqw3tSXO*PM#g5<9Xqy# zLG?uV#+YNfr0(ScsIPfD_EZxid0e#Vf`e*yst7ff;BZU>jH|2)yBS zIJ%&qEnA%+>CEP=ny5E22X*|+4Zz0jdxoaYoc5c#pt$&~A!HzS0wUgdz8a3bUjwqU zMGD+v#wvrpDSJ%z-dh@v;K6|Q8}W=8QhBISXqY<3q#HCGZUo8B{c^K3_t`JMzpOE^ zdzoi|a&z)hCjJEB8P2n-yI$zv;)f05^Vq_x&VyZ z5E!nuj9QqX5u(72=r|`HkPS}&N#_9!Yy~VaT5T)bn|DO0b3$V#v;oxdYL_0ds}oM` zb1z-ffR3$JRmDBrbHam~&<6O?JUzro%C**CY&GWE(mG3RH!`6Oa3D2#uukINThgyg zGFo>Z?CNYiL}&w)n5RVx(w$Uid%*P`{tpm zG}$Bd0rne;tUKbE_59|jd6_Nk-R^3;8>;V>rzIE}q7)3X(Q3={1mH%548TqZ5pOts z6cHCJ5W=AjG&tGU(L*#W?iqe3mr@|No3#IgDX}EJAei=o_*G+0;kTXw)b(edO0e8} zfA$8)W251Htqhmn%f!tK3WOf;>*qu-KVCa_U)`ck0cGao6cFzaM6;gB*|n`ZfSR}o zYl3E`dlHyB(G6L%d=usa-IB;7o{K;8eoBPg{bS%|TLh~|#Z z+4WU-02iMdy(GZ&>++wr`a}2Tr|4rG3w`AYcz>P;a<)9wxb8AQUgU}WmJT(Ll*Pa@ zDEzK5uW)^L0JW3GObU#z+E={N54|V={Xfe>b6kuI;j=bRf$S8m`_}h%IwRWv>T|pE z()EjqB8LbeH3+@*S9btVK%osA!w#&0AxsyJ(BMGW7tVJfbT#KE`h2+JmXJyE>gin- zUb(yR{v$|BJVcXYqN*B@bizUo7ba(nsW$+7X1Oa8SD z%hD3-0177Hqw%@6mE8q!KBNk3$m+)Gz6%G12DcnK%cCAWSyI_0K>fQUSpNrr#wJ;Q ze9Fe6i`@mZevfRvQ5&Ko`kP(FuF&YgRr`*12`HVPI7J95Vg;`m^K3i*WAL`GpNpBC z3t)N=Z~LJB6%}{81RPFJ3~zF<|HMtZtN*Xyt^G#T!zOq~pDMl6*}i`R*NwH(1+l4u P00000NkvXXu0mjfiB`*z literal 0 HcmV?d00001 diff --git a/priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico b/priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico new file mode 100644 index 0000000000000000000000000000000000000000..51d064ff33a0f4d54474b50ef8af09205f52b475 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest b/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest new file mode 100644 index 00000000..45dc8a20 --- /dev/null +++ b/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg b/priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg new file mode 100644 index 00000000..e17356c1 --- /dev/null +++ b/priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg @@ -0,0 +1,7 @@ + + + blue line + + + + diff --git a/priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg.gz b/priv/static/images/icon-blue-line-small-5927f3a1356a24480390fc0a4fedb697.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..06d27318b60af43188d90fcc8631a062908808d0 GIT binary patch literal 595 zcmV-Z0<8TXiwFP!000006Kzz>ZW}QSyyq(x+w;oeQ&eH+&_8hzyEb4aLE_p$zP=;x zBRO;*oCP?dI3%^}_v@eT<9vF4-}Hye<@M)kb-UftP14KTpB3kvS77wr+skRU>5pf8 zUXQ!mua}QapS#?VV-w?CdvoBl`6 z^0c+Sd)oBp=<+tYXp!;8bm#j$#1Q@JKLPgp{kYnaYBldPv28WED@!-yJ>4$VQc|w! z+;Jizrv)cMF=tPbYd{+Ua?u4Ribhzn!iKe()P2E;Kt+U81XIOYS0P()qzp*07^SM# zT;bJX!I@H=tR$yer1>)Y7mgfCS=1r1hBiexvc!T@HlieL6V4pkoL=Y)mwY%&NfkM_ zu$Al^&K#>^mb{=wSdThQcJ_x+M(t3Z(n$(2tqaba8dNnAI~@i|E^2%oO0v&0a-fXe z1ftA+ONjz~nqVA)R9H)ZnJc1{D(KbS&VCMY_&qp0MUnQ-1JoL?IwY0sSe6BX?{*=u zF%tlyTGv6lw`ateB+lkTA|Z?wCscQ`GeOx1Ib`ut4+AAr6~7WjONl?vV;Yc2NOH^2 zVx@%`angYa6-Ep#d@q5>WG6q0Tp$GlVigs@R5!C!0X-_vfgSr}rZW}QSyyq(x+w;oeQ&eH+&_8hzyEb4aLE_p$zP=;x zBRO;*oCP?dI3%^}_v@eT<9vF4-}Hye<@M)kb-UftP14KTpB3kvS77wr+skRU>5pf8 zUXQ!mua}QapS#?VV-w?CdvoBl`6 z^0c+Sd)oBp=<+tYXp!;8bm#j$#1Q@JKLPgp{kYnaYBldPv28WED@!-yJ>4$VQc|w! z+;Jizrv)cMF=tPbYd{+Ua?u4Ribhzn!iKe()P2E;Kt+U81XIOYS0P()qzp*07^SM# zT;bJX!I@H=tR$yer1>)Y7mgfCS=1r1hBiexvc!T@HlieL6V4pkoL=Y)mwY%&NfkM_ zu$Al^&K#>^mb{=wSdThQcJ_x+M(t3Z(n$(2tqaba8dNnAI~@i|E^2%oO0v&0a-fXe z1ftA+ONjz~nqVA)R9H)ZnJc1{D(KbS&VCMY_&qp0MUnQ-1JoL?IwY0sSe6BX?{*=u zF%tlyTGv6lw`ateB+lkTA|Z?wCscQ`GeOx1Ib`ut4+AAr6~7WjONl?vV;Yc2NOH^2 zVx@%`angYa6-Ep#d@q5>WG6q0Tp$GlVigs@R5!C!0X-_vfgSr}r + + green line B + + + + diff --git a/priv/static/images/icon-green-line-b-small-28f4efe18e70efad0c0154c08854b0d6.svg.gz b/priv/static/images/icon-green-line-b-small-28f4efe18e70efad0c0154c08854b0d6.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..c6482b1c98081f4415d750ac137388bb603f0d19 GIT binary patch literal 560 zcmV-00?+*)iwFP!000006KzyoZ|X1%ec!K$dY>EY*iP&T_OO3~G#E&*O$@=rufI;) zWcT5=G^dqM?BkEH{=U73pY!SCdovua*RSW*>VCh+JH^k-`zisz${9nre4cij;du7f z+i`b){ruSs5FlXo-|+Gj{90d+*VAr(uh;u!xBCdE9iUC z04USj5Z*S!Sp#e}Xm#$7E;mf~sG|<6|2Ww1_si}m226ps63LV-G@RrHjG!VVB4EOh z+?JMgwnwK5MIvB!vQw2hE)?OEFlGc{-wV0eFD?|cBp8irzyj#u8_t9=CKa3HfTl8S z2mHmxQkIlr&gdz*4M!a&I*VC{a9LfWx23W_@cGO~lG?4N=+7gF$Xb^&7KS(0&wWc#J zS$J17x(k7&gJ#@u;dlW`av@oxPn9P$t<9ROkb59Bu4CvyQ9CXibS>_|XNFR>p?A4s y%Z4(#A1zi-eLZKTbZi`xT&tETPYJt7DK{T9%a3|+*Y)q@<>@cfJ$1Er1ONbq?+aD{ literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-green-line-b-small.svg.gz b/priv/static/images/icon-green-line-b-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..c6482b1c98081f4415d750ac137388bb603f0d19 GIT binary patch literal 560 zcmV-00?+*)iwFP!000006KzyoZ|X1%ec!K$dY>EY*iP&T_OO3~G#E&*O$@=rufI;) zWcT5=G^dqM?BkEH{=U73pY!SCdovua*RSW*>VCh+JH^k-`zisz${9nre4cij;du7f z+i`b){ruSs5FlXo-|+Gj{90d+*VAr(uh;u!xBCdE9iUC z04USj5Z*S!Sp#e}Xm#$7E;mf~sG|<6|2Ww1_si}m226ps63LV-G@RrHjG!VVB4EOh z+?JMgwnwK5MIvB!vQw2hE)?OEFlGc{-wV0eFD?|cBp8irzyj#u8_t9=CKa3HfTl8S z2mHmxQkIlr&gdz*4M!a&I*VC{a9LfWx23W_@cGO~lG?4N=+7gF$Xb^&7KS(0&wWc#J zS$J17x(k7&gJ#@u;dlW`av@oxPn9P$t<9ROkb59Bu4CvyQ9CXibS>_|XNFR>p?A4s y%Z4(#A1zi-eLZKTbZi`xT&tETPYJt7DK{T9%a3|+*Y)q@<>@cfJ$1Er1ONbq?+aD{ literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg b/priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg new file mode 100644 index 00000000..0ede7c8f --- /dev/null +++ b/priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg @@ -0,0 +1,7 @@ + + + green line C + + + + diff --git a/priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg.gz b/priv/static/images/icon-green-line-c-small-739dbf5cf8980e91871b4cd16f22e7f6.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..cb4787cf5bdd86cb36744d83958f8bf27456b739 GIT binary patch literal 573 zcmV-D0>b?tiwFP!000006Kzz>ZW}QSyyq)~?b)(OiXs)*IkaD5AbtVP1Bnp_{rZxt zmD~c|wKZ#VM9xssZa%+`;rr$C`njD>*X#S^dVRay;*H|l$8n7*rL{4p@bPxpZ>RH% zJ${|{x1Vp{+bM+az=Z-45>Ym)aZ?X4<=pAOi=7rGlEUWX>&0m6mZZ zzzWOC7gRluKvftxBwOFuOR@smau;BPft_XMQM@QCibX|m-W&}Z>rSd^7OVt>0~gY$ zr*_6>#gIER%3U}Yc2in>!*uMV?jKTdSK6pd_bfFNSuU4=oB;-QMoI$MHi9jbrJqkk z!y%Wz|3cJxwQH#Z7YY@seilKboL0V(gzT7;NcElBaGak?*{m_z8T##Sj*Y+1o*w=H L9LBFz_yhm|b?tiwFP!000006Kzz>ZW}QSyyq)~?b)(OiXs)*IkaD5AbtVP1Bnp_{rZxt zmD~c|wKZ#VM9xssZa%+`;rr$C`njD>*X#S^dVRay;*H|l$8n7*rL{4p@bPxpZ>RH% zJ${|{x1Vp{+bM+az=Z-45>Ym)aZ?X4<=pAOi=7rGlEUWX>&0m6mZZ zzzWOC7gRluKvftxBwOFuOR@smau;BPft_XMQM@QCibX|m-W&}Z>rSd^7OVt>0~gY$ zr*_6>#gIER%3U}Yc2in>!*uMV?jKTdSK6pd_bfFNSuU4=oB;-QMoI$MHi9jbrJqkk z!y%Wz|3cJxwQH#Z7YY@seilKboL0V(gzT7;NcElBaGak?*{m_z8T##Sj*Y+1o*w=H L9LBFz_yhm| + + green line D + + + + diff --git a/priv/static/images/icon-green-line-d-small-aa2e6dc17c0eef5659e475a8cea91e7d.svg.gz b/priv/static/images/icon-green-line-d-small-aa2e6dc17c0eef5659e475a8cea91e7d.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..3110684f0a5fb0f17c3670adc38c54b7f675624e GIT binary patch literal 441 zcmV;q0Y?5GiwFP!000006K#`8ZsRZzMfW)cp4P+GqD~m>7#6aW$knO+`tRScF zqBW!!t?5gs#~Qw*-RI-zzAnS{vujS{`0?7d(=>&N!tH)+F~-;$(YX6<=)2~8vD?SF zpMKxIx+c2lAluQry*S%;<9QtV`Mz$)d*5H(aK85L&kVHx5WA24cyfpHFm%nY7?tV0 zaqnGoQ5W~>v?jMxmpwjruU?z>KM4+p!@OETiABiqo {#Jdq>mV?df&n=jMHXX* zO;-jIQwl;QXNz&<J|HsHY8i-?Xwe=qvuc=ZH`SBCX*CzE@>899GM6=T@Yr?;Dd02>OHEEZn`j#HPwMI zay2!xxw`4{6$AhUF)9{JWK}>}e{`itGqN`uSf8%~EW;uzA^>O|B?8H|UP%}?U7%Wq jqWGG<;K`oNtw*xapx}4?9C!66d3*T_vA@#9O#=V`HuBIq literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-green-line-d-small.svg.gz b/priv/static/images/icon-green-line-d-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..3110684f0a5fb0f17c3670adc38c54b7f675624e GIT binary patch literal 441 zcmV;q0Y?5GiwFP!000006K#`8ZsRZzMfW)cp4P+GqD~m>7#6aW$knO+`tRScF zqBW!!t?5gs#~Qw*-RI-zzAnS{vujS{`0?7d(=>&N!tH)+F~-;$(YX6<=)2~8vD?SF zpMKxIx+c2lAluQry*S%;<9QtV`Mz$)d*5H(aK85L&kVHx5WA24cyfpHFm%nY7?tV0 zaqnGoQ5W~>v?jMxmpwjruU?z>KM4+p!@OETiABiqo {#Jdq>mV?df&n=jMHXX* zO;-jIQwl;QXNz&<J|HsHY8i-?Xwe=qvuc=ZH`SBCX*CzE@>899GM6=T@Yr?;Dd02>OHEEZn`j#HPwMI zay2!xxw`4{6$AhUF)9{JWK}>}e{`itGqN`uSf8%~EW;uzA^>O|B?8H|UP%}?U7%Wq jqWGG<;K`oNtw*xapx}4?9C!66d3*T_vA@#9O#=V`HuBIq literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg b/priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg new file mode 100644 index 00000000..e85d5575 --- /dev/null +++ b/priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg @@ -0,0 +1,7 @@ + + + green line E + + + + diff --git a/priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg.gz b/priv/static/images/icon-green-line-e-small-dede36b99b451faa097194789cb1eeb2.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..e69fe318b857172858cbc235cf4e23dde8e44619 GIT binary patch literal 226 zcmV<803H7yiwFP!000006Kzo2YQr!LeeYKY@7cB-yS6&wJ`DCDg*tJ-NlI$s(yy=6 zjIoF50y@&s5vaYdJv_!V-93vr-#(=*rHG=%y!5g`L|GXOmN^B_hOw6G5X#s5@C*S# z*&6J8fNE_XateFBS-*rZK^mq2-#bD6VYIhPj?fJ$dG>)wMqe3RJsSz|LO`2%P5N)wMqe3RJsSz|LO`2%P5N \ No newline at end of file diff --git a/priv/static/images/icon-green-line-small-ca0e3538d8db115aa6b9f5f028484cc5.svg.gz b/priv/static/images/icon-green-line-small-ca0e3538d8db115aa6b9f5f028484cc5.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..248732c8022f902ebb59859898052ecb419c8044 GIT binary patch literal 496 zcmV+XBd7N&K$H&iQc|M=$&^2lq&f&4UHhC@!=^_t+gOG<~_Iu@8FO(5!aL4xR1#6q-Cq+W{LmJKk5Z>#xbd z9iT*%T+9q4;xMkRL?%_GCl=9R55{UGh+0a%nZyiow!JYKy{a*@>5mmCH@mqyxI-;$ z8VRs5%6;2OumVD^W-Y+Q!D%r%=afwuCoA&+r-_8DdZp#1O5dDA;2JG4Th25Uht7A} zBH7NQ!s;;SezFBLMG4hm(3>tUEfs1#=rGvtk3tZK&RVIhq*P_ICuWBc%(Y(|DUCC7E)JOon+dHlCtVNK>ri8MDzI%IaH7>c-e{I_K@xnGdiCe2CkTqLP mDBBfWnO3w8&v=`&wa+@Y4pP~|m#h6Y^QZruL60*p1ONaDc<*-r literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-green-line-small.svg.gz b/priv/static/images/icon-green-line-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..248732c8022f902ebb59859898052ecb419c8044 GIT binary patch literal 496 zcmV+XBd7N&K$H&iQc|M=$&^2lq&f&4UHhC@!=^_t+gOG<~_Iu@8FO(5!aL4xR1#6q-Cq+W{LmJKk5Z>#xbd z9iT*%T+9q4;xMkRL?%_GCl=9R55{UGh+0a%nZyiow!JYKy{a*@>5mmCH@mqyxI-;$ z8VRs5%6;2OumVD^W-Y+Q!D%r%=afwuCoA&+r-_8DdZp#1O5dDA;2JG4Th25Uht7A} zBH7NQ!s;;SezFBLMG4hm(3>tUEfs1#=rGvtk3tZK&RVIhq*P_ICuWBc%(Y(|DUCC7E)JOon+dHlCtVNK>ri8MDzI%IaH7>c-e{I_K@xnGdiCe2CkTqLP mDBBfWnO3w8&v=`&wa+@Y4pP~|m#h6Y^QZruL60*p1ONaDc<*-r literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg b/priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg new file mode 100644 index 00000000..fe749636 --- /dev/null +++ b/priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg @@ -0,0 +1,7 @@ + + + mattapan line + + + + diff --git a/priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg.gz b/priv/static/images/icon-mattapan-line-small-995fa04733fbf96671e40d4700db4028.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..e17710f732bc0044d2e57c8c4c0ed279967b0f35 GIT binary patch literal 250 zcmV6`Uydei~| zfoyu>e1a5J>|t2&$6OcyU1;lQ7|KFDUvn^e1w>+PI0a;%UAanr$04t$& A;s5{u literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-mattapan-line-small.svg.gz b/priv/static/images/icon-mattapan-line-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..e17710f732bc0044d2e57c8c4c0ed279967b0f35 GIT binary patch literal 250 zcmV6`Uydei~| zfoyu>e1a5J>|t2&$6OcyU1;lQ7|KFDUvn^e1w>+PI0a;%UAanr$04t$& A;s5{u literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg b/priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg new file mode 100644 index 00000000..d724649b --- /dev/null +++ b/priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg.gz b/priv/static/images/icon-mode-bus-small-24ec463ca1d98809a6ecd537f94139d7.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..4fc0063c34ba060d9603b51c59482aa92a7ccf9b GIT binary patch literal 523 zcmV+m0`&bKiwFP!000006TMX1Zrd;n{T0D`79*0nacKImKQXeVE|9Fn5;#S^en+y? zWX}TzC&!FP9v+HPo=)?to8Mk8Ki)sLLvX=y#%FM!$HTAFc9_oRkMEn!<#M5m();h% zjf4<3$QquXKF0Iper|_jrJ&JV7-2+q3x@vq>Xrx0_*P#Bw|_evw!^pmeph5SY#xYM zC?zP!WO#duYT}i|O5J&4j^-&@EWnUqS7q@`q1J{a#?i=PO>TXy8idTWB}sR1y}j=K zTHr;E1QL>{;>n6K#m_*+W#eDUxP= z5Li0=M}fJ+gTTM_QHheSM~|>5hLM|Ef@(>j>_||erD@>|!eEO9Up?Viv5_1cw zvBN`%_K*W;6VaTerqAAH8zFeW{#duh* zM{H?Ms92Jwk*Z*Z4SHmcMc-&QCv=4i#T`~}ce=%SJz}Dq(9%D#eBFQE@r!7?|LyXrx0_*P#Bw|_evw!^pmeph5SY#xYM zC?zP!WO#duYT}i|O5J&4j^-&@EWnUqS7q@`q1J{a#?i=PO>TXy8idTWB}sR1y}j=K zTHr;E1QL>{;>n6K#m_*+W#eDUxP= z5Li0=M}fJ+gTTM_QHheSM~|>5hLM|Ef@(>j>_||erD@>|!eEO9Up?Viv5_1cw zvBN`%_K*W;6VaTerqAAH8zFeW{#duh* zM{H?Ms92Jwk*Z*Z4SHmcMc-&QCv=4i#T`~}ce=%SJz}Dq(9%D#eBFQE@r!7?|Ly + + commuter rail + + + + + + + + diff --git a/priv/static/images/icon-mode-commuter-rail-small-4422f18823348d5a7377c5f156de893d.svg.gz b/priv/static/images/icon-mode-commuter-rail-small-4422f18823348d5a7377c5f156de893d.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..991f6d1c8bade415713e69eb408eea16d9a03f41 GIT binary patch literal 677 zcmV;W0$TkaiwFP!000006NOaUZrd;neeYKY-plr2Mx<`kkn~}HVsuFzz;24vONxH| zj;z?}1`Km#N|p|(b4V%Mx68A6ABUH>UDHp~>-Wv(dcD%s(dqoW5o_%Rh{l{x!+zHs zM+`5={q@J`eb-oH4M()*@xkEPPRD83*Kv8CPUHA%+Mmt2I}R1G`2^X%c2jQ-$6?qt zU(`y9PmTGxYsN^N4KroVS$jv(UAS*c|IwJ~+`YUVPUjK8ZaN>|zf#UXdas78w=6lC zb{&0M4AyJJl4BP4t=asCg&Nx_Sz$?L>FxY$6UC4;7`Eh6G>MYBkk`JV0*Nv}OOF^< zZx(sOE5*CzP@}Dco)q(^} zRn1)OqJ>;bF;dD-xY~K1=R{#?KrXq(HW}`mQ?7P(kJuicVo@%&@jkc#ga8NvUN#1& zYrpt=Wc3LliVmg_z(+_tdBvI#7yg)>MWS86M8U+0YPEN|I3W-h=Jzg-A@2hDB||nR zHcNlYkVhOpAS{G|LGq}J`W_Q*01-sUeV~93b|iw6K-Q5};sUbaW279w*>#j0+RUc# zNv@q|aHLYTH>wr)F=99Gjf3*}bcca_$+-4~z%cI;p`3!wSoUoOsskyXxY{Kmwvr+O zHI#w~E^xIAq9pZ#ZHs$GnrC~@U2$)Ve+dMPOF^q$F;bSm1X_?HiKqgI%Bpw%LUSND z+huDlH57OvNdjZJGSq5UhO36QiokW%YFC+6L?P&-x@zwP7ZFl5_z--xcSv4Dh>4W- z&zk+aWbINjYvxl{j-&LR7&Xg9+;V&Wx~Yijaj5%piONk%Ey}opx0~n3hi&UDHp~>-Wv(dcD%s(dqoW5o_%Rh{l{x!+zHs zM+`5={q@J`eb-oH4M()*@xkEPPRD83*Kv8CPUHA%+Mmt2I}R1G`2^X%c2jQ-$6?qt zU(`y9PmTGxYsN^N4KroVS$jv(UAS*c|IwJ~+`YUVPUjK8ZaN>|zf#UXdas78w=6lC zb{&0M4AyJJl4BP4t=asCg&Nx_Sz$?L>FxY$6UC4;7`Eh6G>MYBkk`JV0*Nv}OOF^< zZx(sOE5*CzP@}Dco)q(^} zRn1)OqJ>;bF;dD-xY~K1=R{#?KrXq(HW}`mQ?7P(kJuicVo@%&@jkc#ga8NvUN#1& zYrpt=Wc3LliVmg_z(+_tdBvI#7yg)>MWS86M8U+0YPEN|I3W-h=Jzg-A@2hDB||nR zHcNlYkVhOpAS{G|LGq}J`W_Q*01-sUeV~93b|iw6K-Q5};sUbaW279w*>#j0+RUc# zNv@q|aHLYTH>wr)F=99Gjf3*}bcca_$+-4~z%cI;p`3!wSoUoOsskyXxY{Kmwvr+O zHI#w~E^xIAq9pZ#ZHs$GnrC~@U2$)Ve+dMPOF^q$F;bSm1X_?HiKqgI%Bpw%LUSND z+huDlH57OvNdjZJGSq5UhO36QiokW%YFC+6L?P&-x@zwP7ZFl5_z--xcSv4Dh>4W- z&zk+aWbINjYvxl{j-&LR7&Xg9+;V&Wx~Yijaj5%piONk%Ey}opx0~n3hi& \ No newline at end of file diff --git a/priv/static/images/icon-mode-subway-small-31860b63cda9ee17cb66f05339cb5fe8.svg.gz b/priv/static/images/icon-mode-subway-small-31860b63cda9ee17cb66f05339cb5fe8.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..7527dd82d90042c3d34437ed4e448dc1cfbef35f GIT binary patch literal 385 zcmV-{0e=1;iwFP!000006Kzu4Zi6rk{gsG4$HYkpW-5KypD=BZN_4H(3aWnn9EZ^| zO*jrY=lG(;yUR4F>F_zfoo;Pmlu;Pi3Uxb_1D6KK3}bKDYJmKtD`>FeN{*abwxwe}`Q%(= z5jqixy245n)#a2?b&+j2wvr!$bTd@*vmA01%D@3tY0w6TR!Z7wU9 z!c=+~Yf0SWt}R<+x(Q5U@Zz56v?fmeAHUFXiT;y3=iWXe0XFN9kQcYgDG$nac(Qpf f?$H;64M*4@?t#-fI_1EN$9?|;3@F_zfoo;Pmlu;Pi3Uxb_1D6KK3}bKDYJmKtD`>FeN{*abwxwe}`Q%(= z5jqixy245n)#a2?b&+j2wvr!$bTd@*vmA01%D@3tY0w6TR!Z7wU9 z!c=+~Yf0SWt}R<+x(Q5U@Zz56v?fmeAHUFXiT;y3=iWXe0XFN9kQcYgDG$nac(Qpf f?$H;64M*4@?t#-fI_1EN$9?|;3@ + + orange line + + + + + + + diff --git a/priv/static/images/icon-orange-line-small-04c308713f052f0db6c9765305366541.svg.gz b/priv/static/images/icon-orange-line-small-04c308713f052f0db6c9765305366541.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..c0eeac697c7648564360cba8d1a4bfa83035845b GIT binary patch literal 591 zcmV-V0n!3KYq^h^Z8UytFE{G3|i}%8I!nOPs@5bp8581 zT%NzKU+YN=EsW>yw0RT!S>2EK(^Br!=X%>-_KP?jFH4EfFND>{_I?n%<4KZ~xxycGFNTiBl${$dEqC$2r zl#c+?s8lI&$b{&jW8oNObR?3BwB?Wo?XY8`AZd(JK{O_&paB{W#PuBi@ z^By5;76oNFf7mjHfI&1YyQ!@8Rs~PFWdW=;9V^3Yo+bvJ2xMJ7YcO(tRFk?Gj8gRJSbw-w9A_wC{LUlkf&C#K7@@Fjpg+Mg&c&A zja0=rQ!<)HS)mb%Uk6x94#stClvXnpigwU(P;6%eM%!`d*eb&of$I5cv$*6cT_oRe zREyEnV!2ynO@rREM93}sZf~c*-bDPs21k$<4YYqaF2XuE@cKr+c^KYNr{h67rG1R} dkU<$w-t>H{dB1sErFZe>?GNYS*HW|v008YABFX>& literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-orange-line-small.svg.gz b/priv/static/images/icon-orange-line-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..c0eeac697c7648564360cba8d1a4bfa83035845b GIT binary patch literal 591 zcmV-V0n!3KYq^h^Z8UytFE{G3|i}%8I!nOPs@5bp8581 zT%NzKU+YN=EsW>yw0RT!S>2EK(^Br!=X%>-_KP?jFH4EfFND>{_I?n%<4KZ~xxycGFNTiBl${$dEqC$2r zl#c+?s8lI&$b{&jW8oNObR?3BwB?Wo?XY8`AZd(JK{O_&paB{W#PuBi@ z^By5;76oNFf7mjHfI&1YyQ!@8Rs~PFWdW=;9V^3Yo+bvJ2xMJ7YcO(tRFk?Gj8gRJSbw-w9A_wC{LUlkf&C#K7@@Fjpg+Mg&c&A zja0=rQ!<)HS)mb%Uk6x94#stClvXnpigwU(P;6%eM%!`d*eb&of$I5cv$*6cT_oRe zREyEnV!2ynO@rREM93}sZf~c*-bDPs21k$<4YYqaF2XuE@cKr+c^KYNr{h67rG1R} dkU<$w-t>H{dB1sErFZe>?GNYS*HW|v008YABFX>& literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg b/priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg new file mode 100644 index 00000000..b2e2f0df --- /dev/null +++ b/priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg @@ -0,0 +1,10 @@ + + + red line + + + + + + + diff --git a/priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg.gz b/priv/static/images/icon-red-line-small-3f542b6fae94745db7cc0ff530cb9390.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..7bc45ef66de0f73426db99fc51fcc5a5aeef24fb GIT binary patch literal 583 zcmV-N0=WGjiwFP!000006IE2pZsRZvy!R^v@7XdbQWUvJde}b++Pr|IDcZm(`t?iM zvb$?19>*M!!=aVU=XeZX*UQ`IwmaSL@4tuP@p!}s#oNbmNB}T6qYEFm%YNIPuYNn8 z_m4lfuWbhb0*ZgS=cnMu=6=3k_Vax`KK8HSa(>&-!Qr3i=6!cRg~R!B*>=BPcggUj z3$NSmssVNyv?lhiwiBka*Iv7!B{(jt4~IkdQ*usRGf4!@oCC*{cPWyIT3B#W9-@I# ziYUbBA+SPu#YPe1$eg7Fj7F>rv@kP}M9HE&tyK48!A8NHG%8Rk9!ZiwSDYDrOr_>U zW@E>~1$D)RV_>Awm641Q5~j36Ps55~!B#Ls?OBR>fDn<~8HJnv?X-Er0Fqt#FRukdwfkt*q(~crL zzk~(nsYjoY`lC{E^$4k5TNDdNQbs!U7=_J8ZAen5FyrDMiWcmnW_;-V`jISGmE>+X4TvY+AA0-3ujLwC{<4)!UYzJdN)#sno1J|Jh~hL#r9zAOU&Qb zK4vW{-Z5F?I!`WC$2MbYQN3QuIK6woEVN=HBxO>s>%Lkv^I!9IRpbQrCX3ND>Lg@8 zxXP|&SWv4*g#y_{BSO~iW!L?`!+eMdm}uH!qtvNjI+5>&oMrS0tEeZ-k-!a|TVD6? VaD0B+)W4SJr@w|SA*F)^003Nm8kYb7 literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-red-line-small.svg.gz b/priv/static/images/icon-red-line-small.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..7bc45ef66de0f73426db99fc51fcc5a5aeef24fb GIT binary patch literal 583 zcmV-N0=WGjiwFP!000006IE2pZsRZvy!R^v@7XdbQWUvJde}b++Pr|IDcZm(`t?iM zvb$?19>*M!!=aVU=XeZX*UQ`IwmaSL@4tuP@p!}s#oNbmNB}T6qYEFm%YNIPuYNn8 z_m4lfuWbhb0*ZgS=cnMu=6=3k_Vax`KK8HSa(>&-!Qr3i=6!cRg~R!B*>=BPcggUj z3$NSmssVNyv?lhiwiBka*Iv7!B{(jt4~IkdQ*usRGf4!@oCC*{cPWyIT3B#W9-@I# ziYUbBA+SPu#YPe1$eg7Fj7F>rv@kP}M9HE&tyK48!A8NHG%8Rk9!ZiwSDYDrOr_>U zW@E>~1$D)RV_>Awm641Q5~j36Ps55~!B#Ls?OBR>fDn<~8HJnv?X-Er0Fqt#FRukdwfkt*q(~crL zzk~(nsYjoY`lC{E^$4k5TNDdNQbs!U7=_J8ZAen5FyrDMiWcmnW_;-V`jISGmE>+X4TvY+AA0-3ujLwC{<4)!UYzJdN)#sno1J|Jh~hL#r9zAOU&Qb zK4vW{-Z5F?I!`WC$2MbYQN3QuIK6woEVN=HBxO>s>%Lkv^I!9IRpbQrCX3ND>Lg@8 zxXP|&SWv4*g#y_{BSO~iW!L?`!+eMdm}uH!qtvNjI+5>&oMrS0tEeZ-k-!a|TVD6? VaD0B+)W4SJr@w|SA*F)^003Nm8kYb7 literal 0 HcmV?d00001 diff --git a/priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg b/priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg new file mode 100644 index 00000000..c015028d --- /dev/null +++ b/priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg.gz b/priv/static/images/icon-silver-line-small-fff06f2cb4d9c5d85b9fd155fd4f2fa9.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..ee147d1ac7c74cbfbec3fc80b03c45a6f88c30ac GIT binary patch literal 1173 zcmV;G1Zw*qiwFP!000006O~rmZX7oZ{guJ?d1R3kDY1z2&_7wYu{VI7OC79(e0>i& zqw%6Z3lz3_#zTpscsZO8uh*yL`uWq_A76jopXyQyXv( zJcM|qQpX6{TRVI4Hgwsc=FiH-U1Afbg2se*{pir*422Q+AiNguLZzi;9Jy=Amy0sM$!dn~#+ZhD;wyZKX2&C0J|K;!2}bZFDZ?_?=tgM685U z-8jY65DtXqQdqD@)KW~XMO1Wjzpn7c{L+e;+<4Yg+;}F3XK?4AzWMZR3{7$4pH2Tf z#f^XZKm04bvHp5lv8=Hp*DkK`nzie~}^;}!K_!}EE4e|=f^z3aYt z)2*?4%;(&X?JnE%&1<-V>x4UsW$E4CDe3SHG8o%q)a zVrq&5yNaI6U?ed_uFSQ#H?C`nTcMRG#jZ`|vMGPPAf=>jssCc-zl=;9r{(eU^Yi`b zH+rB?ET_Ahz8~Q>O6WYI^mN%_Z_keQby~)-^Ng&;$Rzq_!mRM<3b28IB8aq4*wsy= z(yD00Ry*;8cRf0U1WoSFlHzboNl|RU2y+T7n*(q<*$tTPO zAb@C%3NKn2V-r(pgTb6k^c_n^I9EM-SEBA~?Pn`viN9HZeV~s)p@zVKGIlw&HYB>x zBILa{pD^{CFABa2jq;c<7vMHMh#&ohQtRpy_HJWQ9Pi*5oJ?YE!mc;!h=zfD!ZY8* zt{Wy1sY;PGczVFDcWaTGpaz6x!lsPz;3y+jO`Cas!rV+?E0k5duf{xK`h}pBPUtz1 zMHQQHbFDZ-T`uT0Wg}EB_Zmq}IMOW|5fnyTK(r|irBqAm$dU*9(}bfI#86|@>*l^5 zFc)ZW2K_4(k{zA>MBjRxx{;^c2Sc z0wXpOL=1`$N0Sha;YLeLNsR3sW_K#Olezl$(#RTGGjCFdV^d5%lyuwy+>e<}P4&!C zEKx-XdpZ!GjxZ*>QcEsKn8~b|t5IoLz3(uSsTQ9cBeyxxgrmkClg?4K*yke?pD^`m z9i-0DTbIMgcH^a+PLSO!;*)Q>UcVH~Z8GEocSV`ZOk zba;<}++E^Y5}!dk%mqkJ9MW359EB_-(dh}3(NL?1A!BmfjtZ*SgHeP#aqU->QWLr0 nE5>D9DJG}Hi& zqw%6Z3lz3_#zTpscsZO8uh*yL`uWq_A76jopXyQyXv( zJcM|qQpX6{TRVI4Hgwsc=FiH-U1Afbg2se*{pir*422Q+AiNguLZzi;9Jy=Amy0sM$!dn~#+ZhD;wyZKX2&C0J|K;!2}bZFDZ?_?=tgM685U z-8jY65DtXqQdqD@)KW~XMO1Wjzpn7c{L+e;+<4Yg+;}F3XK?4AzWMZR3{7$4pH2Tf z#f^XZKm04bvHp5lv8=Hp*DkK`nzie~}^;}!K_!}EE4e|=f^z3aYt z)2*?4%;(&X?JnE%&1<-V>x4UsW$E4CDe3SHG8o%q)a zVrq&5yNaI6U?ed_uFSQ#H?C`nTcMRG#jZ`|vMGPPAf=>jssCc-zl=;9r{(eU^Yi`b zH+rB?ET_Ahz8~Q>O6WYI^mN%_Z_keQby~)-^Ng&;$Rzq_!mRM<3b28IB8aq4*wsy= z(yD00Ry*;8cRf0U1WoSFlHzboNl|RU2y+T7n*(q<*$tTPO zAb@C%3NKn2V-r(pgTb6k^c_n^I9EM-SEBA~?Pn`viN9HZeV~s)p@zVKGIlw&HYB>x zBILa{pD^{CFABa2jq;c<7vMHMh#&ohQtRpy_HJWQ9Pi*5oJ?YE!mc;!h=zfD!ZY8* zt{Wy1sY;PGczVFDcWaTGpaz6x!lsPz;3y+jO`Cas!rV+?E0k5duf{xK`h}pBPUtz1 zMHQQHbFDZ-T`uT0Wg}EB_Zmq}IMOW|5fnyTK(r|irBqAm$dU*9(}bfI#86|@>*l^5 zFc)ZW2K_4(k{zA>MBjRxx{;^c2Sc z0wXpOL=1`$N0Sha;YLeLNsR3sW_K#Olezl$(#RTGGjCFdV^d5%lyuwy+>e<}P4&!C zEKx-XdpZ!GjxZ*>QcEsKn8~b|t5IoLz3(uSsTQ9cBeyxxgrmkClg?4K*yke?pD^`m z9i-0DTbIMgcH^a+PLSO!;*)Q>UcVH~Z8GEocSV`ZOk zba;<}++E^Y5}!dk%mqkJ9MW359EB_-(dh}3(NL?1A!BmfjtZ*SgHeP#aqU->QWLr0 nE5>D9DJG}H diff --git a/priv/static/images/logo-5c8510ba5230b9ab92430432aba36aa9.svg.gz b/priv/static/images/logo-5c8510ba5230b9ab92430432aba36aa9.svg.gz new file mode 100644 index 0000000000000000000000000000000000000000..0672244f5c62e1aea6eebc11f76d485a4aafae7e GIT binary patch literal 207 zcmV;=05Ja_iwFP!000006LpZ=3c@f9hVOlfP_LUNJz2$i;hTs~H`tu$SjDHeo#?J4 zA^CD3{ABwWFYxTz>m!PK7;YP-Qc9Q%_V3H?^;h}5#sVGc-6uk{QxndFc?>rzG7e|a7~u)|dy(2s0umy^u7l(O`t))-#%q4JsC;tj10 JSfD}y003m%W-m!PK7;YP-Qc9Q%_V3H?^;h}5#sVGc-6uk{QxndFc?>rzG7e|a7~u)|dy(2s0umy^u7l(O`t))-#%q4JsC;tj10 JSfD}y003m%W- Date: Fri, 7 Jun 2024 08:41:30 -0400 Subject: [PATCH 12/25] fix: remove asset tagged versions of icons --- .../about-eed0975ea5871e1732ad8ef93297c32e.txt | 6 ------ ...bout-eed0975ea5871e1732ad8ef93297c32e.txt.gz | Bin 246 -> 0 bytes priv/static/icons/about.txt.gz | Bin 246 -> 0 bytes ...192x192-2ece7b61582954dac85d742a9a993327.png | Bin 13684 -> 0 bytes ...512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png | Bin 45985 -> 0 bytes ...ch-icon-96718819aa0c472399f15bcd996fa37d.png | Bin 12946 -> 0 bytes ...t-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png | Bin 259 -> 0 bytes ...t-icons-f8c65969eed5f278a8c211b8f770c88e.png | Bin 368 -> 0 bytes ...n-16x16-879106ff1a0d3dd8df7dde421955ec7f.png | Bin 671 -> 0 bytes ...n-32x32-acf684893f4d6958b65054cb267c08af.png | Bin 1513 -> 0 bytes ...favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico | Bin 15406 -> 0 bytes ...053100cb84a50d2ae7f5492f7dd7f25e.webmanifest | 1 - 12 files changed, 7 deletions(-) delete mode 100644 priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt delete mode 100644 priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz delete mode 100644 priv/static/icons/about.txt.gz delete mode 100644 priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png delete mode 100644 priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png delete mode 100644 priv/static/icons/apple-touch-icon-96718819aa0c472399f15bcd996fa37d.png delete mode 100644 priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png delete mode 100644 priv/static/icons/edit-soft-icons-f8c65969eed5f278a8c211b8f770c88e.png delete mode 100644 priv/static/icons/favicon-16x16-879106ff1a0d3dd8df7dde421955ec7f.png delete mode 100644 priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png delete mode 100644 priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico delete mode 100644 priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest diff --git a/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt b/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt deleted file mode 100644 index 9b12b75a..00000000 --- a/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt +++ /dev/null @@ -1,6 +0,0 @@ -This favicon was generated using the following graphics from Twitter Twemoji: - -- Graphics Title: 1f3f9.svg -- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) -- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f3f9.svg -- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz b/priv/static/icons/about-eed0975ea5871e1732ad8ef93297c32e.txt.gz deleted file mode 100644 index 98b98a26dd28141d2993d32ec5a8d5fef86a2073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmVfBr(vM=(gn6tM3*g0BeW~3 zdd}64^o4a%Y~k&uXi*1W!>)hoUrJfR{q8VpB(9;M>C70S!oJ#9w|kH9o*dY80?O$O z8BH0xS&0Q6qUt2IF#$EsUFm2vdiCY{!?C%K`k# w5uHzx?>5c$^%I`U>X*#1w~C9;86zbriGvxgdNJMEWU<*4-=?Lo&Uyg=0FK&#I{*Lx diff --git a/priv/static/icons/about.txt.gz b/priv/static/icons/about.txt.gz deleted file mode 100644 index 98b98a26dd28141d2993d32ec5a8d5fef86a2073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmVfBr(vM=(gn6tM3*g0BeW~3 zdd}64^o4a%Y~k&uXi*1W!>)hoUrJfR{q8VpB(9;M>C70S!oJ#9w|kH9o*dY80?O$O z8BH0xS&0Q6qUt2IF#$EsUFm2vdiCY{!?C%K`k# w5uHzx?>5c$^%I`U>X*#1w~C9;86zbriGvxgdNJMEWU<*4-=?Lo&Uyg=0FK&#I{*Lx diff --git a/priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png b/priv/static/icons/android-chrome-192x192-2ece7b61582954dac85d742a9a993327.png deleted file mode 100644 index 0332d397d8e5953f2998309f0115b69cb8b72da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13684 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 diff --git a/priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png b/priv/static/icons/android-chrome-512x512-64a386bdbc315ddbf0ef2d13cf27e2a1.png deleted file mode 100644 index 1f4f2f0572348d4f02df4e9e3791a9d31ed16eb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45985 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 diff --git a/priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png b/priv/static/icons/delete-soft-icons-9cbe456ed9105fbf4ce3da4f8596d5d7.png deleted file mode 100644 index f24732246424e440071f209cdcb6e23dd6dc7bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmV+e0sQ`nP)F%p)*x=atTw!I=!|gcwNyP8 zoR{mwfjCwo>mW$=07$e6FIPX<9n1WH=@qxiv6D|A4Dp*i^ey-}EVe~uK8v&Z<;G9^ z1%E+8AhwNB%6}a&-2!5nX#q-bCtZwu7LA#G-9|)Mw9=%B?_ibS3lOuRVGyhgrl!43#3nYBghBcZh{@DV*n}90G$ie9 zNof74-g{nyxN>u~xvh8nojlL)yg3JHW0Y;neLNxWXP0iK6LgfKlHQ?yk*B!4PNPr+ zAh5tLJyAP3{dQH~c!($XIKK)YP>Rah9%4Jh_D!^&ZddZSk%g8^JC2kRo01=%mfP_; z`79Kretjo5BeP;9w?s8;(L_X=HCw3+wWFLH>HWRL4pz}ZT^NG{pleN5P=aN8VF2~= z%5(M@BN_%>1HkyR+00No%=wP`CdUY`%y=^I4U|xB0Y_2`ZnIyYgtEC!wGH@J&>;+9 zh~rR6?{)+OXoaaI`T3R}cw&@@x!4j0(EkJbU!hIdCkPEi2`A?R!vJ5>@apUJsE8*3 O0000Px%SxH1eR5(wS(_ctaQ5*;G-|yTz=bu~;Tgsf8HJn;Qs)ry0l_Jy7O`rS!=ZRIvsofxp%o;~``tF2ddcEg^&0m}H75rJNd19RQYEr`^bsZ#ce z0kTcc!OxFFH}Vdjpz9shrhSInZ}Jw(LUF)r(cPyM)Ri`uK@6Y(I8jjeKrP$f8s$(` zyf6{`J<8L~`bLft_gVXB_;0`YOX=yW2R=>?ApkGz{Rst(61b2{I2Zr`002ovPDHLk FV1hvJICB61 diff --git a/priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png b/priv/static/icons/favicon-32x32-acf684893f4d6958b65054cb267c08af.png deleted file mode 100644 index 7f2aafe4abf3d7584603a0bcb609a5f86476c52d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1513 zcmVPx)qe(}3w!Tr?!po>kawx^ z{E5BVZ%eo+>ImJty%^KmBRlT7*ZXPVAE z3=8FaXN!?^y5k*!F+fL}C4MFSrD?VQ2jpz=dczRYI}UZP5{oH}WZe@wJ*r84BQL-B zG{8|ky$tZ{?Sre=|2(KL7MN2^r@9J$G&N4|5Ci=0DcoC#=AICGokUKdFiBwH#l+r1 z5q(&2kYI!c$3AJUKX&{S1H%A>0BDw-%7_*~LGcPOXY>sYM0jX0h_TzikuOI_QZeItiO-D5(6 zinvy*%$T|*!+9vMIfIEm0MM(mfCMx$<2V6TOnebc^$>hVKqw3tSXO*PM#g5<9Xqy# zLG?uV#+YNfr0(ScsIPfD_EZxid0e#Vf`e*yst7ff;BZU>jH|2)yBS zIJ%&qEnA%+>CEP=ny5E22X*|+4Zz0jdxoaYoc5c#pt$&~A!HzS0wUgdz8a3bUjwqU zMGD+v#wvrpDSJ%z-dh@v;K6|Q8}W=8QhBISXqY<3q#HCGZUo8B{c^K3_t`JMzpOE^ zdzoi|a&z)hCjJEB8P2n-yI$zv;)f05^Vq_x&VyZ z5E!nuj9QqX5u(72=r|`HkPS}&N#_9!Yy~VaT5T)bn|DO0b3$V#v;oxdYL_0ds}oM` zb1z-ffR3$JRmDBrbHam~&<6O?JUzro%C**CY&GWE(mG3RH!`6Oa3D2#uukINThgyg zGFo>Z?CNYiL}&w)n5RVx(w$Uid%*P`{tpm zG}$Bd0rne;tUKbE_59|jd6_Nk-R^3;8>;V>rzIE}q7)3X(Q3={1mH%548TqZ5pOts z6cHCJ5W=AjG&tGU(L*#W?iqe3mr@|No3#IgDX}EJAei=o_*G+0;kTXw)b(edO0e8} zfA$8)W251Htqhmn%f!tK3WOf;>*qu-KVCa_U)`ck0cGao6cFzaM6;gB*|n`ZfSR}o zYl3E`dlHyB(G6L%d=usa-IB;7o{K;8eoBPg{bS%|TLh~|#Z z+4WU-02iMdy(GZ&>++wr`a}2Tr|4rG3w`AYcz>P;a<)9wxb8AQUgU}WmJT(Ll*Pa@ zDEzK5uW)^L0JW3GObU#z+E={N54|V={Xfe>b6kuI;j=bRf$S8m`_}h%IwRWv>T|pE z()EjqB8LbeH3+@*S9btVK%osA!w#&0AxsyJ(BMGW7tVJfbT#KE`h2+JmXJyE>gin- zUb(yR{v$|BJVcXYqN*B@bizUo7ba(nsW$+7X1Oa8SD z%hD3-0177Hqw%@6mE8q!KBNk3$m+)Gz6%G12DcnK%cCAWSyI_0K>fQUSpNrr#wJ;Q ze9Fe6i`@mZevfRvQ5&Ko`kP(FuF&YgRr`*12`HVPI7J95Vg;`m^K3i*WAL`GpNpBC z3t)N=Z~LJB6%}{81RPFJ3~zF<|HMtZtN*Xyt^G#T!zOq~pDMl6*}i`R*NwH(1+l4u P00000NkvXXu0mjfiB`*z diff --git a/priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico b/priv/static/icons/favicon-8eafa8dbec2e1ed1e26293db1715b72e.ico deleted file mode 100644 index 51d064ff33a0f4d54474b50ef8af09205f52b475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 diff --git a/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest b/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest deleted file mode 100644 index 45dc8a20..00000000 --- a/priv/static/icons/site-053100cb84a50d2ae7f5492f7dd7f25e.webmanifest +++ /dev/null @@ -1 +0,0 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file From 926208f52286d2cb0d94246dc25d912da9eb0d37 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Fri, 7 Jun 2024 08:25:58 -0400 Subject: [PATCH 13/25] fix: fix path for checkbox.css image --- {assets => priv}/static/images/checkbox-empty.png | Bin {assets => priv}/static/images/checkbox-filled.png | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename {assets => priv}/static/images/checkbox-empty.png (100%) rename {assets => priv}/static/images/checkbox-filled.png (100%) diff --git a/assets/static/images/checkbox-empty.png b/priv/static/images/checkbox-empty.png similarity index 100% rename from assets/static/images/checkbox-empty.png rename to priv/static/images/checkbox-empty.png diff --git a/assets/static/images/checkbox-filled.png b/priv/static/images/checkbox-filled.png similarity index 100% rename from assets/static/images/checkbox-filled.png rename to priv/static/images/checkbox-filled.png From 9d3575848e0a9e8b2cef4ad48280f84014ff995b Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:28:28 -0400 Subject: [PATCH 14/25] fix: separate out css from js build, remove tailwind.css separate file --- assets/css/app.css | 5 +++++ assets/css/tailwind.css | 3 --- assets/src/app.tsx | 3 --- config/config.exs | 8 ++++---- lib/arrow_web/controllers/layout_html/app.html.heex | 1 - mix.exs | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 assets/css/tailwind.css diff --git a/assets/css/app.css b/assets/css/app.css index 907f3aad..4b31a6d5 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1,8 +1,13 @@ /* This file is for your main application css. */ +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; @import "./variables.css"; @import "./bootstrap.css"; @import "../node_modules/react-datepicker/dist/react-datepicker.css"; +@import "../node_modules/@fullcalendar/daygrid/main.css"; +@import "../node_modules/@fullcalendar/common/main.css"; @import "./base.css"; @import "./checkbox.css"; diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css deleted file mode 100644 index 76fcadcc..00000000 --- a/assets/css/tailwind.css +++ /dev/null @@ -1,3 +0,0 @@ -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; diff --git a/assets/src/app.tsx b/assets/src/app.tsx index 235bb0a3..12b71c42 100644 --- a/assets/src/app.tsx +++ b/assets/src/app.tsx @@ -3,9 +3,6 @@ // its own CSS file. declare function require(name: string): string -// tslint:disable-next-line -require("../css/app.css") - import "phoenix_html" import ReactPhoenix from "./ReactPhoenix" diff --git a/config/config.exs b/config/config.exs index 07390a93..91120b8f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -49,9 +49,9 @@ config :esbuild, src/app.tsx --bundle --target=es2015 - --loader:.png=file - --loader:.woff=file --outdir=../priv/static/assets + --external:/fonts/* + --external:/images/* #{if(Mix.env() == :test, do: "--define:__REACT_DEVTOOLS_GLOBAL_HOOK__={'isDisabled':true}")} ), cd: Path.expand("../assets", __DIR__), @@ -64,8 +64,8 @@ config :tailwind, default: [ args: ~w( --config=tailwind.config.js - --input=css/tailwind.css - --output=../priv/static/assets/tailwind.css + --input=css/app.css + --output=../priv/static/assets/app.css ), cd: Path.expand("../assets", __DIR__) ] diff --git a/lib/arrow_web/controllers/layout_html/app.html.heex b/lib/arrow_web/controllers/layout_html/app.html.heex index 2fe485c4..5b4cb10d 100644 --- a/lib/arrow_web/controllers/layout_html/app.html.heex +++ b/lib/arrow_web/controllers/layout_html/app.html.heex @@ -12,7 +12,6 @@ Arrow - <%= tag :link, rel: "stylesheet", href: Routes.static_path(@conn, "/assets/tailwind.css") %> <%= tag :link, rel: "stylesheet", href: Routes.static_path(@conn, "/assets/app.css") %> diff --git a/mix.exs b/mix.exs index 97516aa3..fbbac9de 100644 --- a/mix.exs +++ b/mix.exs @@ -101,7 +101,7 @@ defmodule Arrow.MixProject do "ecto.rollback": ["ecto.rollback", "ecto.dump --quiet"], test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], - "assets.build": ["tailwind default", "esbuild default --sourcemap=inline"], + "assets.build": ["esbuild default --sourcemap=inline", "tailwind default"], "assets.deploy": ["esbuild default --minify", "tailwind default --minify", "phx.digest"], "test.integration": [ "assets.build", From ee79d7b8f9b47257e99b0a35267ec95d43c9b181 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:46:50 -0400 Subject: [PATCH 15/25] fix: remove @tailwind/base to prevent collision with bootstrap --- assets/css/app.css | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/css/app.css b/assets/css/app.css index 4b31a6d5..72558260 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1,5 +1,4 @@ /* This file is for your main application css. */ -@import "tailwindcss/base"; @import "tailwindcss/components"; @import "tailwindcss/utilities"; From cf7ee900029e97e8a77a0afe331815eb129c0833 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:23:39 -0400 Subject: [PATCH 16/25] fix: update esbuild, remove css refs and add empty loader --- assets/package.json | 6 ------ assets/src/app.tsx | 5 ----- assets/tsconfig.json | 2 +- config/config.exs | 4 +++- mix.lock | 2 +- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/assets/package.json b/assets/package.json index 5b14d6e9..9d8e0700 100644 --- a/assets/package.json +++ b/assets/package.json @@ -45,9 +45,6 @@ "jest": { "testEnvironment": "jsdom", "clearMocks": true, - "transformIgnorePatterns": [ - "node_modules/(?!@fullcalendar).+" - ], "transform": { "^.+\\.(j|t)sx?$": "ts-jest" }, @@ -63,9 +60,6 @@ "json", "node" ], - "moduleNameMapper": { - "\\.(css)$": "identity-obj-proxy" - }, "setupFilesAfterEnv": [ "/jest-setup.ts" ], diff --git a/assets/src/app.tsx b/assets/src/app.tsx index 12b71c42..602f6928 100644 --- a/assets/src/app.tsx +++ b/assets/src/app.tsx @@ -1,8 +1,3 @@ -// We need to import the CSS so that webpack will load it. -// The MiniCssExtractPlugin is used to separate it out into -// its own CSS file. -declare function require(name: string): string - import "phoenix_html" import ReactPhoenix from "./ReactPhoenix" diff --git a/assets/tsconfig.json b/assets/tsconfig.json index c2fec3c5..f88f2c55 100644 --- a/assets/tsconfig.json +++ b/assets/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["src", "tests", "node_modules/@fullcalendar", "jest-setup.ts"], + "include": ["src", "tests", "jest-setup.ts"], "exclude": ["node_modules"], "compilerOptions": { /* Basic Options */ diff --git a/config/config.exs b/config/config.exs index 91120b8f..567501bf 100644 --- a/config/config.exs +++ b/config/config.exs @@ -43,15 +43,17 @@ config :arrow, ArrowWeb.Endpoint, pubsub_server: Arrow.PubSub config :esbuild, - version: "0.12.18", + version: "0.17.11", default: [ args: ~w( src/app.tsx --bundle --target=es2015 + --loader:.css=empty --outdir=../priv/static/assets --external:/fonts/* --external:/images/* + --external:/css/* #{if(Mix.env() == :test, do: "--define:__REACT_DEVTOOLS_GLOBAL_HOOK__={'isDisabled':true}")} ), cd: Path.expand("../assets", __DIR__), diff --git a/mix.lock b/mix.lock index fab1a604..8bf2ce48 100644 --- a/mix.lock +++ b/mix.lock @@ -13,7 +13,7 @@ "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_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.4.0", "9f17db148aead4cf1e6e6a584214357287a93407b5fb51a031f122b61385d4c2", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "b61e4e6b92ffe45e4ee4755a22de6211a67c67987dc02afb35a425a0add1d447"}, + "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"}, "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_secretsmanager": {:hex, :ex_aws_secretsmanager, "2.0.0", "deff8c12335f0160882afeb9687e55a97fddcd7d9a82fc3a6fbb270797374773", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "8b2838af536c32263ff797012b29e87bad73ef34f43cfa60ebca8e84576f6d45"}, From 48233962bcd0e63078c2971d747ce56272358fdc Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:46:39 -0400 Subject: [PATCH 17/25] fix: fix Dockerfile to work with tailwind with Phoenix .heex --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 19822365..16e889f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,9 +42,10 @@ RUN mix deps.compile COPY assets assets RUN npm ci --prefix assets -RUN mix assets.deploy COPY lib lib +RUN mix assets.deploy + COPY priv priv RUN mix phx.digest From 64d2bc46c8baf29aa11aad63d0e426eccbfd09e1 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:00:52 -0400 Subject: [PATCH 18/25] feat: commit mix phx.gen.html output --- lib/arrow/shuttle.ex | 104 ++++++++++++++++++ lib/arrow/shuttle/shape.ex | 18 +++ lib/arrow_web/controllers/shape_controller.ex | 62 +++++++++++ lib/arrow_web/controllers/shape_html.ex | 13 +++ .../controllers/shape_html/edit.html.heex | 8 ++ .../controllers/shape_html/index.html.heex | 23 ++++ .../controllers/shape_html/new.html.heex | 8 ++ .../shape_html/shape_form.html.heex | 9 ++ .../controllers/shape_html/show.html.heex | 15 +++ lib/arrow_web/router.ex | 1 + .../20240605185923_create_shapes.exs | 13 +++ test/arrow/shuttle_test.exs | 59 ++++++++++ .../controllers/shape_controller_test.exs | 84 ++++++++++++++ test/support/fixtures/shuttle_fixtures.ex | 25 +++++ 14 files changed, 442 insertions(+) create mode 100644 lib/arrow/shuttle.ex create mode 100644 lib/arrow/shuttle/shape.ex create mode 100644 lib/arrow_web/controllers/shape_controller.ex create mode 100644 lib/arrow_web/controllers/shape_html.ex create mode 100644 lib/arrow_web/controllers/shape_html/edit.html.heex create mode 100644 lib/arrow_web/controllers/shape_html/index.html.heex create mode 100644 lib/arrow_web/controllers/shape_html/new.html.heex create mode 100644 lib/arrow_web/controllers/shape_html/shape_form.html.heex create mode 100644 lib/arrow_web/controllers/shape_html/show.html.heex create mode 100644 priv/repo/migrations/20240605185923_create_shapes.exs create mode 100644 test/arrow/shuttle_test.exs create mode 100644 test/arrow_web/controllers/shape_controller_test.exs create mode 100644 test/support/fixtures/shuttle_fixtures.ex diff --git a/lib/arrow/shuttle.ex b/lib/arrow/shuttle.ex new file mode 100644 index 00000000..d43a90f2 --- /dev/null +++ b/lib/arrow/shuttle.ex @@ -0,0 +1,104 @@ +defmodule Arrow.Shuttle do + @moduledoc """ + The Shuttle context. + """ + + import Ecto.Query, warn: false + alias Arrow.Repo + + alias Arrow.Shuttle.Shape + + @doc """ + Returns the list of shapes. + + ## Examples + + iex> list_shapes() + [%Shape{}, ...] + + """ + def list_shapes do + Repo.all(Shape) + end + + @doc """ + Gets a single shape. + + Raises `Ecto.NoResultsError` if the Shape does not exist. + + ## Examples + + iex> get_shape!(123) + %Shape{} + + iex> get_shape!(456) + ** (Ecto.NoResultsError) + + """ + def get_shape!(id), do: Repo.get!(Shape, id) + + @doc """ + Creates a shape. + + ## Examples + + iex> create_shape(%{field: value}) + {:ok, %Shape{}} + + iex> create_shape(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_shape(attrs \\ %{}) do + %Shape{} + |> Shape.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a shape. + + ## Examples + + iex> update_shape(shape, %{field: new_value}) + {:ok, %Shape{}} + + iex> update_shape(shape, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_shape(%Shape{} = shape, attrs) do + shape + |> Shape.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a shape. + + ## Examples + + iex> delete_shape(shape) + {:ok, %Shape{}} + + iex> delete_shape(shape) + {:error, %Ecto.Changeset{}} + + """ + def delete_shape(%Shape{} = shape) do + Repo.delete(shape) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking shape changes. + + ## Examples + + iex> change_shape(shape) + %Ecto.Changeset{data: %Shape{}} + + """ + def change_shape(%Shape{} = shape, attrs \\ %{}) do + Shape.changeset(shape, attrs) + end +end diff --git a/lib/arrow/shuttle/shape.ex b/lib/arrow/shuttle/shape.ex new file mode 100644 index 00000000..650e9988 --- /dev/null +++ b/lib/arrow/shuttle/shape.ex @@ -0,0 +1,18 @@ +defmodule Arrow.Shuttle.Shape do + use Ecto.Schema + import Ecto.Changeset + + schema "shapes" do + field :name, :string + + timestamps() + end + + @doc false + def changeset(shape, attrs) do + shape + |> cast(attrs, [:name]) + |> validate_required([:name]) + |> unique_constraint(:name) + end +end diff --git a/lib/arrow_web/controllers/shape_controller.ex b/lib/arrow_web/controllers/shape_controller.ex new file mode 100644 index 00000000..02973da0 --- /dev/null +++ b/lib/arrow_web/controllers/shape_controller.ex @@ -0,0 +1,62 @@ +defmodule ArrowWeb.ShapeController do + use ArrowWeb, :controller + + alias Arrow.Shuttle + alias Arrow.Shuttle.Shape + + def index(conn, _params) do + shapes = Shuttle.list_shapes() + render(conn, :index, shapes: shapes) + end + + def new(conn, _params) do + changeset = Shuttle.change_shape(%Shape{}) + render(conn, :new, changeset: changeset) + end + + def create(conn, %{"shape" => shape_params}) do + case Shuttle.create_shape(shape_params) do + {:ok, shape} -> + conn + |> put_flash(:info, "Shape created successfully.") + |> redirect(to: ~p"/shapes/#{shape}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :new, changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + shape = Shuttle.get_shape!(id) + render(conn, :show, shape: shape) + end + + def edit(conn, %{"id" => id}) do + shape = Shuttle.get_shape!(id) + changeset = Shuttle.change_shape(shape) + render(conn, :edit, shape: shape, changeset: changeset) + end + + def update(conn, %{"id" => id, "shape" => shape_params}) do + shape = Shuttle.get_shape!(id) + + case Shuttle.update_shape(shape, shape_params) do + {:ok, shape} -> + conn + |> put_flash(:info, "Shape updated successfully.") + |> redirect(to: ~p"/shapes/#{shape}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :edit, shape: shape, changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + shape = Shuttle.get_shape!(id) + {:ok, _shape} = Shuttle.delete_shape(shape) + + conn + |> put_flash(:info, "Shape deleted successfully.") + |> redirect(to: ~p"/shapes") + end +end diff --git a/lib/arrow_web/controllers/shape_html.ex b/lib/arrow_web/controllers/shape_html.ex new file mode 100644 index 00000000..f49e30ee --- /dev/null +++ b/lib/arrow_web/controllers/shape_html.ex @@ -0,0 +1,13 @@ +defmodule ArrowWeb.Shape do + use ArrowWeb, :html + + embed_templates "shape_html/*" + + @doc """ + Renders a shape form. + """ + attr :changeset, Ecto.Changeset, required: true + attr :action, :string, required: true + + def shape_form(assigns) +end diff --git a/lib/arrow_web/controllers/shape_html/edit.html.heex b/lib/arrow_web/controllers/shape_html/edit.html.heex new file mode 100644 index 00000000..1147bdbe --- /dev/null +++ b/lib/arrow_web/controllers/shape_html/edit.html.heex @@ -0,0 +1,8 @@ +<.header> + Edit Shape <%= @shape.id %> + <:subtitle>Use this form to manage shape records in your database. + + +<.shape_form changeset={@changeset} action={~p"/shapes/#{@shape}"} /> + +<.back navigate={~p"/shapes"}>Back to shapes diff --git a/lib/arrow_web/controllers/shape_html/index.html.heex b/lib/arrow_web/controllers/shape_html/index.html.heex new file mode 100644 index 00000000..5201018f --- /dev/null +++ b/lib/arrow_web/controllers/shape_html/index.html.heex @@ -0,0 +1,23 @@ +<.header> + Listing Shapes + <:actions> + <.link href={~p"/shapes/new"}> + <.button>New Shape + + + + +<.table id="shapes" rows={@shapes} row_click={&JS.navigate(~p"/shapes/#{&1}")}> + <:col :let={shape} label="Name"><%= shape.name %> + <:action :let={shape}> +
+ <.link navigate={~p"/shapes/#{shape}"}>Show +
+ <.link navigate={~p"/shapes/#{shape}/edit"}>Edit + + <:action :let={shape}> + <.link href={~p"/shapes/#{shape}"} method="delete" data-confirm="Are you sure?"> + Delete + + + diff --git a/lib/arrow_web/controllers/shape_html/new.html.heex b/lib/arrow_web/controllers/shape_html/new.html.heex new file mode 100644 index 00000000..e4b92fa2 --- /dev/null +++ b/lib/arrow_web/controllers/shape_html/new.html.heex @@ -0,0 +1,8 @@ +<.header> + New Shape + <:subtitle>Use this form to manage shape records in your database. + + +<.shape_form changeset={@changeset} action={~p"/shapes"} /> + +<.back navigate={~p"/shapes"}>Back to shapes diff --git a/lib/arrow_web/controllers/shape_html/shape_form.html.heex b/lib/arrow_web/controllers/shape_html/shape_form.html.heex new file mode 100644 index 00000000..d295bc66 --- /dev/null +++ b/lib/arrow_web/controllers/shape_html/shape_form.html.heex @@ -0,0 +1,9 @@ +<.simple_form :let={f} for={@changeset} action={@action}> + <.error :if={@changeset.action}> + Oops, something went wrong! Please check the errors below. + + <.input field={f[:name]} type="text" label="Name" /> + <:actions> + <.button>Save Shape + + diff --git a/lib/arrow_web/controllers/shape_html/show.html.heex b/lib/arrow_web/controllers/shape_html/show.html.heex new file mode 100644 index 00000000..86e5481e --- /dev/null +++ b/lib/arrow_web/controllers/shape_html/show.html.heex @@ -0,0 +1,15 @@ +<.header> + Shape <%= @shape.id %> + <:subtitle>This is a shape record from your database. + <:actions> + <.link href={~p"/shapes/#{@shape}/edit"}> + <.button>Edit shape + + + + +<.list> + <:item title="Name"><%= @shape.name %> + + +<.back navigate={~p"/shapes"}>Back to shapes diff --git a/lib/arrow_web/router.ex b/lib/arrow_web/router.ex index 86540a27..b1f8a722 100644 --- a/lib/arrow_web/router.ex +++ b/lib/arrow_web/router.ex @@ -48,6 +48,7 @@ defmodule ArrowWeb.Router do resources("/disruptions", DisruptionController, except: [:index]) put("/disruptions/:id/row_status", DisruptionController, :update_row_status) post("/disruptions/:id/notes", NoteController, :create) + resources("/shapes", ShapeController) end scope "/", ArrowWeb do diff --git a/priv/repo/migrations/20240605185923_create_shapes.exs b/priv/repo/migrations/20240605185923_create_shapes.exs new file mode 100644 index 00000000..2ade8c9f --- /dev/null +++ b/priv/repo/migrations/20240605185923_create_shapes.exs @@ -0,0 +1,13 @@ +defmodule Arrow.Repo.Migrations.CreateShapes do + use Ecto.Migration + + def change do + create table(:shapes) do + add :name, :string + + timestamps() + end + + create unique_index(:shapes, [:name]) + end +end diff --git a/test/arrow/shuttle_test.exs b/test/arrow/shuttle_test.exs new file mode 100644 index 00000000..cc974208 --- /dev/null +++ b/test/arrow/shuttle_test.exs @@ -0,0 +1,59 @@ +defmodule Arrow.ShuttleTest do + use Arrow.DataCase + + alias Arrow.Shuttle + + describe "shapes" do + alias Arrow.Shuttle.Shape + + import Arrow.ShuttleFixtures + + @invalid_attrs %{name: nil} + + test "list_shapes/0 returns all shapes" do + shape = shape_fixture() + assert Shuttle.list_shapes() == [shape] + end + + test "get_shape!/1 returns the shape with given id" do + shape = shape_fixture() + assert Shuttle.get_shape!(shape.id) == shape + end + + test "create_shape/1 with valid data creates a shape" do + valid_attrs = %{name: "some name"} + + assert {:ok, %Shape{} = shape} = Shuttle.create_shape(valid_attrs) + assert shape.name == "some name" + end + + test "create_shape/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Shuttle.create_shape(@invalid_attrs) + end + + test "update_shape/2 with valid data updates the shape" do + shape = shape_fixture() + update_attrs = %{name: "some updated name"} + + assert {:ok, %Shape{} = shape} = Shuttle.update_shape(shape, update_attrs) + assert shape.name == "some updated name" + end + + test "update_shape/2 with invalid data returns error changeset" do + shape = shape_fixture() + assert {:error, %Ecto.Changeset{}} = Shuttle.update_shape(shape, @invalid_attrs) + assert shape == Shuttle.get_shape!(shape.id) + end + + test "delete_shape/1 deletes the shape" do + shape = shape_fixture() + assert {:ok, %Shape{}} = Shuttle.delete_shape(shape) + assert_raise Ecto.NoResultsError, fn -> Shuttle.get_shape!(shape.id) end + end + + test "change_shape/1 returns a shape changeset" do + shape = shape_fixture() + assert %Ecto.Changeset{} = Shuttle.change_shape(shape) + end + end +end diff --git a/test/arrow_web/controllers/shape_controller_test.exs b/test/arrow_web/controllers/shape_controller_test.exs new file mode 100644 index 00000000..e61125f5 --- /dev/null +++ b/test/arrow_web/controllers/shape_controller_test.exs @@ -0,0 +1,84 @@ +defmodule ArrowWeb.ShapeControllerTest do + use ArrowWeb.ConnCase + + import Arrow.ShuttleFixtures + + @create_attrs %{name: "some name"} + @update_attrs %{name: "some updated name"} + @invalid_attrs %{name: nil} + + describe "index" do + test "lists all shapes", %{conn: conn} do + conn = get(conn, ~p"/shapes") + assert html_response(conn, 200) =~ "Listing Shapes" + end + end + + describe "new shape" do + test "renders form", %{conn: conn} do + conn = get(conn, ~p"/shapes/new") + assert html_response(conn, 200) =~ "New Shape" + end + end + + describe "create shape" do + test "redirects to show when data is valid", %{conn: conn} do + conn = post(conn, ~p"/shapes", shape: @create_attrs) + + assert %{id: id} = redirected_params(conn) + assert redirected_to(conn) == ~p"/shapes/#{id}" + + conn = get(conn, ~p"/shapes/#{id}") + assert html_response(conn, 200) =~ "Shape #{id}" + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, ~p"/shapes", shape: @invalid_attrs) + assert html_response(conn, 200) =~ "New Shape" + end + end + + describe "edit shape" do + setup [:create_shape] + + test "renders form for editing chosen shape", %{conn: conn, shape: shape} do + conn = get(conn, ~p"/shapes/#{shape}/edit") + assert html_response(conn, 200) =~ "Edit Shape" + end + end + + describe "update shape" do + setup [:create_shape] + + test "redirects when data is valid", %{conn: conn, shape: shape} do + conn = put(conn, ~p"/shapes/#{shape}", shape: @update_attrs) + assert redirected_to(conn) == ~p"/shapes/#{shape}" + + conn = get(conn, ~p"/shapes/#{shape}") + assert html_response(conn, 200) =~ "some updated name" + end + + test "renders errors when data is invalid", %{conn: conn, shape: shape} do + conn = put(conn, ~p"/shapes/#{shape}", shape: @invalid_attrs) + assert html_response(conn, 200) =~ "Edit Shape" + end + end + + describe "delete shape" do + setup [:create_shape] + + test "deletes chosen shape", %{conn: conn, shape: shape} do + conn = delete(conn, ~p"/shapes/#{shape}") + assert redirected_to(conn) == ~p"/shapes" + + assert_error_sent 404, fn -> + get(conn, ~p"/shapes/#{shape}") + end + end + end + + defp create_shape(_) do + shape = shape_fixture() + %{shape: shape} + end +end diff --git a/test/support/fixtures/shuttle_fixtures.ex b/test/support/fixtures/shuttle_fixtures.ex new file mode 100644 index 00000000..f627401b --- /dev/null +++ b/test/support/fixtures/shuttle_fixtures.ex @@ -0,0 +1,25 @@ +defmodule Arrow.ShuttleFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Arrow.Shuttle` context. + """ + + @doc """ + Generate a unique shape name. + """ + def unique_shape_name, do: "some name#{System.unique_integer([:positive])}" + + @doc """ + Generate a shape. + """ + def shape_fixture(attrs \\ %{}) do + {:ok, shape} = + attrs + |> Enum.into(%{ + name: unique_shape_name() + }) + |> Arrow.Shuttle.create_shape() + + shape + end +end From c1abdec9212b425c0db97a67a35ced9bd7ee2529 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:32:47 -0400 Subject: [PATCH 19/25] feat: commit result of ecto migration --- priv/repo/structure.sql | 60 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/priv/repo/structure.sql b/priv/repo/structure.sql index e7faf141..f39080f6 100644 --- a/priv/repo/structure.sql +++ b/priv/repo/structure.sql @@ -2,8 +2,8 @@ -- PostgreSQL database dump -- --- Dumped from database version 11.14 --- Dumped by pg_dump version 14.1 +-- Dumped from database version 14.12 (Homebrew) +-- Dumped by pg_dump version 14.12 (Homebrew) SET statement_timeout = 0; SET lock_timeout = 0; @@ -33,6 +33,8 @@ CREATE TYPE public.day_name AS ENUM ( SET default_tablespace = ''; +SET default_table_access_method = heap; + -- -- Name: adjustments; Type: TABLE; Schema: public; Owner: - -- @@ -337,6 +339,37 @@ CREATE TABLE public.schema_migrations ( ); +-- +-- Name: shapes; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.shapes ( + id bigint NOT NULL, + name character varying(255), + inserted_at timestamp(0) without time zone NOT NULL, + updated_at timestamp(0) without time zone NOT NULL +); + + +-- +-- Name: shapes_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.shapes_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: shapes_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.shapes_id_seq OWNED BY public.shapes.id; + + -- -- Name: adjustments id; Type: DEFAULT; Schema: public; Owner: - -- @@ -400,6 +433,13 @@ ALTER TABLE ONLY public.disruption_trip_short_names ALTER COLUMN id SET DEFAULT ALTER TABLE ONLY public.disruptions ALTER COLUMN id SET DEFAULT nextval('public.disruptions_id_seq1'::regclass); +-- +-- Name: shapes id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.shapes ALTER COLUMN id SET DEFAULT nextval('public.shapes_id_seq'::regclass); + + -- -- Name: adjustments adjustments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -480,6 +520,14 @@ ALTER TABLE ONLY public.schema_migrations ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); +-- +-- Name: shapes shapes_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.shapes + ADD CONSTRAINT shapes_pkey PRIMARY KEY (id); + + -- -- Name: adjustments_source_label_index; Type: INDEX; Schema: public; Owner: - -- @@ -543,6 +591,13 @@ CREATE INDEX disruption_notes_disruption_id_index ON public.disruption_notes USI CREATE INDEX disruption_trip_short_names_disruption_id_index ON public.disruption_trip_short_names USING btree (disruption_revision_id); +-- +-- Name: shapes_name_index; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX shapes_name_index ON public.shapes USING btree (name); + + -- -- Name: unique_disruption_weekday; Type: INDEX; Schema: public; Owner: - -- @@ -637,3 +692,4 @@ INSERT INTO public."schema_migrations" (version) VALUES (20210924180538); INSERT INTO public."schema_migrations" (version) VALUES (20211209185029); INSERT INTO public."schema_migrations" (version) VALUES (20220105203850); INSERT INTO public."schema_migrations" (version) VALUES (20240207224211); +INSERT INTO public."schema_migrations" (version) VALUES (20240605185923); From 4bbb742c69f6e391d06526f3573ea95e3d817494 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:35:14 -0400 Subject: [PATCH 20/25] fix: rename Shape -> ShapeView, add auth --- lib/arrow_web/controllers/shape_controller.ex | 6 ++++++ lib/arrow_web/controllers/shape_html.ex | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/arrow_web/controllers/shape_controller.ex b/lib/arrow_web/controllers/shape_controller.ex index 02973da0..0e0e8ae5 100644 --- a/lib/arrow_web/controllers/shape_controller.ex +++ b/lib/arrow_web/controllers/shape_controller.ex @@ -3,6 +3,12 @@ defmodule ArrowWeb.ShapeController do alias Arrow.Shuttle alias Arrow.Shuttle.Shape + alias ArrowWeb.Plug.Authorize + + plug(Authorize, :view_disruption when action in [:index, :show]) + plug(Authorize, :create_disruption when action in [:new, :create]) + plug(Authorize, :update_disruption when action in [:edit, :update, :update_row_status]) + plug(Authorize, :delete_disruption when action in [:delete]) def index(conn, _params) do shapes = Shuttle.list_shapes() diff --git a/lib/arrow_web/controllers/shape_html.ex b/lib/arrow_web/controllers/shape_html.ex index f49e30ee..0495a56c 100644 --- a/lib/arrow_web/controllers/shape_html.ex +++ b/lib/arrow_web/controllers/shape_html.ex @@ -1,4 +1,4 @@ -defmodule ArrowWeb.Shape do +defmodule ArrowWeb.ShapeView do use ArrowWeb, :html embed_templates "shape_html/*" From 2acaa836d645558ce4b21692405b504d148a2f59 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 16:44:48 -0400 Subject: [PATCH 21/25] tests: add authentication to controller tests --- .../controllers/shape_controller_test.exs | 14 +++++++++++++- test/support/conn_case.ex | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/test/arrow_web/controllers/shape_controller_test.exs b/test/arrow_web/controllers/shape_controller_test.exs index e61125f5..3dd18902 100644 --- a/test/arrow_web/controllers/shape_controller_test.exs +++ b/test/arrow_web/controllers/shape_controller_test.exs @@ -1,5 +1,5 @@ defmodule ArrowWeb.ShapeControllerTest do - use ArrowWeb.ConnCase + use ArrowWeb.ConnCase, async: true import Arrow.ShuttleFixtures @@ -8,6 +8,7 @@ defmodule ArrowWeb.ShapeControllerTest do @invalid_attrs %{name: nil} describe "index" do + @tag :authenticated_admin test "lists all shapes", %{conn: conn} do conn = get(conn, ~p"/shapes") assert html_response(conn, 200) =~ "Listing Shapes" @@ -15,6 +16,7 @@ defmodule ArrowWeb.ShapeControllerTest do end describe "new shape" do + @tag :authenticated_admin test "renders form", %{conn: conn} do conn = get(conn, ~p"/shapes/new") assert html_response(conn, 200) =~ "New Shape" @@ -22,16 +24,19 @@ defmodule ArrowWeb.ShapeControllerTest do end describe "create shape" do + @tag :authenticated_admin test "redirects to show when data is valid", %{conn: conn} do conn = post(conn, ~p"/shapes", shape: @create_attrs) assert %{id: id} = redirected_params(conn) assert redirected_to(conn) == ~p"/shapes/#{id}" + conn = ArrowWeb.ConnCase.authenticated_admin() conn = get(conn, ~p"/shapes/#{id}") assert html_response(conn, 200) =~ "Shape #{id}" end + @tag :authenticated_admin test "renders errors when data is invalid", %{conn: conn} do conn = post(conn, ~p"/shapes", shape: @invalid_attrs) assert html_response(conn, 200) =~ "New Shape" @@ -41,6 +46,7 @@ defmodule ArrowWeb.ShapeControllerTest do describe "edit shape" do setup [:create_shape] + @tag :authenticated_admin test "renders form for editing chosen shape", %{conn: conn, shape: shape} do conn = get(conn, ~p"/shapes/#{shape}/edit") assert html_response(conn, 200) =~ "Edit Shape" @@ -50,14 +56,17 @@ defmodule ArrowWeb.ShapeControllerTest do describe "update shape" do setup [:create_shape] + @tag :authenticated_admin test "redirects when data is valid", %{conn: conn, shape: shape} do conn = put(conn, ~p"/shapes/#{shape}", shape: @update_attrs) assert redirected_to(conn) == ~p"/shapes/#{shape}" + conn = ArrowWeb.ConnCase.authenticated_admin() conn = get(conn, ~p"/shapes/#{shape}") assert html_response(conn, 200) =~ "some updated name" end + @tag :authenticated_admin test "renders errors when data is invalid", %{conn: conn, shape: shape} do conn = put(conn, ~p"/shapes/#{shape}", shape: @invalid_attrs) assert html_response(conn, 200) =~ "Edit Shape" @@ -67,10 +76,13 @@ defmodule ArrowWeb.ShapeControllerTest do describe "delete shape" do setup [:create_shape] + @tag :authenticated_admin test "deletes chosen shape", %{conn: conn, shape: shape} do conn = delete(conn, ~p"/shapes/#{shape}") assert redirected_to(conn) == ~p"/shapes" + conn = ArrowWeb.ConnCase.authenticated_admin() + assert_error_sent 404, fn -> get(conn, ~p"/shapes/#{shape}") end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index a4585e99..9c4e3623 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -44,7 +44,7 @@ defmodule ArrowWeb.ConnCase do {:ok, conn: build_conn("test_user", ["read-only"])} tags[:authenticated_admin] -> - {:ok, conn: build_conn("test_user", ["admin"])} + {:ok, conn: authenticated_admin()} tags[:authenticated_empty] -> {:ok, conn: build_conn("test_user", [])} @@ -64,4 +64,6 @@ defmodule ArrowWeb.ConnCase do |> init_test_session(%{}) |> Guardian.Plug.sign_in(ArrowWeb.AuthManager, user, %{roles: roles}) end + + def authenticated_admin(), do: build_conn("test_user", ["admin"]) end From 20dba1e329fa12aef5959258a6cb099f39fdb29b Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:57:17 -0400 Subject: [PATCH 22/25] fix: fix credo issues --- lib/arrow/shuttle/shape.ex | 1 + test/support/conn_case.ex | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/arrow/shuttle/shape.ex b/lib/arrow/shuttle/shape.ex index 650e9988..8b38ad1a 100644 --- a/lib/arrow/shuttle/shape.ex +++ b/lib/arrow/shuttle/shape.ex @@ -1,4 +1,5 @@ defmodule Arrow.Shuttle.Shape do + @moduledoc "schema for shuttle shapes" use Ecto.Schema import Ecto.Changeset diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 9c4e3623..7e67beb3 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -65,5 +65,5 @@ defmodule ArrowWeb.ConnCase do |> Guardian.Plug.sign_in(ArrowWeb.AuthManager, user, %{roles: roles}) end - def authenticated_admin(), do: build_conn("test_user", ["admin"]) + def authenticated_admin, do: build_conn("test_user", ["admin"]) end From e40d27da8c47e61a2862a4e912dbc46565c71fe4 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:39:55 -0400 Subject: [PATCH 23/25] feat: add file upload input, mark required --- lib/arrow_web/controllers/shape_controller.ex | 10 ++++++++-- .../controllers/shape_html/shape_form.html.heex | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/arrow_web/controllers/shape_controller.ex b/lib/arrow_web/controllers/shape_controller.ex index 0e0e8ae5..6880d4e6 100644 --- a/lib/arrow_web/controllers/shape_controller.ex +++ b/lib/arrow_web/controllers/shape_controller.ex @@ -24,7 +24,10 @@ defmodule ArrowWeb.ShapeController do case Shuttle.create_shape(shape_params) do {:ok, shape} -> conn - |> put_flash(:info, "Shape created successfully.") + |> put_flash( + :info, + "Shape created successfully from #{shape_params["filename"].filename}" + ) |> redirect(to: ~p"/shapes/#{shape}") {:error, %Ecto.Changeset{} = changeset} -> @@ -49,7 +52,10 @@ defmodule ArrowWeb.ShapeController do case Shuttle.update_shape(shape, shape_params) do {:ok, shape} -> conn - |> put_flash(:info, "Shape updated successfully.") + |> put_flash( + :info, + "Shape updated successfully from #{shape_params["filename"].filename}" + ) |> redirect(to: ~p"/shapes/#{shape}") {:error, %Ecto.Changeset{} = changeset} -> 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 d295bc66..93633ff8 100644 --- a/lib/arrow_web/controllers/shape_html/shape_form.html.heex +++ b/lib/arrow_web/controllers/shape_html/shape_form.html.heex @@ -1,7 +1,8 @@ -<.simple_form :let={f} for={@changeset} action={@action}> +<.simple_form :let={f} for={@changeset} action={@action} multipart> <.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[:name]} type="text" label="Name" /> <:actions> <.button>Save Shape From 9de33984ac0fd5b3ca2385abc4b7daa490d27fc9 Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:02:17 -0400 Subject: [PATCH 24/25] tests: add test with upload params set --- test/arrow_web/controllers/shape_controller_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/arrow_web/controllers/shape_controller_test.exs b/test/arrow_web/controllers/shape_controller_test.exs index 3dd18902..9e0f2c92 100644 --- a/test/arrow_web/controllers/shape_controller_test.exs +++ b/test/arrow_web/controllers/shape_controller_test.exs @@ -3,8 +3,8 @@ defmodule ArrowWeb.ShapeControllerTest do import Arrow.ShuttleFixtures - @create_attrs %{name: "some name"} - @update_attrs %{name: "some updated name"} + @create_attrs %{name: "some name", filename: %Plug.Upload{filename: "some filename"}} + @update_attrs %{name: "some updated name", filename: %Plug.Upload{filename: "some filename"}} @invalid_attrs %{name: nil} describe "index" do From 9a6afcd1bb0a5cda57c078e9699aebcf9bf7127b Mon Sep 17 00:00:00 2001 From: Meag Harty <149533950+meagharty@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:39:13 -0400 Subject: [PATCH 25/25] fix: shapes schema use :timestamptz (default is naive_datetime) --- lib/arrow/shuttle/shape.ex | 2 +- priv/repo/migrations/20240605185923_create_shapes.exs | 2 +- priv/repo/structure.sql | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/arrow/shuttle/shape.ex b/lib/arrow/shuttle/shape.ex index 8b38ad1a..7f605e9a 100644 --- a/lib/arrow/shuttle/shape.ex +++ b/lib/arrow/shuttle/shape.ex @@ -6,7 +6,7 @@ defmodule Arrow.Shuttle.Shape do schema "shapes" do field :name, :string - timestamps() + timestamps(type: :utc_datetime) end @doc false diff --git a/priv/repo/migrations/20240605185923_create_shapes.exs b/priv/repo/migrations/20240605185923_create_shapes.exs index 2ade8c9f..68aeab14 100644 --- a/priv/repo/migrations/20240605185923_create_shapes.exs +++ b/priv/repo/migrations/20240605185923_create_shapes.exs @@ -5,7 +5,7 @@ defmodule Arrow.Repo.Migrations.CreateShapes do create table(:shapes) do add :name, :string - timestamps() + timestamps(type: :timestamptz) end create unique_index(:shapes, [:name]) diff --git a/priv/repo/structure.sql b/priv/repo/structure.sql index f39080f6..c28ba3e2 100644 --- a/priv/repo/structure.sql +++ b/priv/repo/structure.sql @@ -346,8 +346,8 @@ CREATE TABLE public.schema_migrations ( CREATE TABLE public.shapes ( id bigint NOT NULL, name character varying(255), - inserted_at timestamp(0) without time zone NOT NULL, - updated_at timestamp(0) without time zone NOT NULL + inserted_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL );