From 41d3d4da803d75b265fc69bf88b752eac94bca70 Mon Sep 17 00:00:00 2001 From: Vishal Sadriya Date: Tue, 12 May 2026 15:19:52 +0530 Subject: [PATCH 1/7] refactor: migrate dashboard rendering to ERB views (WIP) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces 11 *Presenter classes with app/views/**.html.erb plus app/helpers/solid_queue_monitor/* helpers. Serves CSS/JS via a new AssetsController with content-hashed URLs, removing the need for inline - HTML - end - - def generate_body - <<-HTML - #{render_message} -
- #{generate_header} -
-

#{@title}

- #{@content} -
- #{generate_footer} -
- #{generate_auto_refresh_script} - #{generate_chart_script} - HTML - end - - def render_message - return '' unless @message - - class_name = @message_type == 'success' ? 'message-success' : 'message-error' - <<-HTML -
#{@message}
- #{script_tag_open} - document.addEventListener('DOMContentLoaded', function() { - var el = document.getElementById('flash-message'); - if (!el) return; - setTimeout(function() { - el.classList.add('is-fading'); - setTimeout(function() { el.classList.add('is-hidden'); }, 500); - }, 5000); - }); - - HTML - end - - def generate_header - nav_items = [ - { path: root_path, label: 'Overview', match: 'Overview' }, - { path: ready_jobs_path, label: 'Ready Jobs', match: 'Ready Jobs' }, - { path: in_progress_jobs_path, label: 'In Progress Jobs', match: 'In Progress' }, - { path: scheduled_jobs_path, label: 'Scheduled Jobs', match: 'Scheduled Jobs' }, - { path: recurring_jobs_path, label: 'Recurring Jobs', match: 'Recurring Jobs' }, - { path: failed_jobs_path, label: 'Failed Jobs', match: 'Failed Jobs' }, - { path: queues_path, label: 'Queues', match: 'Queues' }, - { path: workers_path, label: 'Workers', match: 'Workers' } - ] - - nav_links = nav_items.map do |item| - active_class = @title&.include?(item[:match]) ? 'active' : '' - "#{item[:label]}" - end.join("\n ") - - <<-HTML -
-
-

Solid Queue Monitor

- #{generate_search_box} -
- #{generate_auto_refresh_controls} - #{generate_theme_toggle} -
-
- -
- HTML - end - - def generate_footer - <<-HTML - - HTML - end - - def generate_search_box - search_value = @search_query ? escape_html(@search_query) : '' - <<-HTML -
- - -
- HTML - end - - def escape_html(text) - text.to_s.gsub('&', '&').gsub('<', '<').gsub('>', '>').gsub('"', '"') - end - - def style_tag_open - @nonce ? %(