using Blazored.LocalStorage; using Lantean.QBitTorrentClient; using Lantean.QBTMudBlade.Components; using Lantean.QBTMudBlade.Components.Dialogs; using Lantean.QBTMudBlade.Models; using Microsoft.AspNetCore.Components; using MudBlazor; namespace Lantean.QBTMudBlade.Pages { public partial class TorrentList { [Inject] protected IApiClient ApiClient { get; set; } = default!; [Inject] protected IDialogService DialogService { get; set; } = default!; [Inject] protected NavigationManager NavigationManager { get; set; } = default!; [CascadingParameter] public QBitTorrentClient.Models.Preferences? Preferences { get; set; } [CascadingParameter] public IEnumerable? Torrents { get; set; } [CascadingParameter(Name = "SearchTermChanged")] public EventCallback SearchTermChanged { get; set; } [CascadingParameter(Name = "SortColumnChanged")] public EventCallback SortColumnChanged { get; set; } [CascadingParameter(Name = "SortDirectionChanged")] public EventCallback SortDirectionChanged { get; set; } protected string? SearchText { get; set; } protected HashSet SelectedItems { get; set; } = []; protected bool ToolbarButtonsEnabled => SelectedItems.Count > 0; protected DynamicTable? Table { get; set; } protected void SelectedItemsChanged(HashSet selectedItems) { SelectedItems = selectedItems; } protected async Task SortDirectionChangedHandler(SortDirection sortDirection) { await SortDirectionChanged.InvokeAsync(sortDirection); } protected async Task SortColumnChangedHandler(string columnId) { await SortColumnChanged.InvokeAsync(columnId); } protected async Task SearchTextChanged(string text) { SearchText = text; await SearchTermChanged.InvokeAsync(SearchText); } protected async Task AddTorrentFile() { await DialogService.InvokeAddTorrentFileDialog(ApiClient); } protected async Task AddTorrentLink() { await DialogService.InvokeAddTorrentLinkDialog(ApiClient); } protected void RowClick(TableRowClickEventArgs eventArgs) { if (eventArgs.MouseEventArgs.Detail > 1) { var torrent = SelectedItems.FirstOrDefault(); if (torrent is null) { return; } NavigationManager.NavigateTo($"/details/{torrent.Hash}"); } } private IEnumerable GetSelectedTorrents() { if (SelectedItems.Count > 0) { return SelectedItems.Select(t => t.Hash); } return []; } public async Task ColumnOptions() { if (Table is null) { return; } await Table.ShowColumnOptionsDialog(); } protected void ShowTorrent() { var torrent = SelectedItems.FirstOrDefault(); if (torrent is null) { return; } NavigationManager.NavigateTo($"/details/{torrent.Hash}"); } protected IEnumerable> Columns => ColumnsDefinitions; public static List> ColumnsDefinitions { get; } = [ CreateColumnDefinition("#", t => t.Priority), CreateColumnDefinition("Icon", t => t.State, IconColumn, iconOnly: true), CreateColumnDefinition("Name", t => t.Name, width: 400), CreateColumnDefinition("Size", t => t.Size, t => DisplayHelpers.Size(t.Size)), CreateColumnDefinition("Total Size", t => t.TotalSize, t => DisplayHelpers.Size(t.TotalSize), enabled: false), CreateColumnDefinition("Done", t => t.Progress, ProgressBarColumn, tdClass: "table-progress pl-1 pr-1"), CreateColumnDefinition("Status", t => t.State, t => DisplayHelpers.State(t.State)), CreateColumnDefinition("Seeds", t => t.NumberSeeds), CreateColumnDefinition("Peers", t => t.NumberLeeches), CreateColumnDefinition("Down Speed", t => t.DownloadSpeed, t => DisplayHelpers.Speed(t.DownloadSpeed)), CreateColumnDefinition("Up Speed", t => t.UploadSpeed, t => DisplayHelpers.Speed(t.UploadSpeed)), CreateColumnDefinition("ETA", t => t.EstimatedTimeOfArrival, t => DisplayHelpers.Duration(t.EstimatedTimeOfArrival)), CreateColumnDefinition("Ratio", t => t.Ratio, t => t.Ratio.ToString("0.00")), CreateColumnDefinition("Category", t => t.Category), CreateColumnDefinition("Tags", t => t.Tags, t => string.Join(", ", t.Tags)), CreateColumnDefinition("Added On", t => t.AddedOn, t => DisplayHelpers.DateTime(t.AddedOn)), CreateColumnDefinition("Completed On", t => t.CompletionOn, t => DisplayHelpers.DateTime(t.CompletionOn), enabled: false), CreateColumnDefinition("Tracker", t => t.Tracker, enabled: false), CreateColumnDefinition("Down Limit", t => t.DownloadLimit, t => DisplayHelpers.Size(t.DownloadLimit), enabled: false), CreateColumnDefinition("Up Limit", t => t.UploadLimit, t => DisplayHelpers.Size(t.UploadLimit), enabled: false), CreateColumnDefinition("Downloaded", t => t.Downloaded, t => DisplayHelpers.Size(t.Downloaded), enabled: false), CreateColumnDefinition("Uploaded", t => t.Uploaded, t => DisplayHelpers.Size(t.Uploaded), enabled: false), CreateColumnDefinition("Session Download", t => t.DownloadedSession, t => DisplayHelpers.Size(t.DownloadedSession), enabled: false), CreateColumnDefinition("Session Upload", t => t.UploadedSession, t => DisplayHelpers.Size(t.UploadedSession), enabled: false), CreateColumnDefinition("Remaining", t => t.AmountLeft, t => DisplayHelpers.Size(t.AmountLeft), enabled: false), CreateColumnDefinition("Time Active", t => t.TimeActive, t => DisplayHelpers.Duration(t.TimeActive), enabled: false), CreateColumnDefinition("Save path", t => t.SavePath, enabled: false), CreateColumnDefinition("Completed", t => t.Completed, t => DisplayHelpers.Size(t.Completed), enabled: false), CreateColumnDefinition("Ratio Limit", t => t.RatioLimit, t => t.Ratio.ToString("0.00"), enabled: false), CreateColumnDefinition("Last Seen Complete", t => t.SeenComplete, t => DisplayHelpers.DateTime(t.SeenComplete), enabled: false), CreateColumnDefinition("Last Activity", t => t.LastActivity, t => DisplayHelpers.DateTime(t.LastActivity), enabled: false), CreateColumnDefinition("Availability", t => t.Availability, t => t.Availability.ToString("0.##"), enabled: false), //CreateColumnDefinition("Reannounce In", t => t.Reannounce, enabled: false), ]; private static ColumnDefinition CreateColumnDefinition(string name, Func selector, RenderFragment> rowTemplate, int? width = null, string? tdClass = null, bool enabled = true, bool iconOnly = false) { var cd = new ColumnDefinition(name, selector, rowTemplate); cd.Class = "no-wrap"; if (tdClass is not null) { cd.Class += " " + tdClass; } cd.Width = width; cd.Enabled = enabled; cd.IconOnly = iconOnly; return cd; } private static ColumnDefinition CreateColumnDefinition(string name, Func selector, Func? formatter = null, int? width = null, string? tdClass = null, bool enabled = true, bool iconOnly = false) { var cd = new ColumnDefinition(name, selector, formatter); cd.Class = "no-wrap"; if (tdClass is not null) { cd.Class += " " + tdClass; } cd.Width = width; cd.Enabled = enabled; cd.IconOnly = iconOnly; return cd; } } }