Added a View Component for Tags. Just because I've never used them before, it's not a great idea because I added a nav-drawer with them that's in _Layout.cshtml so the advantage of re-use is kind of lost, but hey... tried something new- maybe I'll find somewhere to re-use it later.
Class is simple enough:
public class TagsViewComponent : ViewComponent
{
private readonly IRepositoryService _context;
public TagsViewComponent(IRepositoryService context)
{
_context = context;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var tags = await _context.GetAllTagsAsync();
return View(tags);
}
}
<div id="nav-drawer" class="fixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform -translate-x-full bg-white w-64 dark:bg-[#0c142c] shadow-lg">
<div class="flex justify-between items-center mb-4">
<h5 class="text-lg font-semibold text-gray-800 dark:text-white">Tags Tags Tags</h5>
<button id="drawer-close" class="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-white">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div class="py-4 overflow-y-auto">
<ul class="space-y-2">
@if (User.Identity?.IsAuthenticated == true)
{
<li>
<a asp-area="" asp-controller="Blog" asp-action="Create" class="flex items-center p-2 text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-blue-900">
<span class="ml-3">Create Post</span>
</a>
</li>
<li>
<a asp-controller="Ocr" class="flex items-center p-2 text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-blue-900 group">
<span class="ml-3">OCR</span>
</a>
</li>
}
@await Component.InvokeAsync("Tags")
</ul>
</div>
And a bit of vanilla javascript to toggle:
const drawerToggle = document.getElementById('drawer-toggle');
const drawerClose = document.getElementById('drawer-close');
const drawer = document.getElementById('nav-drawer');
const contentWrapper = document.getElementById('content-wrapper');
// hamburger button
if (drawerToggle) {
drawerToggle.addEventListener('click', function() {
drawer.classList.toggle('-translate-x-full');
contentWrapper.classList.toggle('ml-64'); // Shift content by drawer width
});
}
// X button
if (drawerClose) {
drawerClose.addEventListener('click', function() {
drawer.classList.add('-translate-x-full');
contentWrapper.classList.remove('ml-64');
});
}