|
|
|
@ -3,8 +3,8 @@ |
|
|
|
@using ErsatzTV.Extensions |
|
|
|
@using ErsatzTV.Extensions |
|
|
|
@using ErsatzTV.Application.Search |
|
|
|
@using ErsatzTV.Application.Search |
|
|
|
@implements IDisposable |
|
|
|
@implements IDisposable |
|
|
|
@inject NavigationManager _navigationManager |
|
|
|
@inject NavigationManager NavigationManager |
|
|
|
@inject IMediator _mediator |
|
|
|
@inject IMediator Mediator |
|
|
|
|
|
|
|
|
|
|
|
<MudThemeProvider Theme="_ersatzTvTheme"/> |
|
|
|
<MudThemeProvider Theme="_ersatzTvTheme"/> |
|
|
|
<MudDialogProvider DisableBackdropClick="true"/> |
|
|
|
<MudDialogProvider DisableBackdropClick="true"/> |
|
|
|
@ -17,49 +17,51 @@ |
|
|
|
<img src="images/ersatztv.png" alt="ErsatzTV"/> |
|
|
|
<img src="images/ersatztv.png" alt="ErsatzTV"/> |
|
|
|
</a> |
|
|
|
</a> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<EditForm Model="@_dummyModel" OnSubmit="@(_ => PerformSearch())"> |
|
|
|
<div class="search-form"> |
|
|
|
<MudTextField T="string" |
|
|
|
<EditForm Model="@_dummyModel" OnSubmit="@(_ => PerformSearch())"> |
|
|
|
@bind-Value="@Query" |
|
|
|
<MudTextField T="string" |
|
|
|
AdornmentIcon="@Icons.Material.Filled.Search" |
|
|
|
@bind-Value="@Query" |
|
|
|
Adornment="Adornment.Start" |
|
|
|
AdornmentIcon="@Icons.Material.Filled.Search" |
|
|
|
Variant="Variant.Outlined" |
|
|
|
Adornment="Adornment.Start" |
|
|
|
Immediate="true" |
|
|
|
Variant="Variant.Outlined" |
|
|
|
Class="search-bar" |
|
|
|
Immediate="true" |
|
|
|
@onclick="@(() => _isOpen = true)" |
|
|
|
Class="search-bar" |
|
|
|
OnKeyUp="OnKeyUp"> |
|
|
|
@onclick="@(() => _isOpen = true)" |
|
|
|
</MudTextField> |
|
|
|
OnKeyUp="OnKeyUp"> |
|
|
|
<MudPopover Open="@_isOpen" MaxHeight="300" AnchorOrigin="Origin.BottomCenter" TransformOrigin="Origin.TopCenter" RelativeWidth="true"> |
|
|
|
</MudTextField> |
|
|
|
@if (!string.IsNullOrWhiteSpace(_query) && _query.Length >= 3) |
|
|
|
<MudPopover Open="@_isOpen" MaxHeight="300" AnchorOrigin="Origin.BottomCenter" TransformOrigin="Origin.TopCenter" RelativeWidth="true"> |
|
|
|
{ |
|
|
|
@if (!string.IsNullOrWhiteSpace(_query) && _query.Length >= 3) |
|
|
|
var matches = _searchTargets.Where(s => s.Name.Contains(_query, StringComparison.CurrentCultureIgnoreCase)).ToList(); |
|
|
|
|
|
|
|
if (matches.Any()) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudList Clickable="true" Dense="true"> |
|
|
|
var matches = _searchTargets.Where(s => s.Name.Contains(_query, StringComparison.CurrentCultureIgnoreCase)).ToList(); |
|
|
|
@foreach (SearchTargetViewModel searchTarget in matches) |
|
|
|
if (matches.Any()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudListItem @key="@searchTarget" OnClick="@(() => NavigateTo(searchTarget))"> |
|
|
|
<MudList Clickable="true" Dense="true"> |
|
|
|
<MudText Typo="Typo.body1">@searchTarget.Name</MudText> |
|
|
|
@foreach (SearchTargetViewModel searchTarget in matches) |
|
|
|
<MudText Typo="Typo.subtitle1" Class="mud-text-disabled"> |
|
|
|
{ |
|
|
|
@(searchTarget.Kind switch |
|
|
|
<MudListItem @key="@searchTarget" OnClick="@(() => NavigateTo(searchTarget))"> |
|
|
|
{ |
|
|
|
<MudText Typo="Typo.body1">@searchTarget.Name</MudText> |
|
|
|
SearchTargetKind.Channel => "Channel", |
|
|
|
<MudText Typo="Typo.subtitle1" Class="mud-text-disabled"> |
|
|
|
SearchTargetKind.FFmpegProfile => "FFmpeg Profile", |
|
|
|
@(searchTarget.Kind switch |
|
|
|
SearchTargetKind.ChannelWatermark => "Channel Watermark", |
|
|
|
{ |
|
|
|
SearchTargetKind.Collection => "Collection", |
|
|
|
SearchTargetKind.Channel => "Channel", |
|
|
|
SearchTargetKind.MultiCollection => "Multi Collection", |
|
|
|
SearchTargetKind.FFmpegProfile => "FFmpeg Profile", |
|
|
|
SearchTargetKind.SmartCollection => "Smart Collection", |
|
|
|
SearchTargetKind.ChannelWatermark => "Channel Watermark", |
|
|
|
SearchTargetKind.Schedule => "Schedule", |
|
|
|
SearchTargetKind.Collection => "Collection", |
|
|
|
SearchTargetKind.ScheduleItems => "Schedule Items", |
|
|
|
SearchTargetKind.MultiCollection => "Multi Collection", |
|
|
|
_ => string.Empty |
|
|
|
SearchTargetKind.SmartCollection => "Smart Collection", |
|
|
|
}) |
|
|
|
SearchTargetKind.Schedule => "Schedule", |
|
|
|
</MudText> |
|
|
|
SearchTargetKind.ScheduleItems => "Schedule Items", |
|
|
|
</MudListItem> |
|
|
|
_ => string.Empty |
|
|
|
} |
|
|
|
}) |
|
|
|
</MudList> |
|
|
|
</MudText> |
|
|
|
|
|
|
|
</MudListItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudList> |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
</MudPopover> |
|
|
|
</MudPopover> |
|
|
|
</EditForm> |
|
|
|
</EditForm> |
|
|
|
</div> |
|
|
|
<MudSpacer/> |
|
|
|
<MudSpacer/> |
|
|
|
<MudLink Color="Color.Info" Href="iptv/channels.m3u" Target="_blank" Underline="Underline.None">M3U</MudLink> |
|
|
|
<MudLink Color="Color.Info" Href="iptv/channels.m3u" Target="_blank" Underline="Underline.None">M3U</MudLink> |
|
|
|
<MudLink Color="Color.Info" Href="iptv/xmltv.xml" Target="_blank" Class="mx-4" Underline="Underline.None">XMLTV</MudLink> |
|
|
|
<MudLink Color="Color.Info" Href="iptv/xmltv.xml" Target="_blank" Class="mx-4" Underline="Underline.None">XMLTV</MudLink> |
|
|
|
@ -73,6 +75,13 @@ |
|
|
|
<MudTooltip Text="GitHub"> |
|
|
|
<MudTooltip Text="GitHub"> |
|
|
|
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Primary" Link="https://github.com/jasongdove/ErsatzTV" Target="_blank"/> |
|
|
|
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Primary" Link="https://github.com/jasongdove/ErsatzTV" Target="_blank"/> |
|
|
|
</MudTooltip> |
|
|
|
</MudTooltip> |
|
|
|
|
|
|
|
<AuthorizeView> |
|
|
|
|
|
|
|
<form action="/account/logout" method="post"> |
|
|
|
|
|
|
|
<MudTooltip Text="Logout"> |
|
|
|
|
|
|
|
<MudIconButton Icon="@Icons.Material.Filled.Logout" Color="Color.Secondary" ButtonType="ButtonType.Submit"/> |
|
|
|
|
|
|
|
</MudTooltip> |
|
|
|
|
|
|
|
</form> |
|
|
|
|
|
|
|
</AuthorizeView> |
|
|
|
</MudAppBar> |
|
|
|
</MudAppBar> |
|
|
|
<MudDrawer Open="true" Elevation="2" ClipMode="DrawerClipMode.Always"> |
|
|
|
<MudDrawer Open="true" Elevation="2" ClipMode="DrawerClipMode.Always"> |
|
|
|
<MudNavMenu> |
|
|
|
<MudNavMenu> |
|
|
|
@ -176,17 +185,17 @@ |
|
|
|
protected override async Task OnParametersSetAsync() |
|
|
|
protected override async Task OnParametersSetAsync() |
|
|
|
{ |
|
|
|
{ |
|
|
|
await base.OnParametersSetAsync(); |
|
|
|
await base.OnParametersSetAsync(); |
|
|
|
_query = _navigationManager.Uri.GetSearchQuery(); |
|
|
|
_query = NavigationManager.Uri.GetSearchQuery(); |
|
|
|
|
|
|
|
|
|
|
|
if (_searchTargets is null) |
|
|
|
if (_searchTargets is null) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_searchTargets = await _mediator.Send(new QuerySearchTargets(), _cts.Token); |
|
|
|
_searchTargets = await Mediator.Send(new QuerySearchTargets(), _cts.Token); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void PerformSearch() |
|
|
|
private void PerformSearch() |
|
|
|
{ |
|
|
|
{ |
|
|
|
_navigationManager.NavigateTo(_query.GetRelativeSearchQuery(), true); |
|
|
|
NavigationManager.NavigateTo(_query.GetRelativeSearchQuery(), true); |
|
|
|
StateHasChanged(); |
|
|
|
StateHasChanged(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -206,7 +215,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
private void NavigateTo(SearchTargetViewModel searchTarget) => |
|
|
|
private void NavigateTo(SearchTargetViewModel searchTarget) => |
|
|
|
// need to force smart collections to navigate since the query string is all that differs |
|
|
|
// need to force smart collections to navigate since the query string is all that differs |
|
|
|
_navigationManager.NavigateTo(UrlFor(searchTarget), searchTarget.Kind is SearchTargetKind.SmartCollection); |
|
|
|
NavigationManager.NavigateTo(UrlFor(searchTarget), searchTarget.Kind is SearchTargetKind.SmartCollection); |
|
|
|
|
|
|
|
|
|
|
|
private string UrlFor(SearchTargetViewModel searchTarget) => |
|
|
|
private string UrlFor(SearchTargetViewModel searchTarget) => |
|
|
|
searchTarget.Kind switch |
|
|
|
searchTarget.Kind switch |
|
|
|
|