diff --git a/mix.lock b/mix.lock index ae07c74d..c4ea8aa5 100644 --- a/mix.lock +++ b/mix.lock @@ -41,7 +41,7 @@ "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "nx": {:hex, :nx, "0.11.0", "d37723dbd6cfa274a5def6d6664f5680c32e2eb8a1ce25ec6d91751967fa0abf", [:mix], [{:complex, "~> 0.6", [hex: :complex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "36157b21239aeb251d6cbac23eb0eb3495a5e1e0cbc2e6df16afd2ede1575205"}, - "oban": {:hex, :oban, "2.22.0", "d50fb8be22a58ca8839dbc69610e271773d851b7deae01acd8b62e7197bcd318", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.20", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6675164c11eadd82044732dd7b6e448aa6d6f429a41a1e7d6dbf5fd358f52f26"}, + "oban": {:hex, :oban, "2.22.1", "9d2a38cec95070b31c1e274fae55f3925089f62159d8f3facabee0454d55b257", [:mix], [{:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, "~> 0.9", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.20", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "af2508c156c5b0ec30b21b0883babf7e2716af35ed5d264095896103fe3cea37"}, "octo_fetch": {:hex, :octo_fetch, "0.5.0", "f50701568b9fc752656367f82cc134d5fbefff37c5a0e8ddfcceb02ceee3f5fc", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "6226cc3c14ca948ee9f25fb0446322e5c288e215da9beba7899b6b5f4cd3ccb0"}, "owl": {:hex, :owl, "0.13.0", "26010e066d5992774268f3163506972ddac0a7e77bfe57fa42a250f24d6b876e", [:mix], [{:ucwidth, "~> 0.2", [hex: :ucwidth, repo: "hexpm", optional: true]}], "hexpm", "59bf9d11ce37a4db98f57cb68fbfd61593bf419ec4ed302852b6683d3d2f7475"}, "peep": {:hex, :peep, "3.5.0", "9f6ead7b0f2c684494200c8fc02e7e62e8c459afe861b29bd859e4c96f402ed8", [:mix], [{:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:plug, "~> 1.16", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry_metrics, "~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5a73a99c6e60062415efeb7e536a663387146463a3d3df1417da31fd665ac210"}, diff --git a/vendor/oban_web/.hex b/vendor/oban_web/.hex deleted file mode 100644 index b2dee2fe..00000000 Binary files a/vendor/oban_web/.hex and /dev/null differ diff --git a/vendor/oban_web/CHANGELOG.md b/vendor/oban_web/CHANGELOG.md index 68978f96..7f89d1c5 100644 --- a/vendor/oban_web/CHANGELOG.md +++ b/vendor/oban_web/CHANGELOG.md @@ -15,7 +15,8 @@ workflow progress, activity counts, duration, and nested sub-workflows. Workflow by properties like name, workers, or status. Clicking into a workflow brings you to a detail view with an interactive graph showing jobs as @@ -34,7 +35,8 @@ There's also a new page for viewing and managing cron entries. The table display dynamic entries with history sparklines and activity details. The cron detail view includes natural language expressions like "Daily at 8:00 and 9:00" or @@ -49,7 +51,8 @@ The job detail page is rebuilt with a full-width layout and a new timeline compo the job state machine as a branching diagram rather than a linear progression. A scoped chart displays execution history for that worker's previous jobs and jobs in an @@ -66,13 +69,45 @@ throughput for each queue. The queue sidebar provided minimal value, and it was room for the additional data displayed per-row. The queue detail page adds status badges for paused, partial, and terminating states, with pause/resume, stop, and edit buttons in the header. Partitioning controls are expanded with meta options and burst mode configuration. +## v2.12.3 - 2026-04-15 + +### Bug Fixes + +- [Dashboard] Switch icons from inline SVG to CSS masks + + CSP doesn't allow inline styles, which includes the url-masks that our app was using for icons. + This removes the icons/asset pipeline in favor of the standard Tailwind plugin approach used by + modern Phoenix apps + +## v2.12.2 - 2026-03-31 + +### Enhancements + +- [Jobs] Allow editing jobs in any state except `executing` + + `Oban.update_job/3` allows editing any non-executing job, so the detail component's edit form + should as well. + +- [Standalone] Ship inetrc in standalone Docker image for native DNS resolution (#173) + + The BEAM VM's built-in DNS resolver ignores `/etc/resolv.conf`, which prevents the standalone + image from resolving internal hostnames on platforms like Fly.io and Kubernetes with CoreDNS. + +### Bug Fixes + +- [Query] Prevent table check with non-PostgreSQL engines + + The crons and workflows table checks only apply to Pro, and only Postgres engines should check + whether the tables exist. + ## v2.12.1 - 2026-03-25 ### Bug Fixes diff --git a/vendor/oban_web/hex_metadata.config b/vendor/oban_web/hex_metadata.config index 41484ccd..18e42ba2 100644 --- a/vendor/oban_web/hex_metadata.config +++ b/vendor/oban_web/hex_metadata.config @@ -4,7 +4,7 @@ <<"https://github.com/oban-bg/oban_web/blob/main/CHANGELOG.md">>}, {<<"GitHub">>,<<"https://github.com/oban-bg/oban_web">>}]}. {<<"name">>,<<"oban_web">>}. -{<<"version">>,<<"2.12.1">>}. +{<<"version">>,<<"2.12.3">>}. {<<"description">>,<<"Dashboard for the Oban job orchestration framework">>}. {<<"elixir">>,<<"~> 1.15">>}. {<<"files">>, @@ -65,79 +65,9 @@ <<"lib/oban/web/helpers/queue_helper.ex">>,<<"lib/oban/web/assets.ex">>, <<"lib/oban/web/search.ex">>,<<"lib/oban/web/exceptions.ex">>, <<"lib/oban/web.ex">>,<<"priv/static">>,<<"priv/static/app.css">>, - <<"priv/static/icons">>,<<"priv/static/icons/solid">>, - <<"priv/static/icons/solid/pause-circle.svg">>, - <<"priv/static/icons/solid/play-circle.svg">>, - <<"priv/static/icons/solid/crossbones-circle.svg">>, - <<"priv/static/icons/special">>,<<"priv/static/icons/special/spinner.svg">>, - <<"priv/static/icons/outline">>, - <<"priv/static/icons/outline/arrow-top-right-on-square.svg">>, - <<"priv/static/icons/outline/queue-list.svg">>, - <<"priv/static/icons/outline/pause-circle.svg">>, - <<"priv/static/icons/outline/computer-desktop.svg">>, - <<"priv/static/icons/outline/cog.svg">>, - <<"priv/static/icons/outline/play-circle.svg">>, - <<"priv/static/icons/outline/x-circle.svg">>, - <<"priv/static/icons/outline/square-2x2.svg">>, - <<"priv/static/icons/outline/no-symbol.svg">>, - <<"priv/static/icons/outline/chevron-down.svg">>, - <<"priv/static/icons/outline/adjustments-horizontal.svg">>, - <<"priv/static/icons/outline/power.svg">>, - <<"priv/static/icons/outline/cog-8-tooth.svg">>, - <<"priv/static/icons/outline/sparkles.svg">>, - <<"priv/static/icons/outline/chevron-up.svg">>, - <<"priv/static/icons/outline/table-cells.svg">>, - <<"priv/static/icons/outline/arrow-path.svg">>, - <<"priv/static/icons/outline/ellipsis-horizontal-circle.svg">>, - <<"priv/static/icons/outline/chevron-right.svg">>, - <<"priv/static/icons/outline/clipboard.svg">>, - <<"priv/static/icons/outline/link.svg">>, - <<"priv/static/icons/outline/bars-arrow-down.svg">>, - <<"priv/static/icons/outline/arrow-right.svg">>, - <<"priv/static/icons/outline/pencil-square.svg">>, - <<"priv/static/icons/outline/bolt-circle.svg">>, - <<"priv/static/icons/outline/arrow-turn-down-right.svg">>, - <<"priv/static/icons/outline/arrow-path-rounded.svg">>, - <<"priv/static/icons/outline/indeterminate.svg">>, - <<"priv/static/icons/outline/check.svg">>, - <<"priv/static/icons/outline/percent-square.svg">>, - <<"priv/static/icons/outline/rectangle-group.svg">>, - <<"priv/static/icons/outline/x-mark.svg">>, - <<"priv/static/icons/outline/info-circle.svg">>, - <<"priv/static/icons/outline/arrow-right-circle.svg">>, - <<"priv/static/icons/outline/check-circle.svg">>, - <<"priv/static/icons/outline/camera.svg">>, - <<"priv/static/icons/outline/life-buoy.svg">>, - <<"priv/static/icons/outline/view-columns.svg">>, - <<"priv/static/icons/outline/bolt-slash.svg">>, - <<"priv/static/icons/outline/exclamation-circle.svg">>, - <<"priv/static/icons/outline/play-pause-circle.svg">>, - <<"priv/static/icons/outline/trash.svg">>, - <<"priv/static/icons/outline/hashtag.svg">>, - <<"priv/static/icons/outline/sun.svg">>, - <<"priv/static/icons/outline/bars-arrow-up.svg">>, - <<"priv/static/icons/outline/plus-circle.svg">>, - <<"priv/static/icons/outline/user-circle.svg">>, - <<"priv/static/icons/outline/user-group.svg">>, - <<"priv/static/icons/outline/clock.svg">>, - <<"priv/static/icons/outline/command-line.svg">>, - <<"priv/static/icons/outline/adjustments-vertical.svg">>, - <<"priv/static/icons/outline/question-mark-circle.svg">>, - <<"priv/static/icons/outline/map-pin.svg">>, - <<"priv/static/icons/outline/globe.svg">>, - <<"priv/static/icons/outline/arrow-left.svg">>, - <<"priv/static/icons/outline/magnifying-glass.svg">>, - <<"priv/static/icons/outline/minus-circle.svg">>, - <<"priv/static/icons/outline/lock-closed.svg">>, - <<"priv/static/icons/outline/arrow-trending-down.svg">>, - <<"priv/static/icons/outline/chevron-left.svg">>, - <<"priv/static/icons/outline/moon.svg">>, - <<"priv/static/icons/outline/chart-bar-square.svg">>, - <<"priv/static/icons/outline/square-stack.svg">>, - <<"priv/static/icons/outline/calendar-days.svg">>,<<"priv/static/fonts">>, - <<"priv/static/fonts/Inter.woff2">>,<<"priv/static/app.js">>, - <<"priv/timezones.txt">>,<<".formatter.exs">>,<<"mix.exs">>,<<"README.md">>, - <<"CHANGELOG.md">>,<<"LICENSE.txt">>]}. + <<"priv/static/fonts">>,<<"priv/static/fonts/Inter.woff2">>, + <<"priv/static/app.js">>,<<"priv/timezones.txt">>,<<".formatter.exs">>, + <<"mix.exs">>,<<"README.md">>,<<"CHANGELOG.md">>,<<"LICENSE.txt">>]}. {<<"app">>,<<"oban_web">>}. {<<"licenses">>,[<<"Apache-2.0">>]}. {<<"requirements">>, diff --git a/vendor/oban_web/lib/oban/web/assets.ex b/vendor/oban_web/lib/oban/web/assets.ex index d523b6b8..d5bf2216 100644 --- a/vendor/oban_web/lib/oban/web/assets.ex +++ b/vendor/oban_web/lib/oban/web/assets.ex @@ -7,20 +7,6 @@ defmodule Oban.Web.Assets do @static_path Application.app_dir(:oban_web, ["priv", "static"]) - # Icons - - icon_files = - for dir <- ["outline", "solid", "special"], - base = Path.join([@static_path, "icons", dir]), - file <- File.ls!(base), - String.ends_with?(file, ".svg") do - path = Path.join(base, file) - Module.put_attribute(__MODULE__, :external_resource, path) - {Path.join(dir, file), File.read!(path)} - end - - @icons Map.new(icon_files) - # Font @external_resource font_path = Path.join(@static_path, "fonts/Inter.woff2") @@ -65,21 +51,6 @@ defmodule Oban.Web.Assets do serve_asset(conn, @font, "font/woff2") end - def call(conn, :icon) do - icon_path = Enum.join(conn.path_params["path"], "/") - - case Map.get(@icons, icon_path) do - nil -> - conn - |> put_resp_header("content-type", "text/plain") - |> send_resp(404, "Icon not found") - |> halt() - - contents -> - serve_asset(conn, contents, "image/svg+xml") - end - end - defp serve_asset(conn, contents, content_type) do conn |> put_resp_header("content-type", content_type) diff --git a/vendor/oban_web/lib/oban/web/components/core.ex b/vendor/oban_web/lib/oban/web/components/core.ex index 80fbc0f7..ac7e4267 100644 --- a/vendor/oban_web/lib/oban/web/components/core.ex +++ b/vendor/oban_web/lib/oban/web/components/core.ex @@ -106,7 +106,7 @@ defmodule Oban.Web.Components.Core do phx-value-choice={@value} > <%= if to_string(@value) == to_string(@selected) do %> - + <% else %> <% end %> @@ -142,7 +142,7 @@ defmodule Oban.Web.Components.Core do rel="check" >
- +
""" @@ -174,9 +174,9 @@ defmodule Oban.Web.Components.Core do >
<%= if @checked == :some do %> - + <% else %> - + <% end %>
@@ -203,40 +203,41 @@ defmodule Oban.Web.Components.Core do """ end - defp badge_icon(%{name: "camera"} = assigns), do: ~H[] + defp badge_icon(%{name: "camera"} = assigns), + do: ~H[] defp badge_icon(%{name: "life_buoy"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "lock_closed"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "sparkles"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "table_cells"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "square_2x2"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "rectangle_group"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "user_group"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "link"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "power"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "pause_circle"} = assigns), - do: ~H[] + do: ~H[] defp badge_icon(%{name: "play_pause_circle"} = assigns), - do: ~H[] + do: ~H[] @doc """ An icon-only button that expands to show label on hover. Supports disabled state. @@ -309,17 +310,23 @@ defmodule Oban.Web.Components.Core do """ end - defp button_icon(%{name: "arrow_path"} = assigns), do: ~H[] + defp button_icon(%{name: "arrow_path"} = assigns), + do: ~H[] defp button_icon(%{name: "pause_circle"} = assigns), - do: ~H[] + do: ~H[] defp button_icon(%{name: "pencil_square"} = assigns), - do: ~H[] + do: ~H[] - defp button_icon(%{name: "play_circle"} = assigns), do: ~H[] - defp button_icon(%{name: "trash"} = assigns), do: ~H[] - defp button_icon(%{name: "x_circle"} = assigns), do: ~H[] + defp button_icon(%{name: "play_circle"} = assigns), + do: ~H[] + + defp button_icon(%{name: "trash"} = assigns), + do: ~H[] + + defp button_icon(%{name: "x_circle"} = assigns), + do: ~H[] # Sparkline diff --git a/vendor/oban_web/lib/oban/web/components/form_components.ex b/vendor/oban_web/lib/oban/web/components/form_components.ex index 84abf97c..a7db1ede 100644 --- a/vendor/oban_web/lib/oban/web/components/form_components.ex +++ b/vendor/oban_web/lib/oban/web/components/form_components.ex @@ -30,7 +30,7 @@ defmodule Oban.Web.FormComponents do phx-hook="Tippy" class="translate-y-px" > - + <%= if @type == "textarea" do %> @@ -110,7 +110,10 @@ defmodule Oban.Web.FormComponents do class="sr-only peer" /> -