Project

General

Profile

Feature #4507 ยป 0001-Make-firstname-lastname-field-order-follow-Users-dis.patch

Go MAEDA, 2026-02-14 09:02

View differences:

app/models/user.rb
266 266
    USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname]
267 267
  end
268 268

  
269
  # Returns true if the selected user format puts lastname before firstname.
270
  def self.lastname_before_firstname?(formatter = nil)
271
    order = name_formatter(formatter)[:order]
272
    return false unless order.include?('firstname') && order.include?('lastname')
273

  
274
    order.index('lastname') < order.index('firstname')
275
  end
276

  
269 277
  # Returns an array of fields names than can be used to make an order statement for users
270 278
  # according to how user names are displayed
271 279
  # Examples:
app/models/user_query.rb
113 113
  end
114 114

  
115 115
  def default_columns_names
116
    @default_columns_names ||= [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on]
116
    @default_columns_names ||=
117
      if !User.lastname_before_firstname?
118
        [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on]
119
      else
120
        [:login, :lastname, :firstname, :mail, :admin, :created_on, :last_login_on]
121
      end
117 122
  end
118 123

  
119 124
  def default_sort_criteria
app/views/account/register.html.erb
16 16
  <p><%= f.password_field :password_confirmation, :size => 25, :required => true %></p>
17 17
<% end %>
18 18

  
19
<% if User.lastname_before_firstname? %>
20
<p><%= f.text_field :lastname, :required => true %></p>
21
<p><%= f.text_field :firstname, :required => true %></p>
22
<% else %>
19 23
<p><%= f.text_field :firstname, :required => true %></p>
20 24
<p><%= f.text_field :lastname, :required => true %></p>
25
<% end %>
21 26
<p><%= f.text_field :mail, :required => true %></p>
22 27
<%= labelled_fields_for :pref, @user.pref do |pref_fields| %>
23 28
<p><%= pref_fields.check_box :hide_mail %></p>
app/views/my/account.html.erb
21 21
<div class="splitcontentleft">
22 22
<fieldset class="box tabular">
23 23
  <legend><%=l(:label_information_plural)%></legend>
24
  <p><%= f.text_field :firstname, :required => true %></p>
25
  <p><%= f.text_field :lastname, :required => true %></p>
24
  <% if User.lastname_before_firstname? %>
25
    <p><%= f.text_field :lastname, :required => true %></p>
26
    <p><%= f.text_field :firstname, :required => true %></p>
27
  <% else %>
28
    <p><%= f.text_field :firstname, :required => true %></p>
29
    <p><%= f.text_field :lastname, :required => true %></p>
30
  <% end %>
26 31
  <p><%= f.text_field :mail, :required => true %></p>
27 32
  <% unless @user.force_default_language? %>
28 33
  <p><%= f.select :language, lang_options_for_select %></p>
app/views/users/_form.html.erb
7 7
<fieldset class="box tabular">
8 8
  <legend><%=l(:label_information_plural)%></legend>
9 9
  <p><%= f.text_field :login, :required => true, :size => 25  %></p>
10
  <p><%= f.text_field :firstname, :required => true %></p>
11
  <p><%= f.text_field :lastname, :required => true %></p>
10
  <% if User.lastname_before_firstname? %>
11
    <p><%= f.text_field :lastname, :required => true %></p>
12
    <p><%= f.text_field :firstname, :required => true %></p>
13
  <% else %>
14
    <p><%= f.text_field :firstname, :required => true %></p>
15
    <p><%= f.text_field :lastname, :required => true %></p>
16
  <% end %>
12 17
  <p><%= f.text_field :mail, :required => true %></p>
13 18
  <% unless @user.force_default_language? %>
14 19
  <p><%= f.select :language, lang_options_for_select %></p>
test/functional/account_controller_test.rb
296 296
    end
297 297
  end
298 298

  
299
  def test_get_register_should_show_lastname_before_firstname_when_user_format_requires_it
300
    with_settings :self_registration => '3', :user_format => 'lastname_firstname' do
301
      get :register
302
      assert_response :success
303

  
304
      assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"')
305
    end
306
  end
307

  
299 308
  def test_get_register_should_detect_user_language
300 309
    with_settings :self_registration => '3' do
301 310
      @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
test/functional/my_controller_test.rb
398 398
    assert_select 'select[name=?]', 'user[language]'
399 399
  end
400 400

  
401
  def test_my_account_should_show_lastname_before_firstname_when_user_format_requires_it
402
    with_settings :user_format => 'lastname_firstname' do
403
      get :account
404
      assert_response :success
405

  
406
      assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"')
407
    end
408
  end
409

  
401 410
  def test_my_account_should_toggle_webhook_link_with_setting
402 411
    User.find(2).roles.first.add_permission!(:use_webhooks)
403 412

  
test/functional/users_controller_test.rb
37 37
    assert_select "tr#user-#{locked.id}", 0
38 38
  end
39 39

  
40
  def test_index_default_columns_should_show_lastname_before_firstname_when_user_format_requires_it
41
    with_settings user_format: 'lastname_firstname' do
42
      get :index
43
      assert_response :success
44

  
45
      lastname_header = @response.body.match(/<th[^>]*class="[^"]*\blastname\b[^"]*"[^>]*>/)
46
      firstname_header = @response.body.match(/<th[^>]*class="[^"]*\bfirstname\b[^"]*"[^>]*>/)
47

  
48
      assert_not_nil lastname_header
49
      assert_not_nil firstname_header
50
      assert_operator lastname_header.begin(0), :<, firstname_header.begin(0)
51
    end
52
  end
53

  
40 54
  def test_index_with_status_filter
41 55
    get :index, params: { set_filter: 1, f: ['status'], op: {status: '='}, v: {status: [3]} }
42 56
    assert_response :success
......
444 458
    assert_select 'label[for=?]>span.required', 'user_password', 1
445 459
  end
446 460

  
461
  def test_new_should_show_lastname_before_firstname_when_user_format_requires_it
462
    with_settings :user_format => 'lastname_firstname' do
463
      get :new
464
      assert_response :success
465

  
466
      assert_operator @response.body.index('id="user_lastname"'), :<, @response.body.index('id="user_firstname"')
467
    end
468
  end
469

  
447 470
  def test_create
448 471
    assert_difference 'User.count' do
449 472
      assert_difference 'ActionMailer::Base.deliveries.size' do
test/unit/user_query_test.rb
19 19
require_relative '../test_helper'
20 20

  
21 21
class UserQueryTest < ActiveSupport::TestCase
22
  def test_default_columns_names_should_show_lastname_before_firstname_when_user_format_requires_it
23
    with_settings user_format: 'lastname_firstname' do
24
      assert_equal [:login, :lastname, :firstname, :mail, :admin, :created_on, :last_login_on],
25
                   UserQuery.new.default_columns_names
26
    end
27
  end
28

  
29
  def test_default_columns_names_should_show_firstname_before_lastname_when_user_format_is_default
30
    with_settings user_format: 'firstname_lastname' do
31
      assert_equal [:login, :firstname, :lastname, :mail, :admin, :created_on, :last_login_on],
32
                   UserQuery.new.default_columns_names
33
    end
34
  end
35

  
22 36
  def test_available_columns_should_include_user_custom_fields
23 37
    query = UserQuery.new
24 38
    assert_include :cf_4, query.available_columns.map(&:name)
test/unit/user_test.rb
691 691
    end
692 692
  end
693 693

  
694
  def test_lastname_before_firstname_should_return_true_with_lastname_firstname_format
695
    assert User.lastname_before_firstname?(:lastname_firstname)
696
  end
697

  
698
  def test_lastname_before_firstname_should_return_false_with_firstname_lastname_format
699
    assert_not User.lastname_before_firstname?(:firstname_lastname)
700
  end
701

  
702
  def test_lastname_before_firstname_should_return_false_with_format_without_both_name_parts
703
    assert_not User.lastname_before_firstname?(:username)
704
    assert_not User.lastname_before_firstname?(:lastname)
705
  end
706

  
694 707
  test ".try_to_login with good credentials should return the user" do
695 708
    user = User.try_to_login("admin", "admin")
696 709
    assert_kind_of User, user
    (1-1/1)