[ADD] Simple views for accounts and channels
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
|
||||
<MudNavMenu>
|
||||
<MudNavLink Href="/" Icon="@Icons.Material.Filled.Home" Match="NavLinkMatch.All">Home</MudNavLink>
|
||||
<MudNavLink Href="/Channels" Icon="@Icons.Material.Filled.SupervisorAccount" Match="NavLinkMatch.All">Channels</MudNavLink>
|
||||
<MudNavLink Href="/Library" Icon="@Icons.Material.Filled.LocalLibrary" Match="NavLinkMatch.All">Library</MudNavLink>
|
||||
<MudNavLink Href="/Playlists" Icon="@Icons.Material.Filled.ViewList" Match="NavLinkMatch.All">Playlists</MudNavLink>
|
||||
<MudNavLink Href="/Development" Icon="@Icons.Material.Filled.DeveloperMode" Match="NavLinkMatch.All">Development</MudNavLink>
|
||||
<MudNavLink Href="/Services" Icon="@Icons.Material.Filled.MiscellaneousServices" Match="NavLinkMatch.All">Services</MudNavLink>
|
||||
<MudNavGroup Title="Library" Expanded Icon="@Icons.Custom.Brands.YouTube" IconColor="Color.Error">
|
||||
<MudNavLink Href="/Accounts" Icon="@Icons.Material.Filled.AccountBox" Match="NavLinkMatch.All">Accounts</MudNavLink>
|
||||
<MudNavLink Href="/Channels" Icon="@Icons.Material.Filled.AccountCircle" Match="NavLinkMatch.All">Channels</MudNavLink>
|
||||
<MudNavLink Href="/Playlists" Icon="@Icons.Material.Filled.ViewList" Match="NavLinkMatch.All">Playlists</MudNavLink>
|
||||
<MudNavLink Href="/Library" Icon="@Icons.Material.Filled.Info" Match="NavLinkMatch.All" IconColor="Color.Info">Info</MudNavLink>
|
||||
</MudNavGroup>
|
||||
<MudNavGroup Title="Application" Expanded Icon="@Icons.Material.Filled.SettingsSystemDaydream" IconColor="Color.Primary">
|
||||
<MudNavLink Href="/Development" Icon="@Icons.Material.Filled.DeveloperMode" Match="NavLinkMatch.All">Development</MudNavLink>
|
||||
<MudNavLink Href="/Services" Icon="@Icons.Material.Filled.MiscellaneousServices" Match="NavLinkMatch.All">Services</MudNavLink>
|
||||
</MudNavGroup>
|
||||
</MudNavMenu>
|
||||
48
Manager.App/Components/Pages/Accounts.razor
Normal file
48
Manager.App/Components/Pages/Accounts.razor
Normal file
@@ -0,0 +1,48 @@
|
||||
@page "/Accounts"
|
||||
@using Manager.App.Models.Settings
|
||||
@using Manager.App.Services.System
|
||||
@using Microsoft.Extensions.Options
|
||||
|
||||
@inject ILibraryService LibraryService
|
||||
@inject IDialogService DialogService
|
||||
@inject IOptions<LibrarySettings> LibraryOptions
|
||||
@inject ClientService ClientService
|
||||
@inject ISnackbar Snackbar
|
||||
|
||||
<PageTitle>Accounts</PageTitle>
|
||||
|
||||
<MudStack Spacing="2">
|
||||
<MudPaper Elevation="0" Outlined>
|
||||
<MudStack Row Class="ma-2">
|
||||
<MudButton IconSize="Size.Small" StartIcon="@Icons.Material.Filled.Add" Variant="Variant.Outlined" OnClick="OnAddAccountDialogAsync">Add account</MudButton>
|
||||
</MudStack>
|
||||
</MudPaper>
|
||||
|
||||
<MudTable @ref="@_table" ServerData="ServerReload">
|
||||
<ToolBarContent>
|
||||
<MudText Typo="Typo.h6">Accounts</MudText>
|
||||
<MudSpacer />
|
||||
<MudTextField T="string" ValueChanged="@(s=>OnSearch(s))" Placeholder="Search" Adornment="Adornment.Start" DebounceInterval="300"
|
||||
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
|
||||
</ToolBarContent>
|
||||
<HeaderContent>
|
||||
<MudTh>Name</MudTh>
|
||||
<MudTh>Handle</MudTh>
|
||||
<MudTh>ID</MudTh>
|
||||
</HeaderContent>
|
||||
<RowTemplate>
|
||||
<MudTd>@context.Channel?.Name</MudTd>
|
||||
<MudTd>@context.Channel?.Handle</MudTd>
|
||||
<MudTd>@context.Id</MudTd>
|
||||
</RowTemplate>
|
||||
<NoRecordsContent>
|
||||
<MudText>No channels found</MudText>
|
||||
</NoRecordsContent>
|
||||
<LoadingContent>
|
||||
<MudText>Loading...</MudText>
|
||||
</LoadingContent>
|
||||
<PagerContent>
|
||||
<MudTablePager/>
|
||||
</PagerContent>
|
||||
</MudTable>
|
||||
</MudStack>
|
||||
74
Manager.App/Components/Pages/Accounts.razor.cs
Normal file
74
Manager.App/Components/Pages/Accounts.razor.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using Manager.App.Components.Dialogs;
|
||||
using Manager.App.Models.Library;
|
||||
using Manager.Data.Entities.LibraryContext;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using MudBlazor;
|
||||
|
||||
namespace Manager.App.Components.Pages;
|
||||
|
||||
public partial class Accounts : ComponentBase
|
||||
{
|
||||
private MudTable<ClientAccountEntity>? _table;
|
||||
private readonly DialogOptions _dialogOptions = new() { BackdropClick = false, CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.ExtraLarge };
|
||||
private string _search = "";
|
||||
|
||||
private async Task<TableData<ClientAccountEntity>> ServerReload(TableState state, CancellationToken token)
|
||||
{
|
||||
var results = await LibraryService.GetAccountsAsync(_search, state.Page * state.PageSize, state.PageSize, token);
|
||||
return !results.IsSuccess ? new TableData<ClientAccountEntity>() : new TableData<ClientAccountEntity>() { Items = results.Value, TotalItems = results.Total };
|
||||
}
|
||||
|
||||
private void OnSearch(string text)
|
||||
{
|
||||
_search = text;
|
||||
_table?.ReloadServerData();
|
||||
}
|
||||
|
||||
private async Task OnAddAccountDialogAsync()
|
||||
{
|
||||
var libSettings = LibraryOptions.Value;
|
||||
var parameters = new DialogParameters<AccountDialog> { { x => x.DefaultUserAgent, libSettings.DefaultUserAgent } };
|
||||
var dialog = await DialogService.ShowAsync<AccountDialog>("Add account", parameters, _dialogOptions);
|
||||
var result = await dialog.Result;
|
||||
|
||||
if (result == null || result.Canceled || result.Data == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var clientChannel = (ClientChannel)result.Data;
|
||||
if (clientChannel?.YouTubeClient == null)
|
||||
{
|
||||
Snackbar.Add("No YouTube client received.", Severity.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
var savedClientResult = await ClientService.SaveClientAsync(clientChannel.YouTubeClient);
|
||||
if (savedClientResult.IsSuccess)
|
||||
{
|
||||
if (_table != null)
|
||||
{
|
||||
await _table.ReloadServerData();
|
||||
}
|
||||
Snackbar.Add($"Client {clientChannel.Channel?.Handle ?? clientChannel.YouTubeClient.Id} saved!", Severity.Success);
|
||||
ClientService.AddClient(clientChannel.YouTubeClient);
|
||||
}
|
||||
else
|
||||
{
|
||||
Snackbar.Add($"Failed to store client: {savedClientResult.Error?.Description ?? "Unknown!"}", Severity.Error);
|
||||
}
|
||||
|
||||
if (clientChannel.Channel == null)
|
||||
{
|
||||
Snackbar.Add("No channel information received!", Severity.Warning);
|
||||
}
|
||||
else
|
||||
{
|
||||
var saveChannelResult = await LibraryService.SaveChannelAsync(clientChannel.Channel);
|
||||
if (!saveChannelResult.IsSuccess)
|
||||
{
|
||||
Snackbar.Add("Failed to save channel information", Severity.Warning);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,37 +1,26 @@
|
||||
@page "/Channels"
|
||||
@using Manager.App.Models.Settings
|
||||
@using Manager.App.Services.System
|
||||
@using Microsoft.Extensions.Options
|
||||
|
||||
@inject ILibraryService LibraryService
|
||||
@inject IDialogService DialogService
|
||||
@inject IOptions<LibrarySettings> LibraryOptions
|
||||
@inject ClientService ClientService
|
||||
@inject ISnackbar Snackbar
|
||||
|
||||
<PageTitle>Channels</PageTitle>
|
||||
|
||||
|
||||
<MudStack Spacing="2">
|
||||
<MudPaper Elevation="0" Outlined>
|
||||
<MudStack Row Class="ma-2">
|
||||
<MudButton IconSize="Size.Small" StartIcon="@Icons.Material.Filled.Add" Variant="Variant.Outlined" OnClick="OnAddAccountDialogAsync">Add account</MudButton>
|
||||
</MudStack>
|
||||
</MudPaper>
|
||||
|
||||
<MudTable @ref="@_table" ServerData="ServerReload">
|
||||
<ToolBarContent>
|
||||
<MudText Typo="Typo.h6">Channels</MudText>
|
||||
<MudText Typo="Typo.h6">Channels stored in the library</MudText>
|
||||
<MudSpacer />
|
||||
<MudTextField T="string" ValueChanged="@(s=>OnSearch(s))" Placeholder="Search" Adornment="Adornment.Start" DebounceInterval="300"
|
||||
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
|
||||
</ToolBarContent>
|
||||
<HeaderContent>
|
||||
<MudTh>Name</MudTh>
|
||||
<MudTh>Handle</MudTh>
|
||||
<MudTh>Channel id</MudTh>
|
||||
<MudTh>Has login</MudTh>
|
||||
</HeaderContent>
|
||||
<RowTemplate>
|
||||
<MudTd>@context.Channel?.Name</MudTd>
|
||||
<MudTd>@context.Name</MudTd>
|
||||
<MudTd>@context.Handle</MudTd>
|
||||
<MudTd>@context.Id</MudTd>
|
||||
<MudTd>@(context.HttpCookies.Any())</MudTd>
|
||||
</RowTemplate>
|
||||
<NoRecordsContent>
|
||||
<MudText>No channels found</MudText>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
using Manager.App.Components.Dialogs;
|
||||
using Manager.App.Models.Library;
|
||||
using Manager.Data.Entities.LibraryContext;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using MudBlazor;
|
||||
@@ -8,60 +6,18 @@ namespace Manager.App.Components.Pages;
|
||||
|
||||
public partial class Channels : ComponentBase
|
||||
{
|
||||
private readonly DialogOptions _dialogOptions = new() { BackdropClick = false, CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.ExtraLarge };
|
||||
private MudTable<ClientAccountEntity>? _table;
|
||||
private MudTable<ChannelEntity>? _table;
|
||||
private string _search = "";
|
||||
|
||||
private async Task<TableData<ClientAccountEntity>> ServerReload(TableState state, CancellationToken token)
|
||||
private async Task<TableData<ChannelEntity>> ServerReload(TableState state, CancellationToken token)
|
||||
{
|
||||
var results = await LibraryService.GetAccountsAsync(null, state.Page * state.PageSize, state.PageSize, token);
|
||||
return !results.IsSuccess ? new TableData<ClientAccountEntity>() : new TableData<ClientAccountEntity> { Items = results.Value, TotalItems = results.Total };
|
||||
var results = await LibraryService.GetChannelsAsync(_search, state.Page * state.PageSize, state.PageSize, token);
|
||||
return !results.IsSuccess ? new TableData<ChannelEntity>() : new TableData<ChannelEntity> { Items = results.Value, TotalItems = results.Total };
|
||||
}
|
||||
|
||||
private async Task OnAddAccountDialogAsync()
|
||||
private void OnSearch(string text)
|
||||
{
|
||||
var libSettings = LibraryOptions.Value;
|
||||
var parameters = new DialogParameters<AccountDialog> { { x => x.DefaultUserAgent, libSettings.DefaultUserAgent } };
|
||||
var dialog = await DialogService.ShowAsync<AccountDialog>("Add account", parameters, _dialogOptions);
|
||||
var result = await dialog.Result;
|
||||
|
||||
if (result == null || result.Canceled || result.Data == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var clientChannel = (ClientChannel)result.Data;
|
||||
if (clientChannel?.YouTubeClient == null)
|
||||
{
|
||||
Snackbar.Add("No YouTube client received.", Severity.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
var savedClientResult = await ClientService.SaveClientAsync(clientChannel.YouTubeClient);
|
||||
if (savedClientResult.IsSuccess)
|
||||
{
|
||||
if (_table != null)
|
||||
{
|
||||
await _table.ReloadServerData();
|
||||
}
|
||||
Snackbar.Add($"Client {clientChannel.Channel?.Handle ?? clientChannel.YouTubeClient.Id} saved!", Severity.Success);
|
||||
ClientService.AddClient(clientChannel.YouTubeClient);
|
||||
}
|
||||
else
|
||||
{
|
||||
Snackbar.Add($"Failed to store client: {savedClientResult.Error?.Description ?? "Unknown!"}", Severity.Error);
|
||||
}
|
||||
|
||||
if (clientChannel.Channel == null)
|
||||
{
|
||||
Snackbar.Add("No channel information received!", Severity.Warning);
|
||||
}
|
||||
else
|
||||
{
|
||||
var saveChannelResult = await LibraryService.SaveChannelAsync(clientChannel.Channel);
|
||||
if (!saveChannelResult.IsSuccess)
|
||||
{
|
||||
Snackbar.Add("Failed to save channel information", Severity.Warning);
|
||||
}
|
||||
}
|
||||
_search = text;
|
||||
_table?.ReloadServerData();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user