From 2615988772c65b737d7d63c67a83cbf4dd27968c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Thu, 15 Jan 2026 16:19:10 +0300 Subject: [PATCH] created permission management module pages for MudBlazor --- .../PermissionManagementModal.razor | 70 ++++ .../PermissionManagementModal.razor.cs | 378 ++++++++++++++++++ .../ResourcePermissionManagementModal.razor | 156 ++++++++ ...ResourcePermissionManagementModal.razor.cs | 324 +++++++++++++++ 4 files changed, 928 insertions(+) create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor.cs create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor create mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor.cs diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor new file mode 100644 index 0000000000..022bb19b26 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor @@ -0,0 +1,70 @@ +@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase +@using MudBlazor +@using Volo.Abp.PermissionManagement.Localization + + + + @L["Permissions"] - @_entityDisplayName + + + + + + + + + + + + + @L["PermissionGroup"] + + @if (_groups != null && _groups.Any()) + { + + @foreach (var group in _groups) + { + x.IsGranted)})")"> +
+ + + + @foreach (var permission in group.Permissions) + { + var depth = GetPermissionDepthOrDefault(permission.Name); +
+ +
+ } +
+
+ } +
+ } +
+
+ + @L["Cancel"] + @L["Save"] + +
diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor.cs new file mode 100644 index 0000000000..678fc5aedc --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/PermissionManagementModal.razor.cs @@ -0,0 +1,378 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using MudBlazor; +using Volo.Abp.AspNetCore.Components.Messages; +using Volo.Abp.AspNetCore.Components.Web.Configuration; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; +using Volo.Abp.PermissionManagement.Localization; + +namespace Volo.Abp.PermissionManagement.Blazor.MudBlazor.Components; + +public partial class PermissionManagementModal +{ + [Inject] protected IPermissionAppService PermissionAppService { get; set; } = default!; + [Inject] protected ICurrentApplicationConfigurationCacheResetService CurrentApplicationConfigurationCacheResetService { get; set; } = default!; + [Inject] protected IOptions LocalizationOptions { get; set; } = default!; + [Inject] protected IDialogService DialogService { get; set; } = default!; + [Inject] protected ISnackbar Snackbar { get; set; } = default!; + + protected bool _isVisible; + + protected string? _providerName; + protected string? _providerKey; + + protected string? _entityDisplayName; + protected List? _allGroups; + protected List? _groups; + + protected List _disabledPermissions = new List(); + + protected int _activeTabIndex = 0; + + protected bool _selectAllDisabled; + + protected string? _permissionGroupSearchText; + + protected bool GrantAll { get; set; } + protected bool GrantAny { get; set; } + + protected Dictionary _permissionDepths = new Dictionary(); + + public PermissionManagementModal() + { + LocalizationResource = typeof(AbpPermissionManagementResource); + } + + public virtual async Task OpenAsync(string providerName, string providerKey, string? entityDisplayName = null) + { + try + { + _providerName = providerName; + _providerKey = providerKey; + _permissionGroupSearchText = null; + + var result = await PermissionAppService.GetAsync(_providerName, _providerKey); + + _entityDisplayName = entityDisplayName ?? result.EntityDisplayName; + _allGroups = result.Groups.OrderBy(x => x.DisplayName).ToList(); + _groups = _allGroups.ToList(); + + NormalizePermissionGroup(); + + GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + + _isVisible = true; + await InvokeAsync(StateHasChanged); + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } + + protected virtual async Task GrantAllAsync(bool grantAll) + { + GrantAll = grantAll; + GrantAny = false; + + if (_allGroups == null) + { + return; + } + + await ResetSearchTextAsync(); + + foreach (var permission in _allGroups.SelectMany(x => x.Permissions)) + { + if (IsDisabledPermission(permission)) + { + continue; + } + + permission.IsGranted = grantAll; + } + + await InvokeAsync(StateHasChanged); + } + + protected virtual void NormalizePermissionGroup(bool checkDisabledPermissions = true) + { + if (_groups == null) + { + return; + } + + _selectAllDisabled = _groups.All(IsPermissionGroupDisabled); + + if (checkDisabledPermissions) + { + _disabledPermissions.Clear(); + } + + foreach (var permission in _groups.SelectMany(x => x.Permissions)) + { + if (checkDisabledPermissions && permission.IsGranted && permission.GrantedProviders.All(x => x.ProviderName != _providerName)) + { + _disabledPermissions.Add(permission); + } + } + + foreach (var group in _groups) + { + SetPermissionDepths(group.Permissions, null, 0); + } + + if (_groups.Count != 0) + { + _activeTabIndex = 0; + } + } + + protected Task CloseModal() + { + _isVisible = false; + return InvokeAsync(StateHasChanged); + } + + protected virtual async Task SaveAsync() + { + try + { + if (_allGroups == null) + { + return; + } + + var updateDto = new UpdatePermissionsDto + { + Permissions = _allGroups + .SelectMany(g => g.Permissions) + .Select(p => new UpdatePermissionDto { IsGranted = p.IsGranted, Name = p.Name }) + .ToArray() + }; + + if (!updateDto.Permissions.Any(x => x.IsGranted)) + { + var confirmed = await DialogService.ShowMessageBox( + L["Warning"], + L["SaveWithoutAnyPermissionsWarningMessage"], + yesText: L["Yes"], + cancelText: L["Cancel"]); + + if (confirmed != true) + { + return; + } + } + + await PermissionAppService.UpdateAsync(_providerName!, _providerKey!, updateDto); + + Guid? userId = null; + if (_providerName == UserPermissionValueProvider.ProviderName && Guid.TryParse(_providerKey, out var parsedUserId)) + { + userId = parsedUserId; + } + + await CurrentApplicationConfigurationCacheResetService.ResetAsync(userId); + + _isVisible = false; + await InvokeAsync(StateHasChanged); + Snackbar.Add(L["SavedSuccessfully"], Severity.Success); + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } + + protected virtual string GetNormalizedGroupName(string name) + { + return "PermissionGroup_" + name.Replace(".", "_"); + } + + protected virtual void SetPermissionDepths(List permissions, string? currentParent, int currentDepth) + { + foreach (var item in permissions) + { + if (item.ParentName == currentParent) + { + _permissionDepths[item.Name] = currentDepth; + SetPermissionDepths(permissions, item.Name, currentDepth + 1); + } + } + } + + protected virtual int GetPermissionDepthOrDefault(string name) + { + return _permissionDepths.GetValueOrDefault(name, 0); + } + + protected virtual async Task GroupGrantAllChanged(bool value, PermissionGroupDto permissionGroup) + { + foreach (var permission in permissionGroup.Permissions) + { + if (!IsDisabledPermission(permission)) + { + SetPermissionGrant(permission, value); + } + } + + if (_groups != null) + { + GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + } + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task PermissionChanged(bool value, PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) + { + SetPermissionGrant(permission, value); + + if (value) + { + SetParentPermissionGrant(permissionGroup, permission); + } + else + { + var childPermissions = GetChildPermissions(permissionGroup, permission); + + foreach (var childPermission in childPermissions) + { + SetPermissionGrant(childPermission, false); + } + } + + if (_groups != null) + { + GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + } + await InvokeAsync(StateHasChanged); + } + + private void SetParentPermissionGrant(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) + { + if (permission.ParentName == null) + { + return; + } + + var parentPermission = GetParentPermission(permissionGroup, permission); + SetPermissionGrant(parentPermission, true); + + SetParentPermissionGrant(permissionGroup, parentPermission); + } + + private void SetPermissionGrant(PermissionGrantInfoDto permission, bool value) + { + if (permission.IsGranted == value) + { + return; + } + + permission.IsGranted = value; + } + + protected virtual PermissionGrantInfoDto GetParentPermission(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) + { + return permissionGroup.Permissions.First(x => x.Name == permission.ParentName); + } + + protected virtual List GetChildPermissions(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) + { + var childPermissions = new List(); + GetChildPermissions(childPermissions, permissionGroup.Permissions, permission); + return childPermissions; + } + + protected virtual void GetChildPermissions(List allChildPermissions, List permissions, PermissionGrantInfoDto permission) + { + var childPermissions = permissions.Where(x => x.ParentName == permission.Name).ToList(); + if (childPermissions.Count == 0) + { + return; + } + + allChildPermissions.AddRange(childPermissions); + + foreach (var childPermission in childPermissions) + { + GetChildPermissions(allChildPermissions, permissions, childPermission); + } + } + + protected virtual bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo) + { + return _disabledPermissions.Any(x => x == permissionGrantInfo); + } + + protected virtual string GetShownName(PermissionGrantInfoDto permissionGrantInfo) + { + if (!IsDisabledPermission(permissionGrantInfo)) + { + return permissionGrantInfo.DisplayName; + } + + return string.Format( + "{0} ({1})", + permissionGrantInfo.DisplayName, + permissionGrantInfo.GrantedProviders + .Where(p => p.ProviderName != _providerName) + .Select(p => p.ProviderName) + .JoinAsString(", ") + ); + } + + protected virtual bool IsPermissionGroupDisabled(PermissionGroupDto group) + { + var permissions = group.Permissions; + var grantedProviders = permissions.SelectMany(x => x.GrantedProviders); + + return permissions.All(x => x.IsGranted) && grantedProviders.Any(p => p.ProviderName != _providerName); + } + + protected virtual async Task ResetSearchTextAsync() + { + _permissionGroupSearchText = string.Empty; + if (_allGroups != null) + { + _groups = _permissionGroupSearchText.IsNullOrWhiteSpace() + ? _allGroups.ToList() + : _allGroups.Where(x => x.DisplayName.Contains(_permissionGroupSearchText!, StringComparison.OrdinalIgnoreCase) || x.Permissions.Any(permission => permission.DisplayName.Contains(_permissionGroupSearchText!, StringComparison.OrdinalIgnoreCase))).ToList(); + + NormalizePermissionGroup(false); + } + + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task OnPermissionGroupSearchTextChangedAsync(string? value) + { + if (value == _permissionGroupSearchText) + { + return; + } + + _permissionGroupSearchText = value; + if (_allGroups != null) + { + _groups = _permissionGroupSearchText.IsNullOrWhiteSpace() + ? _allGroups.ToList() + : _allGroups.Where(x => x.DisplayName.Contains(_permissionGroupSearchText!, StringComparison.OrdinalIgnoreCase) || x.Permissions.Any(permission => permission.DisplayName.Contains(_permissionGroupSearchText!, StringComparison.OrdinalIgnoreCase))).ToList(); + + GrantAll = _groups.SelectMany(x => x.Permissions).All(p => p.IsGranted); + GrantAny = !GrantAll && _groups.SelectMany(x => x.Permissions).Any(p => p.IsGranted); + + NormalizePermissionGroup(false); + } + + await InvokeAsync(StateHasChanged); + } +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor new file mode 100644 index 0000000000..481aa52835 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor @@ -0,0 +1,156 @@ +@using MudBlazor +@using Volo.Abp.PermissionManagement.Localization +@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase + + + + @L["ResourcePermissions"] - @ResourceDisplayName + + + @if (HasAnyResourcePermission && HasAnyResourceProviderKeyLookupService) + { +
+ + @L["AddResourcePermission"] + +
+ + + + + + + @L["Edit"] + + + @L["Delete"] + + + + + + + + + @context.ProviderName + + + @context.ProviderDisplayName + + + + + @foreach (var permission in context.Permissions) + { + + @permission.DisplayName + + } + + + + + @L["NoDataAvailableInDatatable"] + + + } + else + { + + @if (!HasAnyResourcePermission) + { + @L["NoResourcePermissionFound"] + } + else if (!HasAnyResourceProviderKeyLookupService) + { + @L["NoResourceProviderKeyLookupServiceFound"] + } + + } +
+ + @L["Close"] + +
+ +@* Create Resource Permission Dialog *@ +@if (_createDialogVisible) +{ + + + @L["AddResourcePermission"] + + + + @L["ResourcePermissionTarget"] + + @foreach (var keyLookupService in ResourceProviderKeyLookupServices) + { + @keyLookupService.DisplayName + } + + + @L["ResourcePermissionPermissions"] + +
+ @foreach (var permission in CreateEntity.Permissions) + { + + } +
+
+
+ + @L["Cancel"] + @L["Save"] + +
+} + +@* Edit Resource Permission Dialog *@ +@if (_editDialogVisible) +{ + + + @L["UpdateResourcePermission"] + + + + @L["ResourcePermissionPermissions"] + +
+ @foreach (var permission in EditEntity.Permissions) + { + + } +
+
+
+ + @L["Cancel"] + @L["Save"] + +
+} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor.cs new file mode 100644 index 0000000000..fbdffa2ac2 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor.MudBlazor/Components/ResourcePermissionManagementModal.razor.cs @@ -0,0 +1,324 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using MudBlazor; +using Volo.Abp.AspNetCore.Components.Messages; +using Volo.Abp.PermissionManagement.Localization; + +namespace Volo.Abp.PermissionManagement.Blazor.MudBlazor.Components; + +public partial class ResourcePermissionManagementModal +{ + [Inject] protected IPermissionAppService PermissionAppService { get; set; } = default!; + + [Inject] protected IUiMessageService UiMessageService { get; set; } = default!; + + [Inject] protected ISnackbar Snackbar { get; set; } = default!; + + [Inject] protected IDialogService DialogService { get; set; } = default!; + + protected bool _isVisible; + protected bool _createDialogVisible; + protected bool _editDialogVisible; + protected MudForm? _createFormRef; + protected MudForm? _editFormRef; + + public bool HasAnyResourcePermission { get; set; } + public bool HasAnyResourceProviderKeyLookupService { get; set; } + protected string? ResourceName { get; set; } + protected string? ResourceKey { get; set; } + protected string? ResourceDisplayName { get; set; } + protected int PageSize { get; set; } = 10; + + protected CreateModel CreateEntity { get; set; } = new CreateModel + { + Permissions = new List() + }; + + protected SearchProviderKeyInfo? _selectedProviderKey; + protected string? ProviderKey => _selectedProviderKey?.ProviderKey; + protected string? ProviderDisplayName => _selectedProviderKey?.ProviderDisplayName; + + public GetResourcePermissionDefinitionListResultDto ResourcePermissionDefinitions { get; set; } = new() + { + Permissions = new List() + }; + protected string? CurrentLookupService { get; set; } + protected List ResourceProviderKeyLookupServices { get; set; } = new(); + protected List ProviderKeys { get; set; } = new(); + protected GetResourcePermissionListResultDto ResourcePermissionList = new() + { + Permissions = new List() + }; + + protected EditModel EditEntity { get; set; } = new EditModel + { + Permissions = new List() + }; + + protected bool _grantAllCreate; + protected bool _grantAllEdit; + + public ResourcePermissionManagementModal() + { + LocalizationResource = typeof(AbpPermissionManagementResource); + } + + public virtual async Task OpenAsync(string resourceName, string resourceKey, string resourceDisplayName) + { + try + { + ResourceName = resourceName; + ResourceKey = resourceKey; + ResourceDisplayName = resourceDisplayName; + + ResourcePermissionDefinitions = await PermissionAppService.GetResourceDefinitionsAsync(ResourceName); + ResourceProviderKeyLookupServices = (await PermissionAppService.GetResourceProviderKeyLookupServicesAsync(ResourceName)).Providers; + + HasAnyResourcePermission = ResourcePermissionDefinitions.Permissions.Any(); + if (HasAnyResourcePermission) + { + HasAnyResourceProviderKeyLookupService = ResourceProviderKeyLookupServices.Count > 0; + } + + await InvokeAsync(StateHasChanged); + + ResourcePermissionList = await PermissionAppService.GetResourceAsync(ResourceName, ResourceKey); + + _isVisible = true; + await InvokeAsync(StateHasChanged); + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } + + protected virtual Task CloseModal() + { + _isVisible = false; + return InvokeAsync(StateHasChanged); + } + + protected virtual async Task OpenCreateDialogAsync() + { + CurrentLookupService = ResourceProviderKeyLookupServices.FirstOrDefault()?.Name; + + _selectedProviderKey = null; + ProviderKeys = new List(); + if (_createFormRef != null) + { + await _createFormRef.ResetAsync(); + } + + CreateEntity = new CreateModel + { + Permissions = ResourcePermissionDefinitions.Permissions.Select(x => new ResourcePermissionModel + { + Name = x.Name, + DisplayName = x.DisplayName, + IsGranted = false + }).ToList() + }; + + _grantAllCreate = false; + _createDialogVisible = true; + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task SelectedProviderKeyChanged(SearchProviderKeyInfo? value) + { + _selectedProviderKey = value; + + if (value != null && CurrentLookupService != null) + { + var permissionGrants = await PermissionAppService.GetResourceByProviderAsync(ResourceName!, ResourceKey!, CurrentLookupService, value.ProviderKey); + foreach (var permission in CreateEntity.Permissions) + { + permission.IsGranted = permissionGrants.Permissions.Any(p => p.Name == permission.Name && p.Providers.Contains(CurrentLookupService) && p.IsGranted); + } + + _grantAllCreate = CreateEntity.Permissions.All(x => x.IsGranted); + } + + await InvokeAsync(StateHasChanged); + } + + private async Task> SearchProviderKeyAsync(string value, CancellationToken token) + { + if (value.IsNullOrWhiteSpace() || CurrentLookupService == null) + { + ProviderKeys = new List(); + return ProviderKeys; + } + + ProviderKeys = (await PermissionAppService.SearchResourceProviderKeyAsync(ResourceName!, CurrentLookupService, value, 1)).Keys; + + return ProviderKeys; + } + + protected virtual async Task GrantAllCreateAsync(bool value) + { + _grantAllCreate = value; + foreach (var permission in CreateEntity.Permissions) + { + permission.IsGranted = value; + } + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task GrantAllEditAsync(bool value) + { + _grantAllEdit = value; + foreach (var permission in EditEntity.Permissions) + { + permission.IsGranted = value; + } + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task OpenEditDialogAsync(ResourcePermissionGrantInfoDto permission) + { + var resourcePermissions = await PermissionAppService.GetResourceByProviderAsync(ResourceName!, ResourceKey!, permission.ProviderName, permission.ProviderKey); + EditEntity = new EditModel + { + ProviderName = permission.ProviderName, + ProviderKey = permission.ProviderKey, + Permissions = resourcePermissions.Permissions.Select(x => new ResourcePermissionModel + { + Name = x.Name, + DisplayName = x.DisplayName, + IsGranted = x.IsGranted + }).ToList() + }; + + _grantAllEdit = EditEntity.Permissions.All(x => x.IsGranted); + _editDialogVisible = true; + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task CloseCreateDialogAsync() + { + _createDialogVisible = false; + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task CloseEditDialogAsync() + { + _editDialogVisible = false; + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task OnLookupServiceCheckedValueChanged(string? value) + { + CurrentLookupService = value; + _selectedProviderKey = null; + ProviderKeys = new List(); + if (_createFormRef != null) + { + await _createFormRef.ResetAsync(); + } + await InvokeAsync(StateHasChanged); + } + + protected virtual async Task CreateResourcePermissionAsync() + { + if (_createFormRef != null && !await _createFormRef.Validate()) + { + return; + } + + if (ProviderKey == null || CurrentLookupService == null) + { + return; + } + + await PermissionAppService.UpdateResourceAsync( + ResourceName!, + ResourceKey!, + new UpdateResourcePermissionsDto + { + ProviderName = CurrentLookupService, + ProviderKey = ProviderKey, + Permissions = CreateEntity.Permissions.Where(p => p.IsGranted).Select(p => p.Name).ToList() + } + ); + + await CloseCreateDialogAsync(); + ResourcePermissionList = await PermissionAppService.GetResourceAsync(ResourceName!, ResourceKey!); + await InvokeAsync(StateHasChanged); + Snackbar.Add(L["SavedSuccessfully"], Severity.Success); + } + + protected virtual async Task UpdateResourcePermissionAsync() + { + if (_editFormRef != null && !await _editFormRef.Validate()) + { + return; + } + + await PermissionAppService.UpdateResourceAsync( + ResourceName!, + ResourceKey!, + new UpdateResourcePermissionsDto + { + ProviderName = EditEntity.ProviderName, + ProviderKey = EditEntity.ProviderKey, + Permissions = EditEntity.Permissions.Where(p => p.IsGranted).Select(p => p.Name).ToList() + } + ); + + await CloseEditDialogAsync(); + ResourcePermissionList = await PermissionAppService.GetResourceAsync(ResourceName!, ResourceKey!); + await InvokeAsync(StateHasChanged); + Snackbar.Add(L["SavedSuccessfully"], Severity.Success); + } + + protected virtual async Task DeleteResourcePermissionAsync(ResourcePermissionGrantInfoDto permission) + { + var confirmed = await DialogService.ShowMessageBox( + L["AreYouSure"], + L["ResourcePermissionDeletionConfirmationMessage"], + yesText: L["Yes"], + cancelText: L["Cancel"]); + + if (confirmed == true) + { + await PermissionAppService.DeleteResourceAsync( + ResourceName!, + ResourceKey!, + permission.ProviderName, + permission.ProviderKey + ); + + ResourcePermissionList = await PermissionAppService.GetResourceAsync(ResourceName!, ResourceKey!); + Snackbar.Add(L["DeletedSuccessfully"], Severity.Success); + await InvokeAsync(StateHasChanged); + } + } + + public class CreateModel + { + public List Permissions { get; set; } = new(); + } + + public class EditModel + { + public string ProviderName { get; set; } = string.Empty; + + public string ProviderKey { get; set; } = string.Empty; + + public List Permissions { get; set; } = new(); + } + + public class ResourcePermissionModel + { + public string Name { get; set; } = string.Empty; + + public string DisplayName { get; set; } = string.Empty; + + public bool IsGranted { get; set; } + } +}