Adds Initials to the list of default gratavar options (#42623).

git-svn-id: https://svn.redmine.org/redmine/trunk@23767 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Marius Balteanu
2025-05-14 19:41:04 +00:00
parent 76590c2b5e
commit 66e2d1a9a9
8 changed files with 76 additions and 3 deletions

View File

@@ -44,6 +44,7 @@ module AvatarsHelper
if user.respond_to?(:mail)
email = user.mail
options[:title] = user.name unless options[:title]
options[:initials] = user.initials if options[:default] == "initials"
elsif user.to_s =~ %r{<(.+?)>}
email = $1
end

View File

@@ -244,6 +244,7 @@ module SettingsHelper
['Mystery man', 'mm'],
['Retro', 'retro'],
['Robohash', 'robohash'],
['Wavatars', 'wavatar']]
['Wavatars', 'wavatar'],
['Initials', 'initials']]
end
end

View File

@@ -28,46 +28,55 @@ class User < Principal
USER_FORMATS = {
:firstname_lastname => {
:string => '#{firstname} #{lastname}',
:initials => '#{firstname.to_s.first}#{lastname.to_s.first}',
:order => %w(firstname lastname id),
:setting_order => 1
},
:firstname_lastinitial => {
:string => '#{firstname} #{lastname.to_s.chars.first}.',
:initials => '#{firstname.to_s.first}#{lastname.to_s.first}',
:order => %w(firstname lastname id),
:setting_order => 2
},
:firstinitial_lastname => {
:string => '#{firstname.to_s.gsub(/(([[:alpha:]])[[:alpha:]]*\.?)/, \'\2.\')} #{lastname}',
:initials => '#{firstname.to_s.gsub(/(([[:alpha:]])[[:alpha:]]*\.?)/, \'\2.\').first}#{lastname.to_s.first}',
:order => %w(firstname lastname id),
:setting_order => 2
},
:firstname => {
:string => '#{firstname}',
:initials => '#{firstname.to_s.first(2)}',
:order => %w(firstname id),
:setting_order => 3
},
:lastname_firstname => {
:string => '#{lastname} #{firstname}',
:initials => '#{lastname.to_s.first}#{firstname.to_s.first}',
:order => %w(lastname firstname id),
:setting_order => 4
},
:lastnamefirstname => {
:string => '#{lastname}#{firstname}',
:initials => '#{lastname.to_s.first}#{firstname.to_s.first}',
:order => %w(lastname firstname id),
:setting_order => 5
},
:lastname_comma_firstname => {
:string => '#{lastname}, #{firstname}',
:initials => '#{lastname.to_s.first}#{firstname.to_s.first}',
:order => %w(lastname firstname id),
:setting_order => 6
},
:lastname => {
:string => '#{lastname}',
:initials => '#{lastname.to_s.first(2)}',
:order => %w(lastname id),
:setting_order => 7
},
:username => {
:string => '#{login}',
:initials => '#{login.to_s.first(2)}',
:order => %w(login id),
:setting_order => 8
},
@@ -275,6 +284,14 @@ class User < Principal
end
end
# Return user's initials based on name format
def initials(formatter = nil)
f = self.class.name_formatter(formatter)
format = f[:initials] || USER_FORMATS[:firstname_lastname][:initials]
initials = eval('"' + format + '"')
initials.upcase
end
def registered?
self.status == STATUS_REGISTERED
end

View File

@@ -22,7 +22,12 @@
<p><%= setting_check_box :gravatar_enabled, :data => {:enables => '#settings_gravatar_default'} %>
<em class="info"><%= t(:text_avatar_server_config_html, :url => Redmine::Configuration['avatar_server_url']) %></em></p>
<p><%= setting_select :gravatar_default, gravatar_default_setting_options, :blank => :label_none %></p>
<p>
<%= setting_select :gravatar_default, gravatar_default_setting_options, :blank => :label_none %>
<em class="<%= Setting.gravatar_default == "initials" ? "info" : "hidden" %>">
<%= t(:text_setting_gravatar_default_initials_html) %>
</em>
</p>
<p><%= setting_check_box :thumbnails_enabled, :data => {:enables => '#settings_thumbnails_size'} %></p>
@@ -35,3 +40,18 @@
<%= submit_tag l(:button_save) %>
<% end %>
<%= javascript_tag do %>
$('#settings_gravatar_default').on('change', function(e){
const gravatar_default = e.target.value;
const em = e.target.parentElement.getElementsByTagName('em')[0];
if (gravatar_default === 'initials') {
em.classList.remove('hidden');
em.classList.add('info');
} else {
em.classList.add('hidden');
em.classList.remove('info');
}
});
<% end %>

View File

@@ -1342,6 +1342,7 @@ en:
text_no_subject: no subject
text_allowed_queries_to_select: Public (to any users) queries only selectable
text_setting_config_change: You can configure the behaviour in config/configuration.yml. Please restart the application after editing it.
text_setting_gravatar_default_initials_html: Users' initials are sent to <a href="https://www.gravatar.com">https://www.gravatar.com</a> to generate their avatars.
default_role_manager: Manager
default_role_developer: Developer

View File

@@ -69,7 +69,7 @@ module GravatarHelper
options[:default] = CGI::escape(options[:default]) unless options[:default].nil?
gravatar_api_url(email_hash).tap do |url|
opts = []
[:rating, :size, :default].each do |opt|
[:rating, :size, :default, :initials].each do |opt|
unless options[opt].nil?
value = h(options[opt])
opts << [opt, value].join('=')

View File

@@ -68,6 +68,18 @@ class AvatarsHelperTest < Redmine::HelperTest
assert_include 'class="gravatar picture"', avatar('jsmith <jsmith@somenet.foo>', :class => 'picture')
end
def test_avatar_with_initials
with_settings :gravatar_default => 'initials' do
assert_include 'initials="RA"', avatar(User.find(1))
end
end
def test_avatar_should_reject_initials_if_default_is_not_initials
with_settings :gravatar_default => 'identicon' do
assert_not_include 'initials="RA"', avatar(User.find(1))
end
end
def test_avatar_disabled
with_settings :gravatar_enabled => '0' do
assert_equal '', avatar(User.find_by_mail('jsmith@somenet.foo'))

View File

@@ -589,6 +589,27 @@ class UserTest < ActiveSupport::TestCase
end
end
def test_initials_format
assert_equal 'JS', @jsmith.initials(:firstname_lastinitial)
assert_equal 'SJ', @jsmith.initials(:lastname_comma_firstname)
assert_equal 'SJ', @jsmith.initials(:lastname_firstname)
assert_equal 'JS', @jsmith.initials(:firstinitial_lastname)
assert_equal 'JL', User.new(:firstname => 'Jean-Philippe', :lastname => 'Lang').initials(:firstinitial_lastname)
assert_equal 'JS', @jsmith.initials(:undefined_format)
end
def test_initials_should_use_setting_as_default_format
with_settings :user_format => :firstname_lastname do
assert_equal 'JS', @jsmith.reload.initials
end
with_settings :user_format => :username do
assert_equal 'JS', @jsmith.reload.initials
end
with_settings :user_format => :lastname do
assert_equal 'SM', @jsmith.reload.initials
end
end
def test_lastname_should_accept_255_characters
u = User.first
u.lastname = 'a' * 255