diff --git a/Gemfile b/Gemfile index 234a0863a..85fc23156 100644 --- a/Gemfile +++ b/Gemfile @@ -97,3 +97,5 @@ gem "sqlite3_ar_regexp", "~> 2.2" gem "mittsu", github: "danini-the-panini/mittsu", ref: "7f44c46" gem "view_component", "~> 3.10" + +gem "rails-controller-testing", "~> 1.0", group: :test diff --git a/Gemfile.lock b/Gemfile.lock index 227d01dec..336c44fa2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -300,6 +300,10 @@ GEM activesupport (= 7.0.8) bundler (>= 1.15.0) railties (= 7.0.8) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -506,6 +510,7 @@ DEPENDENCIES public_suffix (~> 5.0) puma (~> 6.4) rails (~> 7.0.8) + rails-controller-testing (~> 1.0) rails-settings-cached (~> 2.9) redis (~> 5.0) rspec-rails diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb index 293feb3d3..998537c4e 100644 --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -1,6 +1,6 @@ class ProblemsController < ApplicationController def index page = params[:page] || 1 - @problems = Problem.all.page(page).per(50).order([:category, :problematic_type]) + @problems = Problem.visible(current_user.problem_settings).page(page).per(50).order([:category, :problematic_type]) end end diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index a68e416f0..31aae141c 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -10,6 +10,7 @@ def update update_pagination_settings(params[:pagination]) update_renderer_settings(params[:renderer]) update_tag_cloud_settings(params[:tag_cloud]) + update_problem_settings(params[:problems]) @user.save! # Save site-wide settings if user is an admin if current_user.admin? @@ -56,6 +57,11 @@ def update_renderer_settings(settings) } end + def update_problem_settings(settings) + return unless settings + @user.problem_settings = settings + end + def update_folder_settings(settings) return unless settings SiteSettings.model_path_template = settings[:model_path_template].gsub(/^\//, "") # Remove leading slashes diff --git a/app/helpers/problems_helper.rb b/app/helpers/problems_helper.rb index ed6c6d996..8a8652620 100644 --- a/app/helpers/problems_helper.rb +++ b/app/helpers/problems_helper.rb @@ -1,18 +1,10 @@ module ProblemsHelper def problem_severity(problem) - case problem.category.to_sym - when :missing - "danger" - when :nesting, :duplicate - "warning" - else - "info" - end + current_user.problem_settings[problem.category]&.to_sym || :silent end def max_problem_severity - return "danger" if Problem.where(category: :missing).count > 0 - return "warning" if Problem.where(category: [:nesting, :duplicate]).count > 0 - "info" + severities = Problem.select(:category).distinct.map { |p| problem_severity(p) } + severities.max_by { |p| Problem::SEVERITIES.find_index(p) } end end diff --git a/app/models/problem.rb b/app/models/problem.rb index 3851138af..56a756556 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -3,7 +3,12 @@ class Problem < ApplicationRecord validates :category, uniqueness: {scope: :problematic}, presence: true - enum :category, [ + scope :visible, ->(settings) { + enabled = settings.select { |cat, sev| sev.to_sym != :silent } + where(category: enabled.keys) + } + + CATEGORIES = [ :missing, :empty, :destination_exists, # No longer used, but kept for compatibility @@ -11,6 +16,22 @@ class Problem < ApplicationRecord :inefficient, :duplicate ] + enum :category, CATEGORIES + + SEVERITIES = [ + :silent, + :info, + :warning, + :danger + ] + + DEFAULT_SEVERITIES = { + missing: :danger, + empty: :info, + nesting: :warning, + inefficient: :info, + duplicate: :warning + } def self.create_or_clear(problematic, cat, present, options = {}) if present diff --git a/app/views/application/_navbar.html.erb b/app/views/application/_navbar.html.erb index 18fcf59c1..557c45b55 100644 --- a/app/views/application/_navbar.html.erb +++ b/app/views/application/_navbar.html.erb @@ -50,7 +50,7 @@ <% end %> - <% if Problem.count > 0 %> + <% if Problem.visible(current_user.problem_settings).count > 0 %>
+ <%= t(".description") %> +
+ <% Problem::CATEGORIES.each do |category| %> + <% next if Problem::DEFAULT_SEVERITIES[category].nil? # Skip deprecated categories; they don't appear in the defaults list %> +diff --git a/app/views/settings/_tag_cloud_settings.html.erb b/app/views/settings/_tag_cloud_settings.html.erb index bf4fe2728..69c2ff415 100644 --- a/app/views/settings/_tag_cloud_settings.html.erb +++ b/app/views/settings/_tag_cloud_settings.html.erb @@ -1,33 +1,36 @@ -