Skip to content

Commit

Permalink
Merge pull request #337 from mateusz-bak/handle-sorting
Browse files Browse the repository at this point in the history
Handle secondary and tertiary sorting
  • Loading branch information
mateusz-bak authored Oct 5, 2023
2 parents b7ddf0c + 7f47a20 commit 92a457f
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 37 deletions.
184 changes: 147 additions & 37 deletions lib/ui/books_screen/books_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'package:openreads/ui/search_ol_screen/search_ol_screen.dart.dart';
import 'package:openreads/ui/search_page/search_page.dart';
import 'package:openreads/ui/settings_screen/settings_screen.dart';
import 'package:openreads/ui/statistics_screen/statistics_screen.dart';
import 'package:diacritic/diacritic.dart';

import 'helper/multi_select_helper.dart';

Expand Down Expand Up @@ -276,14 +277,12 @@ class _BooksScreenState extends State<BooksScreen>
required bool isAsc,
}) {
isAsc
? list.sort((a, b) => a.title
.toString()
.toLowerCase()
.compareTo(b.title.toString().toLowerCase()))
: list.sort((b, a) => a.author
.toString()
.toLowerCase()
.compareTo(b.title.toString().toLowerCase()));
? list.sort((a, b) => removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase())))
: list.sort((b, a) =>
removeDiacritics(a.author.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase())));
// no secondary sorting

return list;
}
Expand All @@ -292,15 +291,34 @@ class _BooksScreenState extends State<BooksScreen>
required List<Book> list,
required bool isAsc,
}) {
isAsc
? list.sort((a, b) => a.author
.toString()
.toLowerCase()
.compareTo(b.author.toString().toLowerCase()))
: list.sort((b, a) => a.author
.toString()
.toLowerCase()
.compareTo(b.author.toString().toLowerCase()));
list.sort((a, b) {
int authorSorting = removeDiacritics(a.author.toString().toLowerCase())
.compareTo(removeDiacritics(b.author.toString().toLowerCase()));
if (!isAsc) {
authorSorting *= -1;
} // descending
if (authorSorting == 0) {
// secondary sorting, by release date
int releaseSorting = 0;
if ((a.publicationYear != null) && (b.publicationYear != null)) {
releaseSorting = a.publicationYear!.compareTo(b.publicationYear!);
if (!isAsc) {
releaseSorting *= -1;
}
}
if (releaseSorting == 0) {
// tertiary sorting, by title
int titleSorting = removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase()));
if (!isAsc) {
titleSorting *= -1;
}
return titleSorting;
}
return releaseSorting;
}
return authorSorting;
});

return list;
}
Expand All @@ -316,9 +334,34 @@ class _BooksScreenState extends State<BooksScreen>
(book.rating != null) ? booksRated.add(book) : booksNotRated.add(book);
}

isAsc
? booksRated.sort((a, b) => a.rating!.compareTo(b.rating!))
: booksRated.sort((b, a) => a.rating!.compareTo(b.rating!));
booksRated.sort((a, b) {
int ratingSorting = removeDiacritics(a.rating!.toString().toLowerCase())
.compareTo(removeDiacritics(b.rating!.toString().toLowerCase()));
if (!isAsc) {
ratingSorting *= -1;
} // descending
if (ratingSorting == 0) {
// secondary sorting, by release date
int releaseSorting = 0;
if ((a.publicationYear != null) && (b.publicationYear != null)) {
releaseSorting = a.publicationYear!.compareTo(b.publicationYear!);
if (!isAsc) {
releaseSorting *= -1;
}
}
if (releaseSorting == 0) {
// tertiary sorting, by title
int titleSorting = removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase()));
if (!isAsc) {
titleSorting *= -1;
}
return titleSorting;
}
return releaseSorting;
}
return ratingSorting;
});

return booksRated + booksNotRated;
}
Expand All @@ -336,9 +379,34 @@ class _BooksScreenState extends State<BooksScreen>
: booksWithoutPages.add(book);
}

isAsc
? booksWithPages.sort((a, b) => a.pages!.compareTo(b.pages!))
: booksWithPages.sort((b, a) => a.pages!.compareTo(b.pages!));
booksWithPages.sort((a, b) {
int pagesSorting = removeDiacritics(a.pages!.toString().toLowerCase())
.compareTo(removeDiacritics(b.pages!.toString().toLowerCase()));
if (!isAsc) {
pagesSorting *= -1;
} // descending
if (pagesSorting == 0) {
// secondary sorting, by release date
int releaseSorting = 0;
if ((a.publicationYear != null) && (b.publicationYear != null)) {
releaseSorting = a.publicationYear!.compareTo(b.publicationYear!);
if (!isAsc) {
releaseSorting *= -1;
}
}
if (releaseSorting == 0) {
// tertiary sorting, by title
int titleSorting = removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase()));
if (!isAsc) {
titleSorting *= -1;
}
return titleSorting;
}
return releaseSorting;
}
return pagesSorting;
});

return booksWithPages + booksWithoutPages;
}
Expand All @@ -356,13 +424,34 @@ class _BooksScreenState extends State<BooksScreen>
: booksWithoutStartDate.add(book);
}

isAsc
? booksWithStartDate.sort((a, b) =>
(a.startDate!.millisecondsSinceEpoch)
.compareTo(b.startDate!.millisecondsSinceEpoch))
: booksWithStartDate.sort((b, a) =>
(a.startDate!.millisecondsSinceEpoch)
.compareTo(b.startDate!.millisecondsSinceEpoch));
booksWithStartDate.sort((a, b) {
int startDateSorting = (a.startDate!.millisecondsSinceEpoch)
.compareTo(b.startDate!.millisecondsSinceEpoch);
if (!isAsc) {
startDateSorting *= -1;
} // descending
if (startDateSorting == 0) {
// secondary sorting, by release date
int releaseSorting = 0;
if ((a.publicationYear != null) && (b.publicationYear != null)) {
releaseSorting = a.publicationYear!.compareTo(b.publicationYear!);
if (!isAsc) {
releaseSorting *= -1;
}
}
if (releaseSorting == 0) {
// tertiary sorting, by title
int titleSorting = removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase()));
if (!isAsc) {
titleSorting *= -1;
}
return titleSorting;
}
return releaseSorting;
}
return startDateSorting;
});

return booksWithStartDate + booksWithoutStartDate;
}
Expand All @@ -380,13 +469,34 @@ class _BooksScreenState extends State<BooksScreen>
: booksWithoutFinishDate.add(book);
}

isAsc
? booksWithFinishDate.sort((a, b) =>
(a.finishDate!.millisecondsSinceEpoch)
.compareTo(b.finishDate!.millisecondsSinceEpoch))
: booksWithFinishDate.sort((b, a) =>
(a.finishDate!.millisecondsSinceEpoch)
.compareTo(b.finishDate!.millisecondsSinceEpoch));
booksWithFinishDate.sort((a, b) {
int finishDateSorting = (a.finishDate!.millisecondsSinceEpoch)
.compareTo(b.finishDate!.millisecondsSinceEpoch);
if (!isAsc) {
finishDateSorting *= -1;
} // descending
if (finishDateSorting == 0) {
// secondary sorting, by release date
int releaseSorting = 0;
if ((a.publicationYear != null) && (b.publicationYear != null)) {
releaseSorting = a.publicationYear!.compareTo(b.publicationYear!);
if (!isAsc) {
releaseSorting *= -1;
}
}
if (releaseSorting == 0) {
// tertiary sorting, by title
int titleSorting = removeDiacritics(a.title.toString().toLowerCase())
.compareTo(removeDiacritics(b.title.toString().toLowerCase()));
if (!isAsc) {
titleSorting *= -1;
}
return titleSorting;
}
return releaseSorting;
}
return finishDateSorting;
});

return booksWithFinishDate + booksWithoutFinishDate;
}
Expand Down
8 changes: 8 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.0"
diacritic:
dependency: "direct main"
description:
name: diacritic
sha256: a84e03ec2779375fb86430dbe9d8fba62c68376f2499097a5f6e75556babe706
url: "https://pub.dev"
source: hosted
version: "0.1.4"
dropdown_button2:
dependency: "direct main"
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ dependencies:
easy_localization: ^3.0.2
flutter_typeahead: ^4.6.1
flex_color_picker: ^3.2.2
diacritic: ^0.1.4
flutter_speed_dial: ^7.0.0
blurhash_dart: ^1.2.1
csv: ^5.0.2
Expand Down

0 comments on commit 92a457f

Please sign in to comment.