dbMango/Rms.Risk.Mango/Components/RoleEditControl.razor
Alexander Shabarshov 2a7a24c9e7 Initial contribution
2025-11-03 14:43:26 +00:00

300 lines
11 KiB
Plaintext

@*
* dbMango
*
* Copyright 2025 Deutsche Bank AG
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@
<style>
.full-width {
width: 408px !important;
}
.column-cb {
min-width: 30px;
width: 30px;
}
.min-w {
min-width: 100px;
}
</style>
<EditForm EditContext="EditContext">
<div class="d-flex flex-row fit-content">
<div class="fit-content mr-3">
<div class="form-row fit-content">
<FormItemText Class="mr-2" Name="Role name" Enabled="@IsNew" @bind-Value="Value.RoleName" Icon="icon-document-blank-sm" />
@if (string.IsNullOrWhiteSpace(Value.Db))
{
<FormItemText Class="mr-2" Name="Create within" Enabled="false" Value="Builtin" Icon="icon-annotate-sm" />
}
else
{
<FormItemSelect Class="mr-2" Name="Create within" Enabled="@IsNew" @bind-Value="Value.Db" Icon="icon-annotate-sm" Values="@AllDatabases" />
}
</div>
<div class="form-row fit-content">
<RolesSelector Value="@Value.Roles"
AllRoles="@AllRoles"
IsEnabled="@IsEnabled" />
</div>
</div>
<div class="fit-content">
<div class="d-flex flex-column">
<div class="form-row fit-content mb-3">
<TableControl Class="table table-hover table-striped table-forge table-forge-striped mr-3"
Items="@Value.Privileges"
PageSize="25"
Selectable="true"
SelectionChanged="@SelectedPrivilegeChanged"
Filterable="true">
<TableColumnControl Name="Db" Field="Db" Class="column-name">
<Template Context="ctx">
@if (ctx.Row is PrivilegeModel privilege)
{
if (privilege.Resource.AnyResource)
{
<span class="badge badge-secondary mr-1">Any</span>
}
else if (privilege.Resource.Cluster)
{
<span class="badge badge-secondary mr-1">Cluster</span>
}
else if (
string.IsNullOrWhiteSpace(privilege.Resource.Db)
&& string.IsNullOrWhiteSpace(privilege.Resource.Collection)
&& !string.IsNullOrWhiteSpace(privilege.Resource.Buckets)
)
{
<span class="badge badge-secondary mr-1">Buckets</span>
}
else
{
@privilege.Resource.Db
}
}
</Template>
</TableColumnControl>
<TableColumnControl Name="Collection" Field="Collection" Class="column-name" >
<Template Context="ctx">
@if (ctx.Row is PrivilegeModel privilege)
{
@privilege.Resource.Collection
}
</Template>
</TableColumnControl>
<TableColumnControl Name="Actions" Field="" >
<Template Context="ctx">
@foreach (var action in ((PrivilegeModel)ctx.Row).Actions)
{
<span class="badge badge-secondary mr-1">@action</span>
}
</Template>
</TableColumnControl>
</TableControl>
</div>
<div class="form-row fit-content mb-3">
<FormButton Name="Add" Enabled="IsEnabled" OnClick="AddPrivileges" Icon="icon-plus-sm" />
<FormButton Name="Delete" Enabled="IsEnabled" OnClick="DeletePrivileges" Icon="icon-trash-sm" />
</div>
<div class="form-row fit-content mb-3">
<FormItemText Class="mr-2" Enabled="IsEnabled" Name="Database" @bind-Value="SelectedPrivilege.Resource.Db" Icon="icon-database-sm" />
<FormItemText Class="mr-2" Enabled="IsEnabled" Name="Collection" @bind-Value="SelectedPrivilege.Resource.Collection" Icon="icon-folder-outline-sm" />
</div>
<div class="form-row fit-content mb-3">
<FormItemCheckBox Class="mr-2" Enabled="IsEnabled" Name="AnyResource" @bind-Value="SelectedPrivilege.Resource.AnyResource" Icon="icon-number-outline"/>
<FormItemCheckBox Class="mr-2" Enabled="IsEnabled" Name="Cluster" @bind-Value="SelectedPrivilege.Resource.Cluster" Icon="icon-number-outline" />
</div>
<div class="form-row fit-content mb-3">
<FormItemText Class="full-width" Enabled="IsEnabled" Name="Buckets" @bind-Value="SelectedPrivilege.Resource.Buckets" Icon="icon-layers-sm" />
</div>
<div class="form-row fit-content">
<TableControl Class="full-width table table-hover table-striped table-forge table-forge-striped mr-3"
Items="@SelectableActions"
PageSize="25"
Filterable="true">
<TableColumnControl Name="Name" Field="Name" Class="column-name"/>
<TableColumnControl Name="IsSelected" Field="IsSelected" Class="column-cb">
<Template Context="ctx">
<FormItemCheckBox @bind-Value="@(((SelectableString)ctx.Row).IsSelected)" Enabled="@IsEnabled" LabelOn="" LabelOff=""/>
</Template>
</TableColumnControl>
</TableControl>
</div>
</div>
</div>
</div>
</EditForm>
@code {
[CascadingParameter] public IModalService Modal { get; set; } = null!;
[Parameter] public string Name { get; set; } = $"newRole{++_count}";
[Parameter]
public RoleInfoModel Value
{
get => field;
set
{
if (field == value)
return;
field = value;
UpdateSelectable();
}
} = new();
[Parameter]
public List<RoleInDbModel> AllRoles
{
get;
set
{
if (field == value)
return;
field = value;
UpdateSelectable();
}
} = [];
[Parameter]
public List<string> AllActions
{
get;
set
{
if (field == value)
return;
field = value;
UpdateSelectable();
}
} = [];
[Parameter] public List<string> AllDatabases { get; set; } = [];
[Parameter] public bool IsEnabled { get; set; } = true;
[Parameter] public bool IsNew { get; set; }
private static int _count;
private EditContext EditContext => _editContext!;
private EditContext? _editContext;
public class SelectableString(string name, bool isSelected, Action<SelectableString, bool> update)
{
public override string ToString() => $"[{(IsSelected ? "X" : " ")}] {Name} {Db}";
public string Name { get; } = name;
public string Db { get; init; } = string.Empty;
public bool IsSelected
{
get;
set
{
if (field == value)
return;
field = value;
update(this, field);
}
} = isSelected;
}
private List<SelectableString> SelectableActions { get; set; } = [];
private PrivilegeModel SelectedPrivilege
{
get;
set
{
field = value;
UpdateSelectable();
}
} = new();
protected override void OnInitialized()
{
_editContext = new(this);
}
private void UpdateSelectable()
{
SelectableActions = AllActions
.Select(x => new SelectableString
(
x,
SelectedPrivilege.Actions.Contains(x),
UpdateAllowedActions
))
.ToList();
InvokeAsync(StateHasChanged);
}
private void UpdateAllowedActions(SelectableString name, bool isSelected)
{
if (isSelected)
{
if (!SelectedPrivilege.Actions.Contains(name.Name))
SelectedPrivilege.Actions.Add(name.Name);
}
else
{
SelectedPrivilege.Actions.Remove(name.Name);
}
}
private async Task SelectedPrivilegeChanged((dynamic row, string col) arg)
{
if (arg.row is not PrivilegeModel privilege)
return;
SelectedPrivilege = privilege;
await InvokeAsync(StateHasChanged);
}
private Task AddPrivileges()
{
var newPrivilege = new PrivilegeModel();
Value.Privileges.Add(newPrivilege);
SelectedPrivilege = newPrivilege;
return InvokeAsync(StateHasChanged);
}
private Task DeletePrivileges()
{
Value.Privileges.Remove(SelectedPrivilege);
SelectedPrivilege = Value.Privileges.FirstOrDefault() ?? new PrivilegeModel();
return InvokeAsync(StateHasChanged);
}
}