Added front-end "Set English Tag Name" logic.
All checks were successful
ci / build-test (push) Successful in 2m27s
ci / publish-image (push) Successful in 1m27s

This commit is contained in:
2026-04-26 00:40:30 -04:00
parent 204e186354
commit 2355d7fe65
4 changed files with 106 additions and 12 deletions

View File

@@ -0,0 +1,19 @@
@inherits FeedbackComponent<SetEnglishTagNameModel>
@using AntDesign
@using JSMR.UI.Blazor.Models
<Form Model="@Options">
<Input @bind-Value="@Options.UpdatedEnglishTagName" Placeholder="English Name" AutoFocus />
</Form>
@code {
[CascadingParameter]
public ModalRef ModalRef { get; set; } = default!;
public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args)
{
await base.OnFeedbackOkAsync(args);
await CloseFeedbackAsync();
}
}

View File

@@ -0,0 +1,8 @@
namespace JSMR.UI.Blazor.Models;
public class SetEnglishTagNameModel
{
public required string TagName { get; set; }
public string? CurrentEnglishTagName { get; set; }
public string? UpdatedEnglishTagName { get; set; }
}

View File

@@ -3,12 +3,15 @@
@inject IJSRuntime JS
@using AntDesign
@using JSMR.Application.Common.Search
@using JSMR.Application.Tags.Commands.SetEnglishName
@using JSMR.Application.Tags.Commands.UpdateTagStatus
@using JSMR.Application.Tags.Contracts
@using JSMR.Application.Tags.Queries.Search
@using JSMR.Application.Tags.Queries.Search.Contracts
@using JSMR.UI.Blazor.Components
@using JSMR.UI.Blazor.Components.Modals
@using JSMR.UI.Blazor.Filters
@using JSMR.UI.Blazor.Models
@using JSMR.UI.Blazor.Services
@using Microsoft.AspNetCore.WebUtilities
@@ -55,18 +58,21 @@
<Dropdown Trigger="@([Trigger.Click])">
<Overlay>
<Menu Selectable="false">
<SubMenu Title="Set Status" Placement="@AntDesign.Placement.LeftTop">
@if (!context.Favorite)
{
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Favorite)">Set as Favorite</MenuItem>
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Favorite)">Favorite</MenuItem>
}
@if (!context.Blacklisted)
{
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Blacklisted)">Set as Blacklisted</MenuItem>
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Blacklisted)">Blacklisted</MenuItem>
}
@if (context.Favorite || context.Blacklisted)
{
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Neutral)">Set as Neutral</MenuItem>
<MenuItem OnClick="(e) => SetStatus(context, TagStatus.Neutral)">Neutral</MenuItem>
}
</SubMenu>
<MenuItem OnClick="(e) => OpenSetEnglishNameModal(context)">Set English Name...</MenuItem>
</Menu>
</Overlay>
<ChildContent>
@@ -145,6 +151,12 @@
[Inject]
INotificationService NotificationService { get; set; } = default!;
[Inject]
IMessageService MessageService { get; set; } = default!;
[Inject]
ModalService ModalService { get; set; } = default!;
public string? Keywords { get; set; }
public int PageNumber { get; set; } = 1;
public int PageSize { get; set; } = 100;
@@ -328,4 +340,52 @@
await NotificationService.Open(config);
}
private async Task OpenSetEnglishNameModal(TagSearchItem item)
{
SetEnglishTagNameModel model = new()
{
TagName = item.Name,
CurrentEnglishTagName = item.EnglishName,
UpdatedEnglishTagName = item.EnglishName
};
ModalOptions modalOptions = new()
{
Title = $"Set English Name: {item.Name}",
MaskClosable = false,
Centered = true,
OkText = "Save",
OnOk = async (args) =>
{
await SetEnglishName(item, model.UpdatedEnglishTagName);
}
};
ModalService.CreateModal<TagEnglishNameModal, SetEnglishTagNameModel>(modalOptions, model);
}
private async Task SetEnglishName(TagSearchItem item, string? englishName)
{
SetTagEnglishNameRequest request = new(
TagId: item.TagId,
EnglishName: englishName ?? string.Empty
);
SetTagEnglishNameResponse? response = await Client.SetTagEnglishNameAsync(request);
if (response is null)
return;
item.EnglishName = response.EnglishName;
await InvokeAsync(StateHasChanged);
await NotificationService.Open(new NotificationConfig
{
Message = "Tag English Name Updated",
Description = $"Tag '{item.Name}' English name set to '{response.EnglishName}'.",
Placement = NotificationPlacement.Top
});
}
}

View File

@@ -1,6 +1,7 @@
using JSMR.Application.Circles.Queries.Search;
using JSMR.Application.Creators.Commands.UpdateCreatorStatus;
using JSMR.Application.Creators.Queries.Search;
using JSMR.Application.Tags.Commands.SetEnglishName;
using JSMR.Application.Tags.Commands.UpdateTagStatus;
using JSMR.Application.Tags.Queries.Search;
using JSMR.Application.VoiceWorks.Queries.Search;
@@ -50,6 +51,12 @@ public class VoiceWorksClient(HttpClient http)
return await resp.Content.ReadFromJsonAsync<UpdateTagStatusResponse>(JsonOptions, cancellationToken: ct);
}
public async Task<SetTagEnglishNameResponse?> SetTagEnglishNameAsync(SetTagEnglishNameRequest request, CancellationToken ct = default)
{
using var resp = await http.PostAsJsonAsync("/api/tags/set-english-name", request, ct);
return await resp.Content.ReadFromJsonAsync<SetTagEnglishNameResponse>(JsonOptions, cancellationToken: ct);
}
public async Task<UpdateCreatorStatusResponse?> UpdateCreatorStatusAsync(UpdateCreatorStatusRequest request, CancellationToken ct = default)
{
using var resp = await http.PostAsJsonAsync("/api/creators/update-status", request, ct);