Add a class filter for the assets (#1949)

* added a class filter for the assets

* addressing PR commets

* fix formatting

* fix formatting

* address comments

* add Localization for "All"
This commit is contained in:
Dawi Alotaibi 2025-10-01 20:06:20 +03:00 committed by GitHub
parent 4cccff3d5a
commit a22b511abb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 4 deletions

View File

@ -1,4 +1,5 @@
{ {
"all": "الكل",
"appreciation_message": "شكرًا لك على دعمك لـ AssetRipper!", "appreciation_message": "شكرًا لك على دعمك لـ AssetRipper!",
"asset_ripper_free": "AssetRipper المجاني", "asset_ripper_free": "AssetRipper المجاني",
"asset_ripper_premium": "AssetRipper بريميوم", "asset_ripper_premium": "AssetRipper بريميوم",
@ -116,5 +117,6 @@
"loading_step_locate_key_functions": "جارٍ مسح الملف الثنائي IL2Cpp للوظائف المكتبية", "loading_step_locate_key_functions": "جارٍ مسح الملف الثنائي IL2Cpp للوظائف المكتبية",
"export_primary_content": "تصدير المحتوى الأساسي", "export_primary_content": "تصدير المحتوى الأساسي",
"export_unity_project": "تصدير مشروع Unity", "export_unity_project": "تصدير مشروع Unity",
"c_sharp_langage_version_config_2": "C# 2" "c_sharp_langage_version_config_2": "C# 2",
"filter": "تصفية"
} }

View File

@ -1,4 +1,5 @@
{ {
"all": "All",
"an_error_occured_during_decompilation": "An error occurred during decompilation.", "an_error_occured_during_decompilation": "An error occurred during decompilation.",
"appreciation_message": "Thank you for supporting AssetRipper!", "appreciation_message": "Thank you for supporting AssetRipper!",
"assembly_name": "Assembly Name", "assembly_name": "Assembly Name",
@ -96,6 +97,7 @@
"file_id": "File ID", "file_id": "File ID",
"format": "Format", "format": "Format",
"frequency": "Frequency", "frequency": "Frequency",
"filter": "Filter",
"game_object": "GameObject", "game_object": "GameObject",
"guid": "GUID", "guid": "GUID",
"height": "Height", "height": "Height",

View File

@ -14,15 +14,31 @@ internal static class CollectionAPI
public const string Count = Base + "/Count"; public const string Count = Base + "/Count";
} }
private const string Path = "Path"; public const string Path = "Path";
public const string Class = "Class";
public static string GetViewUrl(CollectionPath path, string? classFilter = null)
{
string url = $"{Urls.View}?{GetPathQuery(path)}";
if (!string.IsNullOrEmpty(classFilter))
{
url += $"&{Class}={classFilter.ToUrl()}";
}
return url;
}
public static string GetViewUrl(CollectionPath path) => $"{Urls.View}?{GetPathQuery(path)}";
public static Task GetView(HttpContext context) public static Task GetView(HttpContext context)
{ {
context.Response.DisableCaching(); context.Response.DisableCaching();
if (TryGetCollectionFromQuery(context, out AssetCollection? collection, out CollectionPath path, out Task? failureTask)) if (TryGetCollectionFromQuery(context, out AssetCollection? collection, out CollectionPath path, out Task? failureTask))
{ {
return new ViewPage() { Collection = collection, Path = path }.WriteToResponse(context.Response); string? classFilter = context.Request.Query[Class];
return new ViewPage()
{
Collection = collection,
Path = path,
ClassFilter = string.IsNullOrWhiteSpace(classFilter) ? null : classFilter
}.WriteToResponse(context.Response);
} }
else else
{ {

View File

@ -9,6 +9,7 @@ public sealed class ViewPage : DefaultPage
public required AssetCollection Collection { get; init; } public required AssetCollection Collection { get; init; }
public required CollectionPath Path { get; init; } public required CollectionPath Path { get; init; }
public string? ClassFilter { get; init; }
public override string GetTitle() => Collection.Name; public override string GetTitle() => Collection.Name;
public override void WriteInnerContent(TextWriter writer) public override void WriteInnerContent(TextWriter writer)
@ -27,6 +28,40 @@ public sealed class ViewPage : DefaultPage
if (Collection.Count > 0) if (Collection.Count > 0)
{ {
new H2(writer).Close(Localization.Assets); new H2(writer).Close(Localization.Assets);
using (new Form(writer).WithAction(CollectionAPI.Urls.View).WithMethod("get").End())
{
new Input(writer)
.WithType("hidden")
.WithName(CollectionAPI.Path)
.WithValue(Path.ToJson().ToHtml())
.Close();
new Label(writer).WithFor("classFilter").WithClass("me-2").Close(Localization.Class);
using (new Select(writer)
.WithId("classFilter")
.WithName(CollectionAPI.Class)
.End())
{
new Option(writer)
.WithValue(string.Empty)
.MaybeWithSelected(string.IsNullOrEmpty(ClassFilter))
.Close(Localization.All);
foreach (string cn in Collection
.Select(a => a.ClassName)
.Distinct()
.Order())
{
new Option(writer)
.WithValue(cn)
.MaybeWithSelected(string.Equals(cn, ClassFilter, StringComparison.Ordinal))
.Close(cn);
}
}
new Button(writer).WithType("submit").WithClass("btn").Close(Localization.Filter);
}
using (new Table(writer).WithClass("table").End()) using (new Table(writer).WithClass("table").End())
{ {
using (new Thead(writer).End()) using (new Thead(writer).End())
@ -42,6 +77,12 @@ public sealed class ViewPage : DefaultPage
{ {
foreach (IUnityObjectBase asset in Collection) foreach (IUnityObjectBase asset in Collection)
{ {
if (!string.IsNullOrEmpty(ClassFilter) &&
!string.Equals(asset.ClassName, ClassFilter, StringComparison.Ordinal))
{
continue;
}
using (new Tr(writer).End()) using (new Tr(writer).End())
{ {
new Td(writer).Close(asset.PathID.ToString()); new Td(writer).Close(asset.PathID.ToString());