From c7ec77382595f1af5545b4b901e1451677a0d3cd Mon Sep 17 00:00:00 2001 From: Andrej Date: Tue, 10 Jun 2025 15:28:06 +0200 Subject: [PATCH] Fix sorting on PET tables [SCI-11995] --- .../vue/shared/datatable/renderers/date.vue | 8 ++-- app/services/lists/experiments_service.rb | 4 ++ app/services/lists/my_modules_service.rb | 4 +- app/services/lists/projects_service.rb | 46 +++++++++++++------ 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/app/javascript/vue/shared/datatable/renderers/date.vue b/app/javascript/vue/shared/datatable/renderers/date.vue index 351cbb384..a5e7f3df4 100644 --- a/app/javascript/vue/shared/datatable/renderers/date.vue +++ b/app/javascript/vue/shared/datatable/renderers/date.vue @@ -11,11 +11,13 @@ :valueType="'stringWithoutTimezone'" :clearable="true"/> diff --git a/app/services/lists/experiments_service.rb b/app/services/lists/experiments_service.rb index d85642822..15cd84fd9 100644 --- a/app/services/lists/experiments_service.rb +++ b/app/services/lists/experiments_service.rb @@ -116,6 +116,10 @@ module Lists @records.order(Arel.sql('COALESCE(experiments.archived_on, projects.archived_on) DESC')) .group('experiments.archived_on', 'projects.archived_on') end + when 'favorite' + @records.order(Arel.sql("CASE + WHEN favorites IS NULL THEN 1 + ELSE 0 END #{sort_direction(order_params)}")) when 'status' @records.order(Arel.sql("CASE WHEN experiments.started_at IS NULL AND experiments.done_at IS NULL THEN -1 diff --git a/app/services/lists/my_modules_service.rb b/app/services/lists/my_modules_service.rb index f984379bf..93f64837e 100644 --- a/app/services/lists/my_modules_service.rb +++ b/app/services/lists/my_modules_service.rb @@ -122,9 +122,9 @@ module Lists .group('my_modules.id') .order(Arel.sql('COUNT(DISTINCT tags.id) DESC')) when 'favorite_ASC' - @records = @records.order(:favorite) - when 'favorite_DESC' @records = @records.order(favorite: :desc) + when 'favorite_DESC' + @records = @records.order(:favorite) else __send__("#{sortable_columns[order_params[:column].to_sym]}_sort", sort_direction(order_params)) end diff --git a/app/services/lists/projects_service.rb b/app/services/lists/projects_service.rb index 12527411c..d6a919342 100644 --- a/app/services/lists/projects_service.rb +++ b/app/services/lists/projects_service.rb @@ -141,9 +141,9 @@ module Lists case sort when 'created_at_ASC' - @records = @records.sort_by { |object| project_timestamp(:created_at, object) }.reverse! - when 'created_at_DESC' @records = @records.sort_by { |object| project_timestamp(:created_at, object) } + when 'created_at_DESC' + @records = @records.sort_by { |object| project_timestamp(:created_at, object) }.reverse! when 'name_ASC' @records = @records.sort_by { |c| c.name.downcase } when 'name_DESC' @@ -161,9 +161,9 @@ module Lists when 'users_DESC' @records = @records.sort_by { |object| project_users_count(object) }.reverse! when 'updated_at_ASC' - @records = @records.sort_by { |object| project_timestamp(:updated_at, object) }.reverse! - when 'updated_at_DESC' @records = @records.sort_by { |object| project_timestamp(:updated_at, object) } + when 'updated_at_DESC' + @records = @records.sort_by { |object| project_timestamp(:updated_at, object) }.reverse! when 'comments_ASC' @records = @records.sort_by { |object| project_comments_count(object) } when 'comments_DESC' @@ -192,6 +192,14 @@ module Lists @records = @records.sort_by { |object| project_description(object) } when 'description_DESC' @records = @records.sort_by { |object| project_description(object) }.reverse! + when 'completed_experiments_ASC' + @records = @records.sort_by { |object| completed_experiments(object) } + when 'completed_experiments_DESC' + @records = @records.sort_by { |object| completed_experiments(object) }.reverse! + when 'completed_tasks_ASC' + @records = @records.sort_by { |object| completed_tasks(object) } + when 'completed_tasks_DESC' + @records = @records.sort_by { |object| completed_tasks(object) }.reverse! end end @@ -200,23 +208,21 @@ module Lists end def project_comments_count(object) - return [0, 0, -1] unless project?(object) + return [1, 0, -1] unless project?(object) - [1, object.comments.count, can_create_project_comments?(@user, object) ? 1 : 0] + [0, object.comments.count, can_create_project_comments?(@user, object) ? 1 : 0] end def project_users_count(object) - return [0, -1] unless project?(object) + return [1, -1] unless project?(object) - [1, object.users.count] + [0, object.users.count] end def project_favorites(object) - if project?(object) - object.favorite ? 1 : 0 - else - -1 - end + return [1, 0, -1] unless project?(object) + + [0, can_read_project?(@user, object) ? 0 : 1, object.favorite ? 0 : 1] end def project_start_date(object) @@ -246,7 +252,7 @@ module Lists def project_supervised_by(object) return [1, '', 1] unless project?(object) - [object.supervised_by_id ? 0 : 1, object.supervised_by&.full_name || '', 0] + [object.supervised_by_id ? 0 : 1, strip_tags(object.supervised_by&.full_name&.downcase || ''), 0] end def project_description(object) @@ -259,6 +265,18 @@ module Lists project?(object) ? object[timestamp_name] : Constants::INFINITE_DATE end + def completed_experiments(object) + return [1, -1] unless project?(object) + + [0, object.completed_experiments_count] + end + + def completed_tasks(object) + return [1, -1] unless project?(object) + + [0, object.completed_tasks_count] + end + def project?(object) object.instance_of?(Project) end