Files
Moonlight/Moonlight.Frontend/UI/Admin/Components/PermissionSelector.razor

86 lines
3.2 KiB
Plaintext

@using Moonlight.Frontend.Interfaces
@using Moonlight.Frontend.Models
@using ShadcnBlazor.Extras.Common
@using ShadcnBlazor.Accordions
@using ShadcnBlazor.Checkboxes
@using ShadcnBlazor.Labels
@inject IEnumerable<IPermissionProvider> Providers
<LazyLoader Load="LoadAsync">
<Accordion ClassName="flex w-full flex-col gap-2 overflow-y-auto max-h-80 scrollbar-thin"
Type="AccordionType.Multiple">
@foreach (var category in Categories)
{
<AccordionItem
ClassName="rounded-lg border bg-background px-4 last:border-b"
Value="@category.Name"
@key="category.Name">
<AccordionTrigger className="group hover:no-underline [&>svg]:hidden">
<div class="flex w-full items-center gap-3">
<div class="relative size-4 shrink-0">
<DynamicComponent Type="category.Icon" Parameters="IconParameters"/>
</div>
<span class="flex-1 text-left">@category.Name</span>
</div>
</AccordionTrigger>
<AccordionContent ClassName="ps-7">
<div class="grid gap-3 grid-cols-2">
@foreach (var permission in category.Permissions)
{
<div class="flex flex-row gap-x-2">
@if (Permissions.Contains(permission.Identifier))
{
<Checkbox ValueChanged="b => HandleToggle(permission.Identifier, b)"
DefaultValue="true"
id="@permission.Identifier"/>
}
else
{
<Checkbox ValueChanged="b => HandleToggle(permission.Identifier, b)"
DefaultValue="false"
id="@permission.Identifier"/>
}
<Label for="@permission.Identifier">@permission.Name</Label>
</div>
}
</div>
</AccordionContent>
</AccordionItem>
}
</Accordion>
</LazyLoader>
@code
{
[Parameter] public List<string> Permissions { get; set; } = new();
private static readonly Dictionary<string, object> IconParameters = new()
{
["ClassName"] = "absolute inset-0 size-4 text-muted-foreground"
};
private readonly List<PermissionCategory> Categories = new();
private async Task LoadAsync(LazyLoader _)
{
foreach (var provider in Providers)
{
Categories.AddRange(
await provider.GetPermissionsAsync()
);
}
}
private void HandleToggle(string permission, bool toggle)
{
if (toggle)
{
if (!Permissions.Contains(permission))
Permissions.Add(permission);
}
else
Permissions.Remove(permission);
}
}