Lots of Filtering Fixes & New Fields (#2244)
* Added an id for komf userscript to help it inject into Kavita's UI without relying on strings, given localization. * Still working the filter fields, there is a bug with selecting an input and it setting undefined like crazy. Path is coded but not tested or validated. * Stashing changed. Really not sure what's happening. I'm seeing 2 constructor calls for one row. I'm seeing a field change trigger 400 events. Values aren't getting set correctly on default string. I've made a ton of changes, when resuming this work, look at the diff. All of this can be reset excluding the Path work. * Lots of comments but the double instantiation is due to the mobile drawer. Added an ngIf which seems to work. * Fixed dropdown options triggering a ton of looped calls. Default limitTo to 0 when user empties blank or negative. * Removed a ton of UserId db calls from a ton of apis. Added a new API to allow UI to query a specific role to lessen load on UI. * Optimized the code on new filtering to only load people by a given role. This should speed up heavily tagged libraries. Commented out a bunch of code that's no longer used. Will be cleaned up later. * Fixed support so that library filter can handle multiple selections. * Fixed a bug when hitting enter in an input, the statement would be removed. * Fixed multi-select not resuming from url correctly. * Restored the series/all api for Tachiyomi to continue using until I'm motivated enough to update the extension. * Fixed some resuming of state with dropdowns, not always setting values in correct order. * Added FilePath Filter which lets a user search on individual files (slow, may need index) * Added a full filepath for new filtering.
This commit is contained in:
parent
69b5530a93
commit
cd84913fb9
29 changed files with 576 additions and 238 deletions
|
@ -6,6 +6,7 @@ using System.Linq.Expressions;
|
|||
using API.DTOs.Filtering.v2;
|
||||
using API.Entities;
|
||||
using API.Entities.Enums;
|
||||
using API.Services.Tasks.Scanner.Parser;
|
||||
using Kavita.Common;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
|
@ -512,4 +513,116 @@ public static class SeriesFilter
|
|||
throw new ArgumentOutOfRangeException(nameof(comparison), comparison, "Filter Comparison is not supported");
|
||||
}
|
||||
}
|
||||
|
||||
public static IQueryable<Series> HasPath(this IQueryable<Series> queryable, bool condition,
|
||||
FilterComparison comparison, string queryString)
|
||||
{
|
||||
if (!condition) return queryable;
|
||||
|
||||
var normalizedPath = Parser.NormalizePath(queryString);
|
||||
|
||||
switch (comparison)
|
||||
{
|
||||
case FilterComparison.Equal:
|
||||
return queryable.Where(s => s.FolderPath != null && s.FolderPath.Equals(normalizedPath));
|
||||
case FilterComparison.BeginsWith:
|
||||
return queryable.Where(s => s.FolderPath != null && EF.Functions.Like(s.FolderPath, $"{normalizedPath}%"));
|
||||
case FilterComparison.EndsWith:
|
||||
return queryable.Where(s => s.FolderPath != null && EF.Functions.Like(s.FolderPath, $"%{normalizedPath}"));
|
||||
case FilterComparison.Matches:
|
||||
return queryable.Where(s => s.FolderPath != null && EF.Functions.Like(s.FolderPath, $"%{normalizedPath}%"));
|
||||
case FilterComparison.NotEqual:
|
||||
return queryable.Where(s => s.FolderPath != null && s.FolderPath != normalizedPath);
|
||||
case FilterComparison.NotContains:
|
||||
case FilterComparison.GreaterThan:
|
||||
case FilterComparison.GreaterThanEqual:
|
||||
case FilterComparison.LessThan:
|
||||
case FilterComparison.LessThanEqual:
|
||||
case FilterComparison.Contains:
|
||||
case FilterComparison.IsBefore:
|
||||
case FilterComparison.IsAfter:
|
||||
case FilterComparison.IsInLast:
|
||||
case FilterComparison.IsNotInLast:
|
||||
throw new KavitaException($"{comparison} not applicable for Series.FolderPath");
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(comparison), comparison, "Filter Comparison is not supported");
|
||||
}
|
||||
}
|
||||
|
||||
public static IQueryable<Series> HasFilePath(this IQueryable<Series> queryable, bool condition,
|
||||
FilterComparison comparison, string queryString)
|
||||
{
|
||||
if (!condition) return queryable;
|
||||
|
||||
var normalizedPath = Parser.NormalizePath(queryString);
|
||||
|
||||
switch (comparison)
|
||||
{
|
||||
case FilterComparison.Equal:
|
||||
return queryable.Where(s =>
|
||||
s.Volumes.Any(v =>
|
||||
v.Chapters.Any(c =>
|
||||
c.Files.Any(f =>
|
||||
f.FilePath != null && f.FilePath.Equals(normalizedPath)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
case FilterComparison.BeginsWith:
|
||||
return queryable.Where(s =>
|
||||
s.Volumes.Any(v =>
|
||||
v.Chapters.Any(c =>
|
||||
c.Files.Any(f =>
|
||||
f.FilePath != null && EF.Functions.Like(f.FilePath, $"{normalizedPath}%")
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
case FilterComparison.EndsWith:
|
||||
return queryable.Where(s =>
|
||||
s.Volumes.Any(v =>
|
||||
v.Chapters.Any(c =>
|
||||
c.Files.Any(f =>
|
||||
f.FilePath != null && EF.Functions.Like(f.FilePath, $"%{normalizedPath}")
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
case FilterComparison.Matches:
|
||||
return queryable.Where(s =>
|
||||
s.Volumes.Any(v =>
|
||||
v.Chapters.Any(c =>
|
||||
c.Files.Any(f =>
|
||||
f.FilePath != null && EF.Functions.Like(f.FilePath, $"%{normalizedPath}%")
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
case FilterComparison.NotEqual:
|
||||
return queryable.Where(s =>
|
||||
s.Volumes.Any(v =>
|
||||
v.Chapters.Any(c =>
|
||||
c.Files.Any(f =>
|
||||
f.FilePath == null || !f.FilePath.Equals(normalizedPath)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
case FilterComparison.NotContains:
|
||||
case FilterComparison.GreaterThan:
|
||||
case FilterComparison.GreaterThanEqual:
|
||||
case FilterComparison.LessThan:
|
||||
case FilterComparison.LessThanEqual:
|
||||
case FilterComparison.Contains:
|
||||
case FilterComparison.IsBefore:
|
||||
case FilterComparison.IsAfter:
|
||||
case FilterComparison.IsInLast:
|
||||
case FilterComparison.IsNotInLast:
|
||||
throw new KavitaException($"{comparison} not applicable for Series.FolderPath");
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(comparison), comparison, "Filter Comparison is not supported");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue