From e52bcac75bca052e9e9bd08d1180a1d718a87a3c Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Tue, 15 Aug 2023 17:01:52 +0200 Subject: [PATCH] fix(#432): fallback to id sorting if predicates provide equal result --- core/lib/src/models/tables/study.dart | 7 ++++++- .../lib/common_views/standard_table.dart | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/lib/src/models/tables/study.dart b/core/lib/src/models/tables/study.dart index 1b516330e..a3e5aa34f 100644 --- a/core/lib/src/models/tables/study.dart +++ b/core/lib/src/models/tables/study.dart @@ -35,7 +35,7 @@ enum ResultSharing { } @JsonSerializable() -class Study extends SupabaseObjectFunctions { +class Study extends SupabaseObjectFunctions implements Comparable { static const String tableName = 'study'; @override @@ -246,4 +246,9 @@ class Study extends SupabaseObjectFunctions { String toString() { return 'Study{id: $id, title: $title, description: $description, userId: $userId, participation: $participation, resultSharing: $resultSharing, contact: $contact, iconName: $iconName, published: $published, questionnaire: $questionnaire, eligibilityCriteria: $eligibilityCriteria, consent: $consent, interventions: $interventions, observations: $observations, schedule: $schedule, reportSpecification: $reportSpecification, results: $results, collaboratorEmails: $collaboratorEmails, registryPublished: $registryPublished, participantCount: $participantCount, endedCount: $endedCount, activeSubjectCount: $activeSubjectCount, missedDays: $missedDays, repo: $repo, invites: $invites, participants: $participants, participantsProgress: $participantsProgress, createdAt: $createdAt}'; } + + @override + int compareTo(Study other) { + return id.compareTo(other.id); + } } diff --git a/designer_v2/lib/common_views/standard_table.dart b/designer_v2/lib/common_views/standard_table.dart index 7205e0f85..967c77508 100644 --- a/designer_v2/lib/common_views/standard_table.dart +++ b/designer_v2/lib/common_views/standard_table.dart @@ -245,10 +245,22 @@ class _StandardTableState extends State> { } } - int _sortLogic(T a, T b, {required int columnIndex, required bool? sortAscending}) { + int _sortLogic(T a, T b, {required int columnIndex, required bool? sortAscending, bool? useSortPredicate}) { final sortPredicate = widget.sortColumnPredicates; - if (sortPredicate != null && sortPredicate[columnIndex] != null) { - return sortAscending ?? true ? sortPredicate[columnIndex]!(a, b) : sortPredicate[columnIndex]!(b, a); + if (useSortPredicate != null && useSortPredicate && + sortPredicate != null && sortPredicate[columnIndex] != null + ) { + final int res; + if (sortAscending ?? true) { + res = sortPredicate[columnIndex]!(a, b); + } else { + res = sortPredicate[columnIndex]!(b, a); + } + if (res == 0) { + // Fallback to default sorting algorithm + return _sortLogic(a, b, columnIndex: columnIndex, sortAscending: sortAscending, useSortPredicate: false); + } + return res; } else if (a is Comparable && b is Comparable) { // If sortPredicate is not provided, use default comparison logic return sortAscending ?? true ? Comparable.compare(a, b) : Comparable.compare(b, a);