diff --git a/API/DTOs/Filtering/SortField.cs b/API/DTOs/Filtering/SortField.cs index b072819f45..7082ded69a 100644 --- a/API/DTOs/Filtering/SortField.cs +++ b/API/DTOs/Filtering/SortField.cs @@ -33,5 +33,9 @@ public enum SortField /// /// Kavita+ Only - External Average Rating /// - AverageRating = 8 + AverageRating = 8, + /// + /// Randomise the order + /// + Random = 9 } diff --git a/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs b/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs index f3dbfef141..030517dbf5 100644 --- a/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs +++ b/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs @@ -1,6 +1,7 @@ using System.Linq; using API.DTOs.Filtering; using API.Entities; +using Microsoft.EntityFrameworkCore; namespace API.Extensions.QueryExtensions.Filtering; #nullable enable @@ -39,6 +40,7 @@ public static IQueryable Sort(this IQueryable query.DoOrderBy(s => s.Series.Progress.Where(p => p.SeriesId == s.Series.Id).Select(p => p.LastModified).Max(), sortOptions), SortField.AverageRating => query.DoOrderBy(s => s.Series.ExternalSeriesMetadata.ExternalRatings .Where(p => p.SeriesId == s.Series.Id).Average(p => p.AverageScore), sortOptions), + SortField.Random => query.DoOrderBy(s => EF.Functions.Random(), sortOptions), _ => query }; diff --git a/API/Extensions/QueryExtensions/Filtering/SeriesSort.cs b/API/Extensions/QueryExtensions/Filtering/SeriesSort.cs index efc4bc6701..d6c7ff77d2 100644 --- a/API/Extensions/QueryExtensions/Filtering/SeriesSort.cs +++ b/API/Extensions/QueryExtensions/Filtering/SeriesSort.cs @@ -1,6 +1,7 @@ using System.Linq; using API.DTOs.Filtering; using API.Entities; +using Microsoft.EntityFrameworkCore; namespace API.Extensions.QueryExtensions.Filtering; #nullable enable @@ -35,6 +36,7 @@ public static IQueryable Sort(this IQueryable query, int userId, .Max(), sortOptions), SortField.AverageRating => query.DoOrderBy(s => s.ExternalSeriesMetadata.ExternalRatings .Where(p => p.SeriesId == s.Id).Average(p => p.AverageScore), sortOptions), + SortField.Random => query.DoOrderBy(s => EF.Functions.Random(), sortOptions), _ => query }; diff --git a/UI/Web/src/app/_models/metadata/series-filter.ts b/UI/Web/src/app/_models/metadata/series-filter.ts index 663fc2380c..bfaee4f3fc 100644 --- a/UI/Web/src/app/_models/metadata/series-filter.ts +++ b/UI/Web/src/app/_models/metadata/series-filter.ts @@ -24,7 +24,8 @@ export enum SortField { /** * Kavita+ only */ - AverageRating = 8 + AverageRating = 8, + Random = 9 } export const allSortFields = Object.keys(SortField) diff --git a/UI/Web/src/app/_pipes/sort-field.pipe.ts b/UI/Web/src/app/_pipes/sort-field.pipe.ts index ea54d124dd..8044631b3e 100644 --- a/UI/Web/src/app/_pipes/sort-field.pipe.ts +++ b/UI/Web/src/app/_pipes/sort-field.pipe.ts @@ -29,6 +29,8 @@ export class SortFieldPipe implements PipeTransform { return this.translocoService.translate('sort-field-pipe.read-progress'); case SortField.AverageRating: return this.translocoService.translate('sort-field-pipe.average-rating'); + case SortField.Random: + return this.translocoService.translate('sort-field-pipe.random'); } } diff --git a/UI/Web/src/assets/langs/en.json b/UI/Web/src/assets/langs/en.json index b160f10f8e..32e57bd14e 100644 --- a/UI/Web/src/assets/langs/en.json +++ b/UI/Web/src/assets/langs/en.json @@ -1745,7 +1745,8 @@ "time-to-read": "Time to Read", "release-year": "Release Year", "read-progress": "Last Read", - "average-rating": "Average Rating" + "average-rating": "Average Rating", + "random": "Random" }, "edit-series-modal": {