101 lines
4.6 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
|
|
} |