272 lines
11 KiB
Plaintext
272 lines
11 KiB
Plaintext
@page "/manage/role"
|
||
|
||
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-12 mb-4">
|
||
|
||
<form onsubmit="@(() => grid.Reload())">
|
||
<RadzenFieldset Text="@myText.Search">
|
||
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.SpaceBetween">
|
||
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
|
||
<RadzenRow AlignItems="AlignItems.Center">
|
||
<RadzenColumn Size="4">
|
||
<RadzenLabel Text="@myText.RoleName" Component="RoleName" />
|
||
</RadzenColumn>
|
||
<RadzenColumn Size="8">
|
||
<RadzenTextBox @bind-Value="RoleName" Style="width: 100%;" Name="RoleName"></RadzenTextBox>
|
||
</RadzenColumn>
|
||
</RadzenRow>
|
||
|
||
<RadzenRow AlignItems="AlignItems.Center">
|
||
<RadzenColumn Size="12">
|
||
<RadzenButton Size="ButtonSize.Medium" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="@myText.Search" />
|
||
<RadzenButton Size="ButtonSize.Medium" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="@myText.Restore" ButtonStyle="ButtonStyle.Warning" />
|
||
</RadzenColumn>
|
||
</RadzenRow>
|
||
</RadzenStack>
|
||
<RadzenButton Size="ButtonSize.Medium" ButtonStyle="ButtonStyle.Success" Icon="add_circle_outline" Click="@(() => InsertRow())" Disabled="@(rolesToInsert.Count() > 0)" Text="@myText.Add" />
|
||
</RadzenStack>
|
||
</RadzenFieldset>
|
||
</form>
|
||
</div>
|
||
<div class="col-12 mb-4">
|
||
<RadzenDataGrid @ref="grid"
|
||
LoadData="@LoadData"
|
||
IsLoading="@isLoading"
|
||
Count="@count"
|
||
EmptyText="@myText.NoDate"
|
||
Data="@roleList"
|
||
AllowColumnResize="true" AllowAlternatingRows="false"
|
||
RowUpdate="@((Pojo.Role r) => { OnUpdateRow(r); })" RowCreate="@((Pojo.Role r) => { OnCreateRow(r); })"
|
||
SelectionMode="DataGridSelectionMode.Single"
|
||
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
|
||
<Columns>
|
||
<RadzenDataGridColumn Width="50px" Title="ID" Property="Id"></RadzenDataGridColumn>
|
||
<RadzenDataGridColumn Width="120px" Title="@myText.RoleName" Property="RoleName">
|
||
<EditTemplate Context="role">
|
||
<RadzenTextBox Name="RoleName" @bind-Value="role.RoleName" Style="width:100%; display: block;" />
|
||
<RadzenRequiredValidator Style="position: absolute;z-index: 9999;" Text="@myText.InputRoleName" Component="RoleName" Popup="true" />
|
||
</EditTemplate>
|
||
</RadzenDataGridColumn>
|
||
<RadzenDataGridColumn Title="@myText.Role" Property="permissions">
|
||
<Template Context="role">
|
||
@string.Join(", ", allPremissions.Where(g => role.permissionIds?.Contains(g.Id) == true).Select(g => $"{g.PremissionName}"))
|
||
</Template>
|
||
<EditTemplate Context="role">
|
||
<RadzenDropDown @ref=dd @bind-Value=@role.permissionIds TValue="IEnumerable<int>" AllowClear="true" Name="Permissions"
|
||
Data=@allPremissions Style="width: 100%; max-width: 400px; display: block;" ItemRender="ItemRender">
|
||
<Template Context="p">
|
||
<RadzenCheckBox TValue="bool?" TriState=false Value="@IsGroupSelected(role,p)" Change="@(args => SelectGroup(args, role, (Premission)p))" />
|
||
<RadzenLabel Style=@($"margin-inline-start: 0.5rem; font-weight: {(p.Parent == null ? "bold" : "normal")}")
|
||
Text="@(p.PremissionName)"
|
||
onclick="event.target.previousElementSibling.querySelector('.rz-chkbox-box').click()" />
|
||
</Template>
|
||
<ValueTemplate Context="p">
|
||
@string.Join(", ", allPremissions.Where(g => role.permissionIds?.Contains(g.Id) == true).Take(dd.MaxSelectedLabels).Select(g => $"{g.PremissionName}"))
|
||
</ValueTemplate>
|
||
</RadzenDropDown>
|
||
<RadzenRequiredValidator Style="position: absolute;z-index: 9999;" Text="@myText.SelectRole" Component="Permissions" Popup="true" />
|
||
</EditTemplate>
|
||
</RadzenDataGridColumn>
|
||
|
||
|
||
<RadzenDataGridColumn Width="200px" Context="role" Filterable="false" Sortable="false" TextAlign="TextAlign.Right" Frozen="true" FrozenPosition="FrozenColumnPosition.Right">
|
||
<Template Context="role">
|
||
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditRow(role))" @onclick:stopPropagation="true">
|
||
</RadzenButton>
|
||
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(role))" @onclick:stopPropagation="true">
|
||
</RadzenButton>
|
||
</Template>
|
||
<EditTemplate Context="role">
|
||
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => SaveRow(role))" aria-label="Save">
|
||
</RadzenButton>
|
||
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelEdit(role))" aria-label="Cancel">
|
||
</RadzenButton>
|
||
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(role))" aria-label="Delete">
|
||
</RadzenButton>
|
||
</EditTemplate>
|
||
</RadzenDataGridColumn>
|
||
|
||
</Columns>
|
||
</RadzenDataGrid>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
@code {
|
||
@inject IRoleDao roleDao;
|
||
@inject DialogService dialogService;
|
||
@inject Toolbelt.Blazor.I18nText.I18nText I18nText;
|
||
private I18nText.local myText = new I18nText.local();
|
||
RadzenDataGrid<Pojo.Role> grid;
|
||
bool isLoading;
|
||
int count;
|
||
private IEnumerable<Pojo.Role>? roleList;
|
||
|
||
|
||
RadzenDropDown<IEnumerable<int>> dd;
|
||
IEnumerable<Premission> allPremissions;
|
||
|
||
string RoleName;
|
||
|
||
protected override async Task OnInitializedAsync()
|
||
{
|
||
myText = await I18nText.GetTextTableAsync<I18nText.local>(this);
|
||
await base.OnInitializedAsync();
|
||
List<Premission> t = new Premission().getAdminPremission();
|
||
IEnumerable<Premission> t2 = Enumerable.Empty<Premission>();
|
||
for (var i = 0; i < t.Count; i++)
|
||
{
|
||
t2 = t2.Concat(new Premission[] { t[i] });
|
||
t2 = t2.Concat(t[i].Items);
|
||
}
|
||
|
||
allPremissions = t2;
|
||
}
|
||
|
||
|
||
|
||
async Task LoadData(LoadDataArgs args)
|
||
{
|
||
isLoading = true;
|
||
|
||
var result = await roleDao.GetRolesByName(RoleName, args.Top, args.Skip);
|
||
// Update the Data property
|
||
roleList = result.Desserts;
|
||
// Update the count
|
||
count = result.TotalDesserts;
|
||
|
||
isLoading = false;
|
||
}
|
||
|
||
async Task reloadGrid()
|
||
{
|
||
RoleName = "";
|
||
await grid.Reload();
|
||
}
|
||
|
||
|
||
List<Pojo.Role> rolesToInsert = new List<Pojo.Role>();
|
||
List<Pojo.Role> rolesToUpdate = new List<Pojo.Role>();
|
||
|
||
void Reset()
|
||
{
|
||
rolesToInsert.Clear();
|
||
rolesToUpdate.Clear();
|
||
}
|
||
|
||
void Reset(Pojo.Role role)
|
||
{
|
||
rolesToInsert.Remove(role);
|
||
rolesToUpdate.Remove(role);
|
||
}
|
||
|
||
async Task EditRow(Pojo.Role role)
|
||
{
|
||
|
||
Reset();
|
||
|
||
rolesToUpdate.Add(role);
|
||
await grid.EditRow(role);
|
||
}
|
||
|
||
void OnUpdateRow(Pojo.Role role)
|
||
{
|
||
Reset(role);
|
||
|
||
// 数据库更新
|
||
roleDao.UpdateRole(role);
|
||
}
|
||
|
||
async Task SaveRow(Pojo.Role role)
|
||
{
|
||
await grid.UpdateRow(role);
|
||
}
|
||
|
||
void CancelEdit(Pojo.Role role)
|
||
{
|
||
Reset(role);
|
||
|
||
grid.CancelEditRow(role);
|
||
grid.Reload();
|
||
}
|
||
|
||
async Task DeleteRow(Pojo.Role role)
|
||
{
|
||
Reset(role);
|
||
|
||
if (roleList.Contains(role))
|
||
{
|
||
//弹出确认提示框
|
||
var b = await dialogService.OpenAsync<ConfirmDialog>(
|
||
myText.ConfirmDelete,
|
||
new Dictionary<string, object>() { { "confirmInfo", $"{myText.ConfirmDeleteRole}:" + role.RoleName + "?" } },
|
||
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
|
||
if (b)
|
||
{
|
||
// 数据库删除
|
||
roleDao.DeleteRole(role.Id);
|
||
}
|
||
await grid.Reload();
|
||
}
|
||
else
|
||
{
|
||
grid.CancelEditRow(role);
|
||
await grid.Reload();
|
||
}
|
||
}
|
||
|
||
async Task InsertRow()
|
||
{
|
||
|
||
Reset();
|
||
var role = new Pojo.Role();
|
||
rolesToInsert.Add(role);
|
||
await grid.InsertRow(role);
|
||
}
|
||
|
||
void OnCreateRow(Pojo.Role role)
|
||
{
|
||
// 数据库添加用户
|
||
int id = roleDao.InsertRole(role);
|
||
rolesToInsert.Remove(role);
|
||
grid.Reload();
|
||
}
|
||
|
||
void ItemRender(DropDownItemRenderEventArgs<IEnumerable<int>> args)
|
||
{
|
||
// Use this code to prevent default item selection.
|
||
args.Disabled = true;
|
||
args.Attributes.Add("style", $"opacity:1;{(((Premission)args.Item).Parent == null ? "" : "margin-inline-start:1rem")}");
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
bool? IsGroupSelected(Pojo.Role role,Premission p)
|
||
{
|
||
IEnumerable<int> permissionIds = role.permissionIds;
|
||
if (p.Parent == null)
|
||
{
|
||
return p.Items.Any() && p.Items.All(i => permissionIds?.Contains(i.Id) == true) ? true :
|
||
p.Items.Any(i => permissionIds?.Contains(i.Id) == true) ? null : false;
|
||
}
|
||
|
||
return permissionIds?.Contains(p.Id) == true;
|
||
}
|
||
|
||
void SelectGroup(bool? value, Pojo.Role role, Premission p)
|
||
{
|
||
IEnumerable<int> permissionIds = role.permissionIds;
|
||
var newValues = permissionIds ?? Enumerable.Empty<int>();
|
||
var items = p.Parent == null ? p.Items.Select(i => i.Id) : new int[] { p.Id };
|
||
role.permissionIds = value == true ? newValues.Concat(items) : newValues.Except(items);
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|