From fc13fcff2925d75f276d1269896a895dc94eac6a Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Fri, 18 Aug 2023 08:11:02 -0500 Subject: [PATCH] Small fixes (#2224) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Replaced normal dropdowns with select2 (which will eventually replace our custom typeaheads). Still needs styling. * More css * Styling. Fixed preloading typeahead with multiple options on load. * Styling to align with typeahead tag badges. * Done with filtering story. * Fixed a bug with switching between filters. * Fixed some extra } from localization * [skip ci] Translated using Weblate (Spanish) Currently translated at 71.3% (1058 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/es/ * [skip ci] Translated using Weblate (Dutch) Currently translated at 59.2% (879 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/nl/ * Translated using Weblate (Thai) Currently translated at 100.0% (160 of 160 strings) Translation: Kavita/backend Translate-URL: https://hosted.weblate.org/projects/kavita/backend/th/ * [skip ci] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.9% (1482 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/zh_Hans/ * [skip ci] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.9% (1482 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/zh_Hans/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (155 of 160 strings) Translation: Kavita/backend Translate-URL: https://hosted.weblate.org/projects/kavita/backend/zh_Hans/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (155 of 160 strings) Translation: Kavita/backend Translate-URL: https://hosted.weblate.org/projects/kavita/backend/zh_Hans/ * [skip ci] Translated using Weblate (Thai) Currently translated at 27.2% (404 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/th/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (160 of 160 strings) Translation: Kavita/backend Translate-URL: https://hosted.weblate.org/projects/kavita/backend/pt/ * [skip ci] Translated using Weblate (Portuguese) Currently translated at 55.3% (821 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/pt/ * [skip ci] Translated using Weblate (Japanese) Currently translated at 2.0% (30 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/ja/ * [skip ci] Translated using Weblate (Portuguese (Brazil)) Currently translated at 82.1% (1218 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/pt_BR/ * [skip ci] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.9% (1482 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/zh_Hans/ * [skip ci] Translated using Weblate (Turkish) Currently translated at 7.6% (113 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/tr/ * [skip ci] Translated using Weblate (Portuguese) Currently translated at 62.7% (930 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/pt/ * [skip ci] Translated using Weblate (Italian) Currently translated at 26.0% (387 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/it/ * [skip ci] Translated using Weblate (Portuguese) Currently translated at 68.3% (1013 of 1483 strings) Translation: Kavita/ui Translate-URL: https://hosted.weblate.org/projects/kavita/ui/pt/ * Added translation using Weblate (Czech) * [skip ci] Added translation using Weblate (Czech) * Some files got left off last release * Fixed on deck prefilter * Fixed a sizing issue on list item and brought the columns in on series detail as well. --------- Co-authored-by: gallegonovato Co-authored-by: Hans Kalisvaart Co-authored-by: AlienHack Co-authored-by: 书签 Co-authored-by: 周書丞 Co-authored-by: Duarte Silva Co-authored-by: Andre Smith Co-authored-by: Havokdan Co-authored-by: xe1st Co-authored-by: Tomas Battistini Co-authored-by: Jiří Heger --- API/Data/Repositories/UserRepository.cs | 19 ++++-- .../QueryExtensions/Filtering/BookmarkSort.cs | 59 +++++++++++++++++++ .../cards/list-item/list-item.component.html | 2 +- .../_components/dashboard.component.ts | 1 + .../metadata-detail.component.html | 4 +- 5 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs diff --git a/API/Data/Repositories/UserRepository.cs b/API/Data/Repositories/UserRepository.cs index b2caa9d89..3bf5757bb 100644 --- a/API/Data/Repositories/UserRepository.cs +++ b/API/Data/Repositories/UserRepository.cs @@ -14,6 +14,7 @@ using API.DTOs.SeriesDetail; using API.Entities; using API.Extensions; using API.Extensions.QueryExtensions; +using API.Extensions.QueryExtensions.Filtering; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.AspNetCore.Identity; @@ -389,10 +390,11 @@ public class UserRepository : IUserRepository .ToListAsync(); var queryString = filterStatement.Value.ToNormalized(); - var filterSeriesQuery = query.Join(_context.Series, b => b.SeriesId, s => s.Id, (bookmark, series) => new + var filterSeriesQuery = query.Join(_context.Series, b => b.SeriesId, s => s.Id, + (bookmark, series) => new BookmarkSeriesPair() { - bookmark, - series + bookmark = bookmark, + series = series }); switch (filterStatement.Comparison) @@ -441,14 +443,21 @@ public class UserRepository : IUserRepository break; } - query = filterSeriesQuery.Select(o => o.bookmark); - return await query + return await ApplyLimit(filterSeriesQuery + .Sort(filter.SortOptions) + .AsSplitQuery(), filter.LimitTo) + .Select(o => o.bookmark) .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } + private static IQueryable ApplyLimit(IQueryable query, int limit) + { + return limit <= 0 ? query : query.Take(limit); + } + /// /// Fetches the UserId by API Key. This does not include any extra information /// diff --git a/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs b/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs new file mode 100644 index 000000000..d5b1a6d9b --- /dev/null +++ b/API/Extensions/QueryExtensions/Filtering/BookmarkSort.cs @@ -0,0 +1,59 @@ +using System.Linq; +using API.DTOs.Filtering; +using API.Entities; + +namespace API.Extensions.QueryExtensions.Filtering; + +public class BookmarkSeriesPair +{ + public AppUserBookmark bookmark { get; set; } + public Series series { get; set; } +} + +public static class BookmarkSort +{ + /// + /// Applies the correct sort based on + /// + /// + /// + /// + public static IQueryable Sort(this IQueryable query, SortOptions? sortOptions) + { + // If no sort options, default to using SortName + sortOptions ??= new SortOptions() + { + IsAscending = true, + SortField = SortField.SortName + }; + + if (sortOptions.IsAscending) + { + query = sortOptions.SortField switch + { + SortField.SortName => query.OrderBy(s => s.series.SortName.ToLower()), + SortField.CreatedDate => query.OrderBy(s => s.series.Created), + SortField.LastModifiedDate => query.OrderBy(s => s.series.LastModified), + SortField.LastChapterAdded => query.OrderBy(s => s.series.LastChapterAdded), + SortField.TimeToRead => query.OrderBy(s => s.series.AvgHoursToRead), + SortField.ReleaseYear => query.OrderBy(s => s.series.Metadata.ReleaseYear), + _ => query + }; + } + else + { + query = sortOptions.SortField switch + { + SortField.SortName => query.OrderByDescending(s => s.series.SortName.ToLower()), + SortField.CreatedDate => query.OrderByDescending(s => s.series.Created), + SortField.LastModifiedDate => query.OrderByDescending(s => s.series.LastModified), + SortField.LastChapterAdded => query.OrderByDescending(s => s.series.LastChapterAdded), + SortField.TimeToRead => query.OrderByDescending(s => s.series.AvgHoursToRead), + SortField.ReleaseYear => query.OrderByDescending(s => s.series.Metadata.ReleaseYear), + _ => query + }; + } + + return query; + } +} diff --git a/UI/Web/src/app/cards/list-item/list-item.component.html b/UI/Web/src/app/cards/list-item/list-item.component.html index fcc88d32c..3c2db4e3d 100644 --- a/UI/Web/src/app/cards/list-item/list-item.component.html +++ b/UI/Web/src/app/cards/list-item/list-item.component.html @@ -30,7 +30,7 @@ -
+
diff --git a/UI/Web/src/app/dashboard/_components/dashboard.component.ts b/UI/Web/src/app/dashboard/_components/dashboard.component.ts index 2affd8f55..c750fde98 100644 --- a/UI/Web/src/app/dashboard/_components/dashboard.component.ts +++ b/UI/Web/src/app/dashboard/_components/dashboard.component.ts @@ -184,6 +184,7 @@ export class DashboardComponent implements OnInit { const filter = this.filterUtilityService.createSeriesV2Filter(); filter.statements.push({field: FilterField.ReadProgress, comparison: FilterComparison.GreaterThan, value: '0'}); + filter.statements.push({field: FilterField.ReadProgress, comparison: FilterComparison.LessThan, value: '100'}); if (filter.sortOptions) { filter.sortOptions.sortField = SortField.LastChapterAdded; filter.sortOptions.isAscending = false; diff --git a/UI/Web/src/app/series-detail/_components/metadata-detail/metadata-detail.component.html b/UI/Web/src/app/series-detail/_components/metadata-detail/metadata-detail.component.html index 2f3392f01..2f98c87b8 100644 --- a/UI/Web/src/app/series-detail/_components/metadata-detail/metadata-detail.component.html +++ b/UI/Web/src/app/series-detail/_components/metadata-detail/metadata-detail.component.html @@ -1,8 +1,8 @@
-
+
{{heading}}
-
+