Files
ersatztv/ErsatzTV/Pages/ImageBrowser.razor
T

101 lines
4.6 KiB
Plaintext

@page "/media/browser/images"
@using System.Net
@using ErsatzTV.Application.Images
@implements IDisposable
@inject IDialogService Dialog
@inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudGrid>
<MudItem xs="8">
<MudCard>
<MudTreeView T="ImageTreeItemViewModel" ServerData="LoadServerData" Items="@TreeItems" Hover="true" ExpandOnClick="true">
<ItemTemplate Context="item">
<MudTreeViewItem T="ImageTreeItemViewModel" Items="@item.Value!.TreeItems" Icon="@item.Value.Icon" CanExpand="@item.Value.CanExpand" Value="@item.Value">
<BodyContent>
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
<div style="justify-self: start;">
<MudText>@item.Value.Text</MudText>
</div>
<div style="justify-self: end;">
<span>@item.Value.EndText</span>
<MudTooltip Text="Edit Image Folder Duration" ShowOnHover="true" ShowOnClick="false" ShowOnFocus="false">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
OnClick="@(_ => EditImageFolderDuration(item.Value))">
</MudIconButton>
</MudTooltip>
@{
string query = GetSearchQuery(item.Value);
if (!string.IsNullOrWhiteSpace(query))
{
<MudIconButton
Icon="@Icons.Material.Filled.Search"
Href="@($"search?query={query}")"/>
}
}
</div>
</div>
</BodyContent>
</MudTreeViewItem>
</ItemTemplate>
</MudTreeView>
</MudCard>
</MudItem>
</MudGrid>
</MudContainer>
@code {
private readonly CancellationTokenSource _cts = new();
private List<TreeItemData<ImageTreeItemViewModel>> TreeItems { get; set; } = [];
public void Dispose()
{
_cts.Cancel();
_cts.Dispose();
}
protected override async Task OnParametersSetAsync()
{
await ReloadImageFolders();
await InvokeAsync(StateHasChanged);
}
private async Task ReloadImageFolders()
{
List<ImageFolderViewModel> imageFolders = await Mediator.Send(new GetImageFolders(Option<int>.None), _cts.Token);
TreeItems = imageFolders.Map(g => new TreeItemData<ImageTreeItemViewModel> { Value = new ImageTreeItemViewModel(g) }).ToList();
}
private async Task<IReadOnlyCollection<TreeItemData<ImageTreeItemViewModel>>> LoadServerData(ImageTreeItemViewModel parentNode)
{
List<ImageFolderViewModel> result = await Mediator.Send(new GetImageFolders(parentNode.LibraryFolderId), _cts.Token);
foreach (ImageFolderViewModel imageFolder in result)
{
parentNode.TreeItems.Add(new TreeItemData<ImageTreeItemViewModel> { Value = new ImageTreeItemViewModel(imageFolder) });
}
return parentNode.TreeItems;
}
private static string GetSearchQuery(ImageTreeItemViewModel item)
{
var query = $"library_folder_id:{item.LibraryFolderId}";
return WebUtility.UrlEncode(query);
}
private async Task EditImageFolderDuration(ImageTreeItemViewModel item)
{
var parameters = new DialogParameters { { "ImageFolderDuration", item.ImageFolderDuration } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraLarge };
IDialogReference dialog = await Dialog.ShowAsync<EditImageFolderDurationDialog>("Edit Image Folder Duration", parameters, options);
DialogResult result = await dialog.Result;
if (!result.Canceled)
{
double? duration = await Mediator.Send(new UpdateImageFolderDuration(item.LibraryFolderId, result.Data as double?), _cts.Token);
item.UpdateDuration(duration);
await InvokeAsync(StateHasChanged);
}
}
}