LANCommander/LANCommander.Server/UI/Pages/Settings/Roles/Index.razor

148 lines
4.3 KiB
Text

@page "/Settings/Roles"
@inject RoleService RoleService
@inject IMessageService MessageService
@inject ILogger<Index> Logger
@attribute [Authorize(Roles = RoleService.AdministratorRoleName)]
<PageHeader Title="Roles" />
<DataTable
TItem="Role"
@ref="Table"
Size="TableSize.Small"
@bind-Total="Total"
Responsive
ColumnPicker
Searchable
SearchProperty="r => r.Name">
<Columns>
<BoundDataColumn Title="Name" Property="r => r.Name" Sortable DefaultSortOrder="SortDirection.Ascending" />
<DataActions TData="string">
<a href="/Settings/Roles/@(context.Id)" class="ant-btn ant-btn-primary">Edit</a>
@if (context.Name != RoleService.AdministratorRoleName)
{
<Popconfirm OnConfirm="() => DeleteRole(context)" Title="Are you sure you want to delete this role?">
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
</Popconfirm>
}
else
{
<Tooltip Title="The administrator role cannot be deleted.">
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Disabled />
</Tooltip>
}
</DataActions>
</Columns>
<RightToolbar>
<Flex Justify="FlexJustify.End" Align="FlexAlign.Center" Gap="FlexGap.Small">
<span style="white-space: nowrap;">Default Role:</span>
<Select
TItem="Role"
TItemValue="Guid"
DataSource="Roles"
OnSelectedItemChanged="DefaultRoleChanged"
LabelName="Name"
ValueName="Id"
DefaultActiveFirstOption="false"
Value="Settings.Roles.DefaultRoleId"
Disabled="Loading"
Style="min-width: 100px;"></Select>
<Button OnClick="() => ShowNewRoleDialog()" Type="@ButtonType.Primary">Add Role</Button>
</Flex>
</RightToolbar>
</DataTable>
<Modal Title="Add a Role" @bind-Visible="AddRoleDialogVisible" OnOk="AddRole" OnCancel="() => AddRoleDialogVisible = false">
<Form Model="NewRole">
<FormItem Label="Name">
<Input @bind-Value="@context.Name" />
</FormItem>
</Form>
</Modal>
@code {
Settings Settings = SettingService.GetSettings();
bool Loading = true;
bool AddRoleDialogVisible = false;
IEnumerable<Role> Roles { get; set; } = new List<Role>();
Role NewRole { get; set; } = new();
DataTable<Role> Table;
int Total;
protected override async Task OnInitializedAsync()
{
Roles = await RoleService.AsNoTracking().SortBy(r => r.Name).GetAsync();
Loading = false;
}
async Task DeleteRole(Role role)
{
role = await RoleService.FirstOrDefaultAsync(r => r.Name == role.Name);
if (role.Name == RoleService.AdministratorRoleName)
{
MessageService.Error("Cannot delete the administrator role!");
}
else
{
await RoleService.DeleteAsync(role);
Table.Reload();
MessageService.Success($"Deleted {role.Name}!");
}
}
void ShowNewRoleDialog()
{
AddRoleDialogVisible = true;
}
async Task AddRole()
{
if ((await RoleService.ExistsAsync(r => r.Name == NewRole.Name)))
{
MessageService.Error("A role with that name already exists!");
AddRoleDialogVisible = false;
return;
}
try
{
await RoleService.AddAsync(new Role
{
Name = NewRole.Name
});
Table.Reload();
MessageService.Success("Role added!");
}
catch (Exception ex)
{
MessageService.Error("Could not add role!");
Logger.LogError(ex, "Could not add role!");
}
}
async Task DefaultRoleChanged(Role defaultRole)
{
if (!Loading && defaultRole.Id != Settings.Roles.DefaultRoleId)
{
Settings = SettingService.GetSettings();
Settings.Roles.DefaultRoleId = defaultRole.Id;
SettingService.SaveSettings(Settings);
MessageService.Success($"Default role updated!");
}
}
}