Project

General

Profile

Patch #36438 » 0001-nulls-last-first-option-for-sorting-order.patch

Dmitry Makurin , 2022-01-17 13:29

View differences:

app/views/queries/_form.html.erb
83 83
    <%= label_tag "query_sort_criteria_direction_" + i.to_s,
84 84
                  l(:description_query_sort_criteria_direction), :class => "hidden-for-sighted" %>
85 85
    <%= select_tag("query[sort_criteria][#{i}][]",
86
                    options_for_select([[], [l(:label_ascending), 'asc'], [l(:label_descending), 'desc']], @query.sort_criteria_order(i)),
86
                   options_for_select(
87
                     [
88
                       [],
89
                       [l(:label_ascending), 'asc'],
90
                       [l(:label_descending), 'desc'],
91
                       [l(:label_ascending_null_last), 'asc nulls last'],
92
                       [l(:label_descending_null_first), 'desc nulls first']
93
                     ],
94
                     @query.sort_criteria_order(i)
95
                   ),
87 96
                    :id => "query_sort_criteria_direction_" + i.to_s) %>
88 97
    <br />
89 98
    <% end %>
config/locales/en.yml
1376 1376
  twofa_text_group_disabled: "This setting is only effective when the global two factor authentication setting is set to 'optional'. Currently, two factor authentication is disabled."
1377 1377
  text_user_destroy_confirmation: "Are you sure you want to delete this user and remove all references to them? This cannot be undone. Often, locking a user instead of deleting them is the better solution. To confirm, please enter their login (%{login}) below."
1378 1378
  text_project_destroy_enter_identifier: "To confirm, please enter the project's identifier (%{identifier}) below."
1379
  label_ascending_null_last: Ascending nulls last
1380
  label_descending_null_first: Descending nulls first
config/locales/ru.yml
1513 1513
  label_subtask: Subtask
1514 1514
  label_default_query: Default query
1515 1515
  field_default_project_query: Default project query
1516
  label_ascending_null_last: По возрастанию с пустыми значениями в конце
1517
  label_descending_null_first: По убыванию с пустыми значениями в начале
lib/redmine/sort_criteria.rb
34 34
    end
35 35

  
36 36
    def to_param
37
      self.collect {|k,o| k + (o == 'desc' ? ':desc' : '')}.join(',')
37
      collect do |k, o|
38
        k + (case o
39
             when 'desc'
40
               ':desc'
41
             when /nulls (first|last)/
42
               ":#{o}"
43
             else
44
               ''
45
             end)
46
      end.join(',')
38 47
    end
39 48

  
40 49
    def to_a
......
89 98
    private
90 99

  
91 100
    def normalize!
92
      self.reject! {|s| s.first.blank?}
93
      self.uniq! {|s| s.first}
94
      self.collect! {|s| s = Array(s); [s.first, (s.last == false || s.last.to_s == 'desc') ? 'desc' : 'asc']}
95
      self.replace self.first(3)
101
      reject! {|s| s.first.blank? }
102
      uniq! {|s| s.first }
103
      collect! do |s|
104
        s = Array(s)
105
        [s.first,
106
         if s.last == false || s.last.to_s == 'desc' # if sort is empty or desc => desc
107
           'desc'
108
         elsif !s.last.blank? && s.size > 1 && /nulls (first|last)/.match?(s.last) # nulls sort
109
           s.last
110
         else
111
           'asc'
112
         end]
113
      end
114
      replace first(3)
96 115
    end
97 116

  
98 117
    # Appends ASC/DESC to the sort criterion unless it has a fixed order
test/helpers/sort_helper_test.rb
102 102
    assert_equal 'sort-by-foo-bar sort-asc', sort_css_classes
103 103
  end
104 104

  
105
  def test_nulls_sort
106
    sort_init 'attr1', 'desc nulls first'
107
    sort_update(['attr1', 'attr2'])
108

  
109
    assert_equal ['attr1 DESC NULLS FIRST'], sort_clause
110
  end
111

  
112
  def test_params_nulls_sort
113
    @sort_param = 'attr1,attr2:desc nulls last'
114

  
115
    sort_init 'attr1', 'desc'
116
    sort_update({'attr1' => 'table1.attr1', 'attr2' => 'table2.attr2'})
117

  
118
    assert_equal ['table1.attr1 ASC', 'table2.attr2 DESC NULLS LAST'], sort_clause
119
    assert_equal 'attr1,attr2:desc nulls last', @session['foo_bar_sort']
120
  end
121

  
105 122
  private
106 123

  
107 124
  def controller_name; 'foo'; end
(3-3/3)