228 lines
10 KiB
Plaintext
228 lines
10 KiB
Plaintext
@page "/user/{CardId:long}"
|
|
@using SharedProject.models
|
|
@using SharedProject.enums
|
|
@inject HttpClient Client
|
|
@inject IDialogService DialogService
|
|
@inject ILogger<User> Logger
|
|
|
|
<PageTitle>User</PageTitle>
|
|
<MudContainer>
|
|
@if (userDetail == null)
|
|
{
|
|
<MudSkeleton Width="1184px" Height="57px"/>
|
|
<MudSkeleton Width="1184px" Height="57px"/>
|
|
<MudSkeleton Width="1184px" Height="57px"/>
|
|
}
|
|
else
|
|
{
|
|
<MudExpansionPanels>
|
|
<MudExpansionPanel Text="Total Result">
|
|
<MudList>
|
|
<MudListSubheader>Player Name: @userDetail.PlayerName</MudListSubheader>
|
|
<MudListItem>Total Score: @userDetail.TotalScore</MudListItem>
|
|
<MudListItem>Average Score: @userDetail.AverageScore</MudListItem>
|
|
<MudListItem>Played Song Count: @userDetail.PlayedSongCount / @userDetail.TotalSongCount</MudListItem>
|
|
<MudListItem>Cleared Stage Count: @userDetail.ClearedStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>No Miss Stage Count: @userDetail.NoMissStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>Full Chain Stage Count: @userDetail.FullChainStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>Perfect Stage Count: @userDetail.PerfectStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>S and Above Stage Count: @userDetail.SAboveStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>S+ and Above Stage Count: @userDetail.SPlusAboveStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
<MudListItem>S++ and Above Stage Count: @userDetail.SPlusPlusAboveStageCount / @userDetail.TotalStageCount</MudListItem>
|
|
</MudList>
|
|
</MudExpansionPanel>
|
|
<MudExpansionPanel Text="PlayOptions">
|
|
<MudSelect @bind-Value="@fastSlowIndicator" Label="FAST/SLOW show setting">
|
|
@foreach (var item in Enum.GetValues<PlayOptions.FastSlowIndicator>())
|
|
{
|
|
<MudSelectItem Value="@item">@item.GetHelpText()</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
|
|
<MudSelect @bind-Value="@feverTranceShow" Label="FEVER/TRANCE show setting">
|
|
@foreach (var item in Enum.GetValues<PlayOptions.FeverTranceShow>())
|
|
{
|
|
<MudSelectItem Value="@item">@item.GetHelpText()</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
|
|
<MudButton Disabled="@isSavingOptions" OnClick="SaveOptions" Variant="Variant.Filled" Color="Color.Info">
|
|
@if (isSavingOptions)
|
|
{
|
|
<MudProgressCircular Class="ms-n1" Size="Size.Small" Indeterminate="true"/>
|
|
<MudText Class="ms-2">Saving...</MudText>
|
|
}
|
|
else
|
|
{
|
|
<MudIcon Icon="@Icons.Filled.Save"></MudIcon>
|
|
<MudText>Save</MudText>
|
|
}
|
|
</MudButton>
|
|
</MudExpansionPanel>
|
|
<MudExpansionPanel Text="SongPlayData">
|
|
<MudDataGrid T="SongPlayData" Items="@songPlayDataList" Sortable="true" Filterable="true">
|
|
<ToolBarContent>
|
|
<MudText Typo="Typo.h6">Played Songs</MudText>
|
|
</ToolBarContent>
|
|
<Columns>
|
|
<Column T="SongPlayData" Sortable="false" Filterable="false">
|
|
<CellTemplate>
|
|
<MudButton Variant="Variant.Outlined" Size="Size.Small"
|
|
OnClick="@(() => OnShowDetailsClick(context.Item))">
|
|
@(context.Item.ShowDetails ? "Hide" : "Show") Song Play Details
|
|
</MudButton>
|
|
</CellTemplate>
|
|
</Column>
|
|
<Column T="SongPlayData" Field="IsFavorite" Sortable="false" Title="Favorite">
|
|
<CellTemplate>
|
|
<MudToggleIconButton Toggled="@context.Item.IsFavorite"
|
|
ToggledChanged="@(()=>OnFavoriteToggled(context.Item))"
|
|
Icon="@Icons.Material.Filled.FavoriteBorder" Color="@Color.Secondary" Title="Add to favorite"
|
|
ToggledIcon="@Icons.Material.Filled.Favorite" ToggledColor="@Color.Secondary" ToggledTitle="Remove from favorite"/>
|
|
</CellTemplate>
|
|
</Column>
|
|
<Column T="SongPlayData" Field="Title" Title="Song Title"/>
|
|
<Column T="SongPlayData" Field="Artist" Title="Artist"/>
|
|
<Column T="SongPlayData" Field="TotalPlayCount" Title="Total Play Count" />
|
|
</Columns>
|
|
<ChildRowContent>
|
|
@if (context.ShowDetails)
|
|
{
|
|
<MudTr>
|
|
<td colspan="5">
|
|
<MudCard Elevation="0">
|
|
<MudCardHeader>
|
|
<CardHeaderContent>
|
|
<MudText Typo="Typo.body1">Song Play Details</MudText>
|
|
</CardHeaderContent>
|
|
</MudCardHeader>
|
|
<MudCardContent Class="pa-0">
|
|
<MudTable Items="@context.SongPlaySubDataList" Context="SongPlayDetail" Elevation="0" Filter="data => data.ClearState != ClearState.NotPlayed">
|
|
<HeaderContent>
|
|
<MudTh>Difficulty</MudTh>
|
|
<MudTh>Clear State</MudTh>
|
|
<MudTh>Play Count</MudTh>
|
|
<MudTh>Rating</MudTh>
|
|
<MudTh>Score</MudTh>
|
|
<MudTh>Max Chain</MudTh>
|
|
</HeaderContent>
|
|
<RowTemplate>
|
|
<MudTd DataLabel="Difficulty">@SongPlayDetail.Difficulty</MudTd>
|
|
<MudTd DataLabel="Clear State">
|
|
@(SongPlayDetail.Score != 1000000 ? SongPlayDetail.ClearState : ClearState.Perfect)
|
|
</MudTd>
|
|
<MudTd DataLabel="Play Count">@SongPlayDetail.PlayCount</MudTd>
|
|
<MudTd DataLabel="Rating">@CalculateRating(SongPlayDetail.Score)</MudTd>
|
|
<MudTd DataLabel="Score">@SongPlayDetail.Score</MudTd>
|
|
<MudTd DataLabel="Max Chain">@SongPlayDetail.MaxChain</MudTd>
|
|
</RowTemplate>
|
|
</MudTable>
|
|
</MudCardContent>
|
|
</MudCard>
|
|
</td>
|
|
</MudTr>
|
|
}
|
|
</ChildRowContent>
|
|
<PagerContent>
|
|
<MudDataGridPager T="SongPlayData"/>
|
|
</PagerContent>
|
|
</MudDataGrid>
|
|
</MudExpansionPanel>
|
|
</MudExpansionPanels>
|
|
}
|
|
</MudContainer>
|
|
|
|
@code {
|
|
|
|
[Parameter]
|
|
public long CardId { get; set; }
|
|
|
|
private PlayOptions.FeverTranceShow feverTranceShow;
|
|
|
|
private PlayOptions.FastSlowIndicator fastSlowIndicator;
|
|
|
|
private UserDetail? userDetail;
|
|
|
|
private List<SongPlayData> songPlayDataList = new();
|
|
|
|
private bool isSavingOptions;
|
|
|
|
private static readonly ScoreGradeMap[] GRADES =
|
|
{
|
|
new(0, "E"),
|
|
new(300000, "D"),
|
|
new(500000, "C"),
|
|
new(700000, "B"),
|
|
new(800000, "A"),
|
|
new(900000, "S"),
|
|
new(950000, "S+"),
|
|
new(990000, "S++"),
|
|
};
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await base.OnInitializedAsync();
|
|
userDetail = await Client.GetFromJsonAsync<UserDetail>($"api/UserDetail/{CardId}") ?? new();
|
|
songPlayDataList = userDetail.SongPlayDataList ?? new List<SongPlayData>();
|
|
feverTranceShow = userDetail.PlayOption.FeverTrance;
|
|
fastSlowIndicator = userDetail.PlayOption.FastSlowIndicator;
|
|
}
|
|
|
|
private void OnShowDetailsClick(SongPlayData data)
|
|
{
|
|
data.ShowDetails = !data.ShowDetails;
|
|
}
|
|
|
|
private async Task SaveOptions()
|
|
{
|
|
isSavingOptions = true;
|
|
var postData = new PlayOption
|
|
{
|
|
CardId = CardId,
|
|
FastSlowIndicator = fastSlowIndicator,
|
|
FeverTrance = feverTranceShow
|
|
};
|
|
var result = await Client.PostAsJsonAsync("api/UserDetail/SetPlayOption", postData);
|
|
isSavingOptions = false;
|
|
}
|
|
|
|
public record ScoreGradeMap(int Score, string Grade)
|
|
{
|
|
public override string ToString()
|
|
{
|
|
return $"{{ Score = {Score}, Grade = {Grade} }}";
|
|
}
|
|
}
|
|
|
|
private static string CalculateRating(int score)
|
|
{
|
|
var grade = GRADES.Where(g => g.Score <= score).Select(g => g.Grade).Last();
|
|
return grade;
|
|
}
|
|
|
|
private async Task OnFavoriteToggled(SongPlayData data)
|
|
{
|
|
var options = new DialogOptions
|
|
{
|
|
CloseOnEscapeKey = false,
|
|
DisableBackdropClick = true,
|
|
FullWidth = true
|
|
};
|
|
var parameters = new DialogParameters();
|
|
parameters.Add("Data", data);
|
|
parameters.Add("CardId", CardId);
|
|
var dialog = DialogService.Show<FavoriteDialog>("Favorite", parameters, options);
|
|
var result = await dialog.Result;
|
|
|
|
if (result.Cancelled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ((bool)result.Data)
|
|
{
|
|
Logger.LogInformation("Changed!");
|
|
data.IsFavorite = !data.IsFavorite;
|
|
}
|
|
}
|
|
} |