From d22f14ad51f149e30370c109440efc4c1e8fde20 Mon Sep 17 00:00:00 2001 From: Marwin Hochfelsner <50826859+hlfan@users.noreply.github.com> Date: Mon, 3 Nov 2025 19:39:02 +0100 Subject: [PATCH] Precompute color scheme fallback in user model Co-authored-by: Pablo Brasero --- .rubocop_todo.yml | 2 +- app/assets/javascripts/leaflet.map.js | 2 -- app/controllers/application_controller.rb | 10 +--------- app/models/user.rb | 9 +++++++++ app/models/user_preference.rb | 2 ++ app/views/layouts/_head.html.erb | 6 +++--- app/views/layouts/site.html.erb | 4 ++-- app/views/preferences/basic_preferences/show.html.erb | 4 ++-- app/views/site/id.html.erb | 2 +- config/locales/en.yml | 2 +- 10 files changed, 22 insertions(+), 21 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index cb8570586..ab3ab56ae 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -66,7 +66,7 @@ Metrics/BlockNesting: # Offense count: 26 # Configuration parameters: CountComments, CountAsOne. Metrics/ClassLength: - Max: 333 + Max: 340 # Offense count: 58 # Configuration parameters: AllowedMethods, AllowedPatterns. diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index 9f638ee8f..46ab99c12 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -393,8 +393,6 @@ L.OSM.Map = L.Map.extend({ OSM.isDarkMap = function () { const mapTheme = $("body").attr("data-map-theme"); if (mapTheme) return mapTheme === "dark"; - const siteTheme = $("html").attr("data-bs-theme"); - if (siteTheme) return siteTheme === "dark"; return window.matchMedia("(prefers-color-scheme: dark)").matches; }; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 536428b9e..9f5b4866e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -274,15 +274,7 @@ class ApplicationController < ActionController::Base end end - def preferred_color_scheme(subject) - if current_user - current_user.preferences.find_by(:k => "#{subject}.color_scheme")&.v || "auto" - else - "auto" - end - end - - helper_method :preferred_editor, :preferred_color_scheme + helper_method :preferred_editor def update_totp if Settings.key?(:totp_key) diff --git a/app/models/user.rb b/app/models/user.rb index a6ca8aaf3..18a42d186 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -260,6 +260,15 @@ class User < ApplicationRecord @preferred_languages ||= Locale.list(languages) end + def preferred_color_scheme(*priority_list) + color_preferences = preferences.color_schemes.where.not(:v => "auto").pluck(:k, :v).to_h + priority_list.each do |target| + scheme = color_preferences["#{target}.color_scheme"] + return scheme unless scheme.nil? + end + nil + end + def default_diary_language diary_language_preference = preferences.find_by(:k => "diary.default_language") if diary_language_preference diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index 2bdf5f58a..61090bdda 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -18,4 +18,6 @@ class UserPreference < ApplicationRecord validates :user, :associated => true validates :k, :v, :length => 1..255, :characters => true + + scope :color_schemes, -> { where("k LIKE '%.color_scheme'") } end diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index 37d830ef6..9c7d1ff81 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -3,10 +3,10 @@ <%= javascript_include_tag "turbo", :type => "module" %> <%= javascript_include_tag "application" %> <%= javascript_include_tag "i18n/#{I18n.locale}" %> - <% if preferred_color_scheme(:site) == "auto" %> - <%= stylesheet_link_tag "screen-auto-#{dir}", :media => "screen" %> - <% else %> + <% if current_user&.preferred_color_scheme(:site) %> <%= stylesheet_link_tag "screen-manual-#{dir}", :media => "screen" %> + <% else %> + <%= stylesheet_link_tag "screen-auto-#{dir}", :media => "screen" %> <% end %> <%= stylesheet_link_tag "print-#{dir}", :media => "print" %> <%= stylesheet_link_tag "leaflet-all", :media => "screen, print" %> diff --git a/app/views/layouts/site.html.erb b/app/views/layouts/site.html.erb index f02f024a5..525ff22c1 100644 --- a/app/views/layouts/site.html.erb +++ b/app/views/layouts/site.html.erb @@ -1,10 +1,10 @@ <%= tag.html :lang => I18n.locale, :dir => dir, - :data => { :bs_theme => (preferred_color_scheme(:site) if preferred_color_scheme(:site) != "auto") } do %> + :data => { :bs_theme => current_user&.preferred_color_scheme(:site) } do %> <%= render :partial => "layouts/head" %> <%= tag.body :class => body_class, - :data => { :map_theme => (preferred_color_scheme(:map) if preferred_color_scheme(:map) != "auto") } do %> + :data => { :map_theme => current_user&.preferred_color_scheme(:map, :site) } do %> <%= render :partial => "layouts/header" %> <%= render :partial => "layouts/content" %> <% if defined?(Settings.matomo) -%> diff --git a/app/views/preferences/basic_preferences/show.html.erb b/app/views/preferences/basic_preferences/show.html.erb index aa9ab8545..cccf022a5 100644 --- a/app/views/preferences/basic_preferences/show.html.erb +++ b/app/views/preferences/basic_preferences/show.html.erb @@ -20,7 +20,7 @@ <%= label_tag "site_color_scheme", t(".preferred_site_color_scheme"), :class => "form-label" %> <%= select_tag "site_color_scheme", options_for_select(%w[auto light dark].map { |scheme| [t(".site_color_schemes.#{scheme}"), scheme] }, - preferred_color_scheme(:site)), + current_user&.preferred_color_scheme(:site) || "auto"), :class => "form-select" %> @@ -28,7 +28,7 @@ <%= label_tag "map_color_scheme", t(".preferred_map_color_scheme"), :class => "form-label" %> <%= select_tag "map_color_scheme", options_for_select(%w[auto light dark].map { |scheme| [t(".map_color_schemes.#{scheme}"), scheme] }, - preferred_color_scheme(:map)), + current_user&.preferred_color_scheme(:map) || "auto"), :class => "form-select" %> diff --git a/app/views/site/id.html.erb b/app/views/site/id.html.erb index e952f1aff..6ab876aaa 100644 --- a/app/views/site/id.html.erb +++ b/app/views/site/id.html.erb @@ -13,7 +13,7 @@ data[:token] = token.token end data[:locale] = ID::LOCALES.preferred(preferred_languages).to_s - data[:theme] = (preferred_color_scheme(:site) if preferred_color_scheme(:site) != "auto") + data[:theme] = current_user&.preferred_color_scheme(:site) data[:asset_map] = assets("iD").to_json %> <%= tag.div "", :id => "id-container", :data => data %> diff --git a/config/locales/en.yml b/config/locales/en.yml index b4f5c8669..f9763fd78 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2131,7 +2131,7 @@ en: dark: Dark preferred_map_color_scheme: Preferred Map Color Scheme map_color_schemes: - auto: Auto + auto: Same as Website light: Light dark: Dark save: Update Preferences -- 2.39.5