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": {