From 90741bb7f0a18889269e8088b838e86906b6d32e Mon Sep 17 00:00:00 2001 From: MAEDA Go Date: Sat, 14 Feb 2026 16:48:20 +0900 Subject: [PATCH] Make firstname/lastname field order follow Users display format --- app/models/user.rb | 8 ++++++++ app/models/user_query.rb | 7 ++++++- app/views/account/register.html.erb | 5 +++++ app/views/my/account.html.erb | 9 +++++++-- app/views/users/_form.html.erb | 9 +++++++-- test/functional/account_controller_test.rb | 9 +++++++++ test/functional/my_controller_test.rb | 9 +++++++++ test/functional/users_controller_test.rb | 23 ++++++++++++++++++++++ test/unit/user_query_test.rb | 14 +++++++++++++ test/unit/user_test.rb | 13 ++++++++++++ 10 files changed, 101 insertions(+), 5 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 124755775..bec279eb2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -266,6 +266,14 @@ class User < Principal USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname] end + # Returns true if the selected user format puts lastname before firstname. + def self.lastname_before_firstname?(formatter = nil) + order = name_formatter(formatter)[:order] + return false unless order.include?('firstname') && order.include?('lastname') + + order.index('lastname') < order.index('firstname') + end + # Returns an array of fields names than can be used to make an order statement for users # according to how user names are displayed # Examples: diff --git a/app/models/user_query.rb b/app/models/user_query.rb index fc8ba6463..a174e7134 100644 --- a/app/models/user_query.rb +++ b/app/models/user_query.rb @@ -113,7 +113,12 @@ class UserQuery < Query end def default_columns_names - @default_columns_names ||= [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on] + @default_columns_names ||= + if !User.lastname_before_firstname? + [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on] + else + [:login, :lastname, :firstname, :mail, :admin, :created_on, :last_login_on] + end end def default_sort_criteria diff --git a/app/views/account/register.html.erb b/app/views/account/register.html.erb index 05f2315ff..4d3ed464a 100644 --- a/app/views/account/register.html.erb +++ b/app/views/account/register.html.erb @@ -16,8 +16,13 @@

<%= f.password_field :password_confirmation, :size => 25, :required => true %>

<% end %> +<% if User.lastname_before_firstname? %> +

<%= f.text_field :lastname, :required => true %>

+

<%= f.text_field :firstname, :required => true %>

+<% else %>

<%= f.text_field :firstname, :required => true %>

<%= f.text_field :lastname, :required => true %>

+<% end %>

<%= f.text_field :mail, :required => true %>

<%= labelled_fields_for :pref, @user.pref do |pref_fields| %>

<%= pref_fields.check_box :hide_mail %>

diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb index 4073a3a0c..44e4b0f86 100644 --- a/app/views/my/account.html.erb +++ b/app/views/my/account.html.erb @@ -21,8 +21,13 @@
<%=l(:label_information_plural)%> -

<%= f.text_field :firstname, :required => true %>

-

<%= f.text_field :lastname, :required => true %>

+ <% if User.lastname_before_firstname? %> +

<%= f.text_field :lastname, :required => true %>

+

<%= f.text_field :firstname, :required => true %>

+ <% else %> +

<%= f.text_field :firstname, :required => true %>

+

<%= f.text_field :lastname, :required => true %>

+ <% end %>

<%= f.text_field :mail, :required => true %>

<% unless @user.force_default_language? %>

<%= f.select :language, lang_options_for_select %>

diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb index 2f7c73484..c5f72208e 100644 --- a/app/views/users/_form.html.erb +++ b/app/views/users/_form.html.erb @@ -7,8 +7,13 @@
<%=l(:label_information_plural)%>

<%= f.text_field :login, :required => true, :size => 25 %>

-

<%= f.text_field :firstname, :required => true %>

-

<%= f.text_field :lastname, :required => true %>

+ <% if User.lastname_before_firstname? %> +

<%= f.text_field :lastname, :required => true %>

+

<%= f.text_field :firstname, :required => true %>

+ <% else %> +

<%= f.text_field :firstname, :required => true %>

+

<%= f.text_field :lastname, :required => true %>

+ <% end %>

<%= f.text_field :mail, :required => true %>

<% unless @user.force_default_language? %>

<%= f.select :language, lang_options_for_select %>

diff --git a/test/functional/account_controller_test.rb b/test/functional/account_controller_test.rb index 0fcaa1a2e..cac90bedb 100644 --- a/test/functional/account_controller_test.rb +++ b/test/functional/account_controller_test.rb @@ -296,6 +296,15 @@ class AccountControllerTest < Redmine::ControllerTest end end + def test_get_register_should_show_lastname_before_firstname_when_user_format_requires_it + with_settings :self_registration => '3', :user_format => 'lastname_firstname' do + get :register + assert_response :success + + assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"') + end + end + def test_get_register_should_detect_user_language with_settings :self_registration => '3' do @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' diff --git a/test/functional/my_controller_test.rb b/test/functional/my_controller_test.rb index d82660b7f..8ea18db2c 100644 --- a/test/functional/my_controller_test.rb +++ b/test/functional/my_controller_test.rb @@ -398,6 +398,15 @@ class MyControllerTest < Redmine::ControllerTest assert_select 'select[name=?]', 'user[language]' end + def test_my_account_should_show_lastname_before_firstname_when_user_format_requires_it + with_settings :user_format => 'lastname_firstname' do + get :account + assert_response :success + + assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"') + end + end + def test_my_account_should_toggle_webhook_link_with_setting User.find(2).roles.first.add_permission!(:use_webhooks) diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index 6b5e3aebf..06dfd4055 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -37,6 +37,20 @@ class UsersControllerTest < Redmine::ControllerTest assert_select "tr#user-#{locked.id}", 0 end + def test_index_default_columns_should_show_lastname_before_firstname_when_user_format_requires_it + with_settings user_format: 'lastname_firstname' do + get :index + assert_response :success + + lastname_header = @response.body.match(/]*class="[^"]*\blastname\b[^"]*"[^>]*>/) + firstname_header = @response.body.match(/]*class="[^"]*\bfirstname\b[^"]*"[^>]*>/) + + assert_not_nil lastname_header + assert_not_nil firstname_header + assert_operator lastname_header.begin(0), :<, firstname_header.begin(0) + end + end + def test_index_with_status_filter get :index, params: { set_filter: 1, f: ['status'], op: {status: '='}, v: {status: [3]} } assert_response :success @@ -444,6 +458,15 @@ class UsersControllerTest < Redmine::ControllerTest assert_select 'label[for=?]>span.required', 'user_password', 1 end + def test_new_should_show_lastname_before_firstname_when_user_format_requires_it + with_settings :user_format => 'lastname_firstname' do + get :new + assert_response :success + + assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"') + end + end + def test_create assert_difference 'User.count' do assert_difference 'ActionMailer::Base.deliveries.size' do diff --git a/test/unit/user_query_test.rb b/test/unit/user_query_test.rb index ef31ba2c2..356886c5b 100644 --- a/test/unit/user_query_test.rb +++ b/test/unit/user_query_test.rb @@ -19,6 +19,20 @@ require_relative '../test_helper' class UserQueryTest < ActiveSupport::TestCase + def test_default_columns_names_should_show_lastname_before_firstname_when_user_format_requires_it + with_settings user_format: 'lastname_firstname' do + assert_equal [:login, :lastname, :firstname, :mail, :admin, :created_on, :last_login_on], + UserQuery.new.default_columns_names + end + end + + def test_default_columns_names_should_show_firstname_before_lastname_when_user_format_is_default + with_settings user_format: 'firstname_lastname' do + assert_equal [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on], + UserQuery.new.default_columns_names + end + end + def test_available_columns_should_include_user_custom_fields query = UserQuery.new assert_include :cf_4, query.available_columns.map(&:name) diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index c98e39dc9..d7b170970 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -691,6 +691,19 @@ class UserTest < ActiveSupport::TestCase end end + def test_lastname_before_firstname_should_return_true_with_lastname_firstname_format + assert User.lastname_before_firstname?(:lastname_firstname) + end + + def test_lastname_before_firstname_should_return_false_with_firstname_lastname_format + assert_not User.lastname_before_firstname?(:firstname_lastname) + end + + def test_lastname_before_firstname_should_return_false_with_format_without_both_name_parts + assert_not User.lastname_before_firstname?(:username) + assert_not User.lastname_before_firstname?(:lastname) + end + test ".try_to_login with good credentials should return the user" do user = User.try_to_login("admin", "admin") assert_kind_of User, user -- 2.50.1