SharpRSS/WebSharpRSS/Shared/CategoryGuide.razor

127 lines
4.0 KiB
Plaintext
Raw Normal View History

2023-04-30 20:13:14 +02:00
@using WebSharpRSS.Models
@using CodeHollow.FeedReader
<style>
.cat-item {
2023-05-04 20:59:25 +02:00
background: var(--background-color);
tab-index: 0;
width: 100%;
display: flex;
position: relative;
box-sizing: border-box;
text-align: start;
align-items: center;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 12px;
justify-content: flex-start;
text-decoration: none;
2023-04-30 20:13:14 +02:00
}
.cat-item:hover {
2023-05-04 20:59:25 +02:00
background: var(--hover-bg-color);
2023-04-30 20:13:14 +02:00
}
.cat-item-text {
2023-05-04 20:59:25 +02:00
flex: 1 1 auto;
min-width: 0;
2023-04-30 20:13:14 +02:00
}
.cat-item-icon {
2023-05-04 20:59:25 +02:00
display: inline-flex;
min-width: 56px;
flex-shrink: 0;
2023-04-30 20:13:14 +02:00
}
.feed-item {
2023-05-04 20:59:25 +02:00
background: var(--background-color);
tab-index: 0;
width: 100%;
display: flex;
position: relative;
box-sizing: border-box;
text-align: start;
align-items: center;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 30px;
justify-content: flex-start;
text-decoration: none;
2023-04-30 20:13:14 +02:00
}
.feed-item:hover {
2023-05-04 20:59:25 +02:00
background: var(--hover-bg-color);
2023-04-30 20:13:14 +02:00
}
2023-05-04 20:59:25 +02:00
.feed-item-text {
flex: 1 1 auto;
min-width: 0;
}
.feed-item-icon {
display: inline-flex;
min-width: 56px;
flex-shrink: 0;
}
2023-04-30 20:13:14 +02:00
</style>
<div>
<MudText>@HeaderText</MudText>
@foreach (CategoryGuideItem catItem in Categories)
{
<div>
2023-05-04 20:59:25 +02:00
<div @onclick="@(() => ItemClicked(catItem))" class="cat-item mud-ripple" style="--hover-bg-color: @catItem.CategoryHexColor; --background-color: @(catItem.IsSelected ? catItem.CategoryHexColor : "transparent")">
2023-04-30 20:13:14 +02:00
<div class="cat-item-icon">
<MudIcon Class="pointer-events-none" Icon="@catItem.CategoryIcon" Size="Size.Medium"/>
</div>
<div class="cat-item-text">
<MudText Class="pointer-events-none" Typo="Typo.subtitle1">@catItem.CategoryTitle</MudText>
</div>
</div>
@* Feeds *@
2023-05-04 20:59:25 +02:00
@if (catItem.IsExpanded && catItem.FeedItems != null)
2023-04-30 20:13:14 +02:00
{
2023-05-04 20:59:25 +02:00
foreach (FeedGuideItem feedItem in catItem.FeedItems)
2023-04-30 20:13:14 +02:00
{
2023-05-04 20:59:25 +02:00
<div @onclick="() => ItemClicked(feedItem)" class="feed-item mud-ripple" style="--hover-bg-color: @catItem.CategoryHexColor; --background-color: @(feedItem.IsSelected ? catItem.CategoryHexColor : "transparent")">
<div class="feed-item-icon">
<MudImage ObjectFit="ObjectFit.Contain" Src="http://www.google.com/s2/favicons?domain=wikipedia.com"/>
</div>
<div class="feed-item-text">
<MudText Class="pointer-events-none">@feedItem.Feed.Title</MudText>
2023-04-30 20:13:14 +02:00
</div>
</div>
}
}
</div>
}
</div>
@code {
[Parameter]
public string HeaderText { get; set; }
[Parameter]
public HashSet<CategoryGuideItem> Categories { get; set; } = new HashSet<CategoryGuideItem>();
[Parameter]
public Action<CategoryGuideItem>? CatItemClicked { get; set; }
2023-05-04 20:59:25 +02:00
[Parameter]
public Action<FeedGuideItem>? FeedItemClicked { get; set; }
2023-04-30 20:13:14 +02:00
2023-05-04 20:59:25 +02:00
ISelectableGuideItem? _selectedCategory;
2023-04-30 20:13:14 +02:00
2023-05-04 20:59:25 +02:00
void ItemClicked(ISelectableGuideItem categoryItem)
2023-04-30 20:13:14 +02:00
{
categoryItem.IsExpanded = !categoryItem.IsExpanded;
if (_selectedCategory != categoryItem)
{
if (_selectedCategory != null)
_selectedCategory.IsSelected = false;
_selectedCategory = categoryItem;
_selectedCategory.IsSelected = true;
}
switch (categoryItem)
{
case CategoryGuideItem catGuideItem:
CatItemClicked?.Invoke(catGuideItem);
break;
case FeedGuideItem feedGuideItem:
FeedItemClicked?.Invoke(feedGuideItem);
break;
}
2023-04-30 20:13:14 +02:00
}
}