116 lines
3.5 KiB
Plaintext
116 lines
3.5 KiB
Plaintext
@using LucideBlazor
|
|
@using Moonlight.Shared.Http.Responses
|
|
@using Moonlight.Shared.Http.Responses.Admin
|
|
@using Moonlight.Shared.Http.Responses.Users
|
|
@using ShadcnBlazor.Buttons
|
|
@using ShadcnBlazor.DataGrids
|
|
@using ShadcnBlazor.Dialogs
|
|
@using ShadcnBlazor.Extras.Comboboxes
|
|
@using ShadcnBlazor.Extras.Common
|
|
@using ShadcnBlazor.Labels
|
|
@using ShadcnBlazor.Tabels
|
|
|
|
@inherits ShadcnBlazor.Extras.Dialogs.DialogBase
|
|
|
|
@inject HttpClient HttpClient
|
|
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
Manage members of @Role.Name
|
|
</DialogTitle>
|
|
<DialogDescription>
|
|
Manage members of this role
|
|
</DialogDescription>
|
|
</DialogHeader>
|
|
|
|
<div class="grid gap-2 mt-5">
|
|
<Label>Add new member</Label>
|
|
<div class="flex justify-start gap-1">
|
|
<Combobox @bind-Value="SelectedUser"
|
|
ClassName="w-[200px]"
|
|
FieldPlaceholder="Select user"
|
|
SearchPlaceholder="Search user"
|
|
ValueSelector="dto => dto.Username"
|
|
Source="LoadUsersAsync"/>
|
|
<WButton OnClick="AddAsync" Variant="ButtonVariant.Outline" Size="ButtonSize.Icon">
|
|
<PlusIcon/>
|
|
</WButton>
|
|
</div>
|
|
</div>
|
|
<div class="mt-3">
|
|
<DataGrid @ref="Grid"
|
|
TGridItem="UserDto"
|
|
ColumnVisibility="false"
|
|
EnableSearch="true"
|
|
EnableLiveSearch="true"
|
|
Loader="LoadAsync">
|
|
<PropertyColumn Field="dto => dto.Username"/>
|
|
<PropertyColumn Field="dto => dto.Email"/>
|
|
<TemplateColumn>
|
|
<CellTemplate>
|
|
<TableCell>
|
|
<div class="flex justify-end me-1.5">
|
|
<WButton OnClick="_ => RemoveAsync(context)" Variant="ButtonVariant.Destructive" Size="ButtonSize.Icon">
|
|
<TrashIcon/>
|
|
</WButton>
|
|
</div>
|
|
</TableCell>
|
|
</CellTemplate>
|
|
</TemplateColumn>
|
|
</DataGrid>
|
|
</div>
|
|
|
|
@code
|
|
{
|
|
[Parameter] public RoleDto Role { get; set; }
|
|
|
|
private UserDto? SelectedUser;
|
|
private DataGrid<UserDto> Grid;
|
|
|
|
private async Task<DataGridResponse<UserDto>> LoadAsync(DataGridRequest<UserDto> request)
|
|
{
|
|
var query = $"?startIndex={request.StartIndex}&length={request.Length}";
|
|
|
|
if (!string.IsNullOrWhiteSpace(request.SearchTerm))
|
|
query += $"&searchTerm={request.SearchTerm}";
|
|
|
|
var response = await HttpClient.GetFromJsonAsync<PagedData<UserDto>>(
|
|
$"api/admin/roles/{Role.Id}/members{query}"
|
|
);
|
|
|
|
return new DataGridResponse<UserDto>(response!.Data, response.TotalLength);
|
|
}
|
|
|
|
private async Task<UserDto[]> LoadUsersAsync(string? searchTerm)
|
|
{
|
|
var query = "?startIndex=0&length=100";
|
|
|
|
if (!string.IsNullOrWhiteSpace(searchTerm))
|
|
query += $"&searchTerm={searchTerm}";
|
|
|
|
var response = await HttpClient.GetFromJsonAsync<PagedData<UserDto>>(
|
|
$"api/admin/roles/{Role.Id}/members/available{query}"
|
|
);
|
|
|
|
return response!.Data;
|
|
}
|
|
|
|
private async Task AddAsync()
|
|
{
|
|
if (SelectedUser == null)
|
|
return;
|
|
|
|
await HttpClient.PutAsync($"api/admin/roles/{Role.Id}/members/{SelectedUser.Id}", null);
|
|
|
|
SelectedUser = null;
|
|
await InvokeAsync(StateHasChanged);
|
|
|
|
await Grid.RefreshAsync();
|
|
}
|
|
|
|
private async Task RemoveAsync(UserDto user)
|
|
{
|
|
await HttpClient.DeleteAsync($"api/admin/roles/{Role.Id}/members/{user.Id}");
|
|
await Grid.RefreshAsync();
|
|
}
|
|
} |