Project

General

Profile

Feature #44406 » 0001b-Add-an-option-to-keep-the-current-sort-order-when-se.patch

Florian Walchshofer, 2026-10-23 20:47

View differences:

app/controllers/queries_controller.rb
134 134
    @query.build_from_params(params)
135 135
    @query.column_names = nil if params[:default_columns]
136 136
    @query.sort_criteria = (params[:query] && params[:query][:sort_criteria]) || @query.sort_criteria
137
    @query.keep_sort_order = params[:query] && params[:query][:keep_sort_order]
137 138
    @query.name = params[:query] && params[:query][:name]
138 139
    @query.description = params[:query] && params[:query][:description]
139 140
    if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin?
app/helpers/queries_helper.rb
359 359
      raise ::Unauthorized unless @query.visible?
360 360

  
361 361
      @query.project = @project
362
      session[session_key] = {:id => @query.id, :project_id => @query.project_id} if use_session
362
      if use_session
363
        current_sort = sort_criteria_from_session(klass, session_key)
364
        session[session_key] = {:id => @query.id, :project_id => @query.project_id}
365
        if @query.keep_sort_order && current_sort.present?
366
          @query.sort_criteria = current_sort
367
          session[session_key][:sort] = @query.sort_criteria.to_a
368
        end
369
      end
363 370
    elsif api_request? || params[:set_filter] || !use_session ||
364 371
            session[session_key].nil? ||
365 372
            session[session_key][:project_id] != (@project ? @project.id : nil)
......
401 408
    @query
402 409
  end
403 410

  
411
  # Returns the sort criteria of the query stored in the session
412
  def sort_criteria_from_session(klass, session_key)
413
    session_data = session[session_key]
414
    return unless session_data
415

  
416
    if session_data[:sort].present?
417
      session_data[:sort]
418
    elsif session_data[:id]
419
      klass.find_by_id(session_data[:id])&.sort_criteria&.to_a
420
    end
421
  end
422

  
404 423
  def retrieve_query_from_session(klass=IssueQuery)
405 424
    session_key = klass.name.underscore.to_sym
406 425
    session_data = session[session_key]
app/models/query.rb
906 906
    []
907 907
  end
908 908

  
909
  def keep_sort_order
910
    options[:keep_sort_order] == '1'
911
  end
912

  
913
  def keep_sort_order=(arg)
914
    options[:keep_sort_order] = (arg == '1' ? '1' : nil)
915
  end
916

  
909 917
  def sort_criteria=(arg)
910 918
    c = Redmine::SortCriteria.new(arg)
911 919
    write_attribute(:sort_criteria, c.to_a)
app/views/queries/_form.html.erb
97 97
                    :id => "query_sort_criteria_direction_" + i.to_s) %>
98 98
    <br />
99 99
    <% end %>
100
    <label class="inline"><%= check_box_tag 'query[keep_sort_order]', '1', @query.keep_sort_order %> <%= l(:label_keep_sort_order) %></label>
100 101
  </fieldset>
101 102
<% end %>
102 103

  
config/locales/en.yml
1499 1499
  reaction_text_x_other_users:
1500 1500
    one: "1 other"
1501 1501
    other: "%{count} others"
1502
  label_keep_sort_order: Keep the current sort order when selecting this query
test/functional/issues_controller_test.rb
734 734
    assert_response :success
735 735
  end
736 736

  
737
  def test_index_with_saved_query_with_keep_sort_order_should_keep_the_current_sort_order
738
    query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC,
739
                               :user_id => 1, :sort_criteria => [['id', 'asc']])
740
    keeping = IssueQuery.create!(:name => 'keeping', :visibility => IssueQuery::VISIBILITY_PUBLIC,
741
                                 :user_id => 1, :sort_criteria => [['id', 'asc']],
742
                                 :keep_sort_order => '1')
743
    get(:index, :params => {:query_id => query.id, :sort => 'id:desc'})
744
    assert_response :success
745

  
746
    get(:index, :params => {:query_id => keeping.id})
747
    assert_response :success
748
    ids = issues_in_list.map(&:id)
749
    assert_equal ids.sort.reverse, ids
750
  end
751

  
752
  def test_index_with_saved_query_with_keep_sort_order_should_keep_the_sort_order_of_the_previous_query
753
    query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC,
754
                               :user_id => 1, :sort_criteria => [['id', 'desc']])
755
    keeping = IssueQuery.create!(:name => 'keeping', :visibility => IssueQuery::VISIBILITY_PUBLIC,
756
                                 :user_id => 1, :sort_criteria => [['id', 'asc']],
757
                                 :keep_sort_order => '1')
758
    get(:index, :params => {:query_id => query.id})
759
    assert_response :success
760

  
761
    get(:index, :params => {:query_id => keeping.id})
762
    assert_response :success
763
    ids = issues_in_list.map(&:id)
764
    assert_equal ids.sort.reverse, ids
765
  end
766

  
767
  def test_index_with_saved_query_without_keep_sort_order_should_use_its_sort_order
768
    query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC,
769
                               :user_id => 1, :sort_criteria => [['id', 'asc']])
770
    other = IssueQuery.create!(:name => 'other', :visibility => IssueQuery::VISIBILITY_PUBLIC,
771
                               :user_id => 1, :sort_criteria => [['id', 'asc']])
772
    get(:index, :params => {:query_id => query.id, :sort => 'id:desc'})
773
    assert_response :success
774

  
775
    get(:index, :params => {:query_id => other.id})
776
    assert_response :success
777
    ids = issues_in_list.map(&:id)
778
    assert_equal ids.sort, ids
779
  end
780

  
737 781
  def test_index_should_omit_page_param_in_export_links
738 782
    get(:index, :params => {:page => 2})
739 783
    assert_response :success
test/functional/queries_controller_test.rb
670 670
    end
671 671
  end
672 672

  
673
  def test_create_with_keep_sort_order
674
    @request.session[:user_id] = 1
675
    post(
676
      :create,
677
      :params => {
678
        :default_columns => '1',
679
        :query => {:name => 'test_keep_sort_order', :visibility => '2', :keep_sort_order => '1'}
680
      }
681
    )
682
    query = Query.find_by_name('test_keep_sort_order')
683
    assert query.keep_sort_order
684
  end
685

  
686
  def test_update_without_keep_sort_order
687
    @request.session[:user_id] = 1
688
    query = Query.find(5)
689
    query.update!(:keep_sort_order => '1')
690

  
691
    put(:update, :params => {:id => 5, :default_columns => '1', :query => {:name => 'test_query'}})
692
    assert_not query.reload.keep_sort_order
693
  end
694

  
695
  def test_edit_keep_sort_order
696
    @request.session[:user_id] = 1
697
    Query.find(5).update!(:keep_sort_order => '1')
698
    get(:edit, :params => {:id => 5})
699
    assert_response :success
700
    assert_select 'input[type=checkbox][name=?][checked=checked]', 'query[keep_sort_order]'
701
  end
702

  
673 703
  def test_edit_description
674 704
    @request.session[:user_id] = 1
675 705
    get(:edit, :params => {:id => 5})
(5-5/5)