diff --git a/app/assets/stylesheets/solid_queue_web/application.css b/app/assets/stylesheets/solid_queue_web/application.css index 24a7cd3..5a06bea 100644 --- a/app/assets/stylesheets/solid_queue_web/application.css +++ b/app/assets/stylesheets/solid_queue_web/application.css @@ -359,6 +359,33 @@ tbody tr:hover { background: var(--bg); } color: #fff; } +/* Period filter */ +.sqd-period-filter { + display: flex; + align-items: center; + gap: 0.25rem; + margin-left: auto; +} + +.sqd-period-filter a { + padding: 0.2rem 0.55rem; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + text-decoration: none; + border: 1px solid var(--border); + color: var(--muted); + background: var(--surface); + transition: all 0.1s; +} + +.sqd-period-filter a:hover, +.sqd-period-filter a.active { + background: var(--muted); + border-color: var(--muted); + color: #fff; +} + /* Code / monospace */ .sqd-mono { font-family: "SFMono-Regular", Menlo, Monaco, Consolas, monospace; diff --git a/app/controllers/solid_queue_web/application_controller.rb b/app/controllers/solid_queue_web/application_controller.rb index 8b8e5ba..9fb96ea 100644 --- a/app/controllers/solid_queue_web/application_controller.rb +++ b/app/controllers/solid_queue_web/application_controller.rb @@ -2,6 +2,8 @@ module SolidQueueWeb class ApplicationController < ActionController::Base include Pagy::Method + PERIOD_DURATIONS = { "1h" => 1.hour, "24h" => 24.hours, "7d" => 7.days }.freeze + before_action :authenticate! private diff --git a/app/controllers/solid_queue_web/failed_jobs_controller.rb b/app/controllers/solid_queue_web/failed_jobs_controller.rb index 989706f..4067107 100644 --- a/app/controllers/solid_queue_web/failed_jobs_controller.rb +++ b/app/controllers/solid_queue_web/failed_jobs_controller.rb @@ -25,14 +25,14 @@ def destroy def retry_all jobs = filtered_scope.map(&:job) SolidQueue::FailedExecution.retry_all(jobs) - redirect_to failed_jobs_path(queue: @queue, q: @search), + redirect_to failed_jobs_path(queue: @queue, q: @search, period: @period), notice: "#{jobs.size} #{"job".pluralize(jobs.size)} queued for retry." end def discard_all jobs = filtered_scope.map(&:job) SolidQueue::FailedExecution.discard_all_from_jobs(jobs) - redirect_to failed_jobs_path(queue: @queue, q: @search), + redirect_to failed_jobs_path(queue: @queue, q: @search, period: @period), notice: "#{jobs.size} #{"job".pluralize(jobs.size)} discarded." end @@ -41,12 +41,14 @@ def discard_all def set_filter_params @queue = params[:queue].presence @search = params[:q].presence + @period = params[:period].presence_in(PERIOD_DURATIONS.keys) end def filtered_scope scope = SolidQueue::FailedExecution.includes(:job) scope = scope.references(:job).where(solid_queue_jobs: { queue_name: @queue }) if @queue.present? scope = scope.references(:job).where("solid_queue_jobs.class_name LIKE ?", "%#{@search}%") if @search.present? + scope = scope.references(:job).where("solid_queue_jobs.created_at >= ?", PERIOD_DURATIONS[@period].ago) if @period.present? scope end end diff --git a/app/controllers/solid_queue_web/jobs_controller.rb b/app/controllers/solid_queue_web/jobs_controller.rb index c4fde60..6370401 100644 --- a/app/controllers/solid_queue_web/jobs_controller.rb +++ b/app/controllers/solid_queue_web/jobs_controller.rb @@ -5,8 +5,10 @@ class JobsController < ApplicationController def index @status = params[:status].presence_in(Job::STATUSES) || "ready" @search = params[:q].presence + @period = params[:period].presence_in(PERIOD_DURATIONS.keys) @jobs = Job::EXECUTION_MODELS[@status].includes(:job) @jobs = @jobs.references(:job).where("solid_queue_jobs.class_name LIKE ?", "%#{@search}%") if @search.present? + @jobs = @jobs.references(:job).where("solid_queue_jobs.created_at >= ?", PERIOD_DURATIONS[@period].ago) if @period.present? @pagy, @jobs = pagy(@jobs.order(created_at: :desc)) end @@ -24,24 +26,24 @@ def destroy @remaining_count = filtered_scope(model).count respond_to do |format| format.turbo_stream - format.html { redirect_to jobs_path(status: @status), notice: "Job discarded." } + format.html { redirect_to jobs_path(status: @status, period: @period), notice: "Job discarded." } end rescue ArgumentError => e - redirect_to jobs_path(status: @status), alert: e.message + redirect_to jobs_path(status: @status, period: @period), alert: e.message rescue => e - redirect_to jobs_path(status: @status), alert: "Could not discard job: #{e.message}" + redirect_to jobs_path(status: @status, period: @period), alert: "Could not discard job: #{e.message}" end def discard_all model = execution_model_for!(@status) jobs = filtered_scope(model).map(&:job) model.discard_all_from_jobs(jobs) - redirect_to jobs_path(status: @status), + redirect_to jobs_path(status: @status, period: @period), notice: "#{jobs.size} #{"job".pluralize(jobs.size)} discarded." rescue ArgumentError => e - redirect_to jobs_path(status: @status), alert: e.message + redirect_to jobs_path(status: @status, period: @period), alert: e.message rescue => e - redirect_to jobs_path(status: @status), alert: "Could not discard jobs: #{e.message}" + redirect_to jobs_path(status: @status, period: @period), alert: "Could not discard jobs: #{e.message}" end private @@ -57,10 +59,13 @@ def derive_status(job) def set_status @status = params[:status] + @period = params[:period].presence_in(PERIOD_DURATIONS.keys) end def filtered_scope(model) - model.includes(:job) + scope = model.includes(:job) + scope = scope.references(:job).where("solid_queue_jobs.created_at >= ?", PERIOD_DURATIONS[@period].ago) if @period.present? + scope end def execution_model_for!(status) diff --git a/app/views/solid_queue_web/failed_jobs/index.html.erb b/app/views/solid_queue_web/failed_jobs/index.html.erb index 475501d..250330c 100644 --- a/app/views/solid_queue_web/failed_jobs/index.html.erb +++ b/app/views/solid_queue_web/failed_jobs/index.html.erb @@ -4,12 +4,12 @@
Filtering by queue: <%= @queue %> — - <%= link_to "Clear filter", failed_jobs_path(q: @search) %> + <%= link_to "Clear filter", failed_jobs_path(q: @search, period: @period) %>
<% end %> \ No newline at end of file diff --git a/app/views/solid_queue_web/jobs/index.html.erb b/app/views/solid_queue_web/jobs/index.html.erb index c095a4d..8194148 100644 --- a/app/views/solid_queue_web/jobs/index.html.erb +++ b/app/views/solid_queue_web/jobs/index.html.erb @@ -5,17 +5,17 @@