Improved server share permission handling and share ui
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
@using MoonCore.Blazor.FlyonUi.Components
|
||||
@using MoonlightServers.Shared.Enums
|
||||
@using MoonlightServers.Shared.Http.Requests.Client.Servers.Shares
|
||||
@using MoonlightServers.Shared.Models
|
||||
@using MoonlightServers.Shared.Http.Responses.Client.Servers
|
||||
|
||||
@inherits MoonCore.Blazor.FlyonUi.Modals.Components.BaseModal
|
||||
|
||||
@@ -14,48 +14,7 @@
|
||||
<label class="block text-sm font-medium leading-6 text-base-content">Username</label>
|
||||
<input @bind="Request.Username" type="text" class="input w-full"/>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-y-5 lg:gap-y-3">
|
||||
@foreach (var name in Names)
|
||||
{
|
||||
var i = Permissions.TryGetValue(name, out var permission) ? (int)permission : -1;
|
||||
|
||||
<div class="col-span-1 flex flex-col justify-center lg:justify-start text-center lg:text-start">
|
||||
<span>@name</span>
|
||||
<span class="text-base-content/80 text-sm">This is a long description</span>
|
||||
</div>
|
||||
|
||||
<div class="col-span-1 flex justify-end">
|
||||
<div class="join drop-shadow">
|
||||
@if (i == -1)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="None" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Reset(name)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="None"/>
|
||||
}
|
||||
|
||||
@if (i == 0)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(name, ServerPermissionLevel.Read)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read"/>
|
||||
}
|
||||
|
||||
@if (i == 1)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read & Write" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(name, ServerPermissionLevel.ReadWrite)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read & Write"/>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<PermissionEditor Server="Server" PermissionLevels="Permissions" />
|
||||
</HandleForm>
|
||||
|
||||
<div class="mt-8 flex space-x-2">
|
||||
@@ -65,6 +24,7 @@
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public ServerDetailResponse Server { get; set; }
|
||||
[Parameter] public string Username { get; set; }
|
||||
[Parameter] public Func<CreateShareRequest, Task> OnSubmit { get; set; }
|
||||
|
||||
@@ -96,24 +56,14 @@
|
||||
Permissions[name] = level;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task Reset(string name)
|
||||
{
|
||||
Permissions.Remove(name);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
||||
private async Task Submit()
|
||||
=> await HandleForm.Submit();
|
||||
|
||||
private async Task OnValidSubmit()
|
||||
{
|
||||
Request.Permissions = Permissions.Select(x => new GrantedServerPermission()
|
||||
{
|
||||
Identifier = x.Key,
|
||||
Level = x.Value
|
||||
}).ToList();
|
||||
|
||||
Request.Permissions = Permissions;
|
||||
|
||||
await OnSubmit.Invoke(Request);
|
||||
await Hide();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
@using MoonlightServers.Frontend.Interfaces
|
||||
@using MoonCore.Blazor.FlyonUi.Components
|
||||
@using MoonlightServers.Frontend.Models
|
||||
@using MoonlightServers.Shared.Enums
|
||||
@using MoonlightServers.Shared.Http.Responses.Client.Servers
|
||||
|
||||
@inject IEnumerable<IServerPermissionProvider> PermissionProviders
|
||||
|
||||
<LazyLoader Load="Load">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-y-3">
|
||||
@foreach (var permission in AvailablePermissions)
|
||||
{
|
||||
var level = PermissionLevels.GetValueOrDefault(permission.Identifier, ServerPermissionLevel.None);
|
||||
|
||||
<div class="col-span-1 flex flex-row items-center justify-start text-base-content">
|
||||
<i class="text-lg @permission.Icon me-4"></i>
|
||||
<div class="flex flex-col">
|
||||
<span>@permission.DisplayName</span>
|
||||
<span class="text-base-content/60 text-sm">@permission.Description</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-span-1 flex justify-start lg:justify-end mb-5 lg:mb-0">
|
||||
<div class="join drop-shadow">
|
||||
@if (level == ServerPermissionLevel.None)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@permission.Identifier"
|
||||
aria-label="None"
|
||||
checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(permission.Identifier, ServerPermissionLevel.None)"
|
||||
class="join-item btn btn-soft"
|
||||
type="radio" name="share-@permission.Identifier" aria-label="None"/>
|
||||
}
|
||||
|
||||
@if (level == ServerPermissionLevel.Read)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@permission.Identifier"
|
||||
aria-label="Read"
|
||||
checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(permission.Identifier, ServerPermissionLevel.Read)"
|
||||
class="join-item btn btn-soft"
|
||||
type="radio" name="share-@permission.Identifier" aria-label="Read"/>
|
||||
}
|
||||
|
||||
@if (level == ServerPermissionLevel.ReadWrite)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@permission.Identifier"
|
||||
aria-label="Read & Write"
|
||||
checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(permission.Identifier, ServerPermissionLevel.ReadWrite)"
|
||||
class="join-item btn btn-soft"
|
||||
type="radio" name="share-@permission.Identifier" aria-label="Read & Write"/>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</LazyLoader>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public ServerDetailResponse Server { get; set; }
|
||||
[Parameter] public Dictionary<string, ServerPermissionLevel> PermissionLevels { get; set; }
|
||||
|
||||
private ServerPermission[] AvailablePermissions;
|
||||
|
||||
private async Task Load(LazyLoader _)
|
||||
{
|
||||
var permissions = new List<ServerPermission>();
|
||||
|
||||
foreach (var provider in PermissionProviders)
|
||||
{
|
||||
permissions.AddRange(
|
||||
await provider.GetPermissions(Server)
|
||||
);
|
||||
}
|
||||
|
||||
AvailablePermissions = permissions.ToArray();
|
||||
}
|
||||
|
||||
private async Task Set(string name, ServerPermissionLevel level)
|
||||
{
|
||||
PermissionLevels[name] = level;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
@@ -75,6 +75,7 @@
|
||||
await ModalService.Launch<CreateShareModal>(parameters =>
|
||||
{
|
||||
parameters["Username"] = UsernameInput;
|
||||
parameters["Server"] = Server;
|
||||
parameters["OnSubmit"] = SubmitCreate;
|
||||
}, size: "max-w-2xl");
|
||||
}
|
||||
@@ -92,6 +93,7 @@
|
||||
await ModalService.Launch<UpdateShareModal>(parameters =>
|
||||
{
|
||||
parameters["Share"] = share;
|
||||
parameters["Server"] = Server;
|
||||
parameters["OnSubmit"] = (UpdateShareRequest request) => SubmitUpdate(share.Id, request);
|
||||
}, size: "max-w-2xl");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@using MoonCore.Blazor.FlyonUi.Components
|
||||
@using MoonCore.Blazor.FlyonUi.Toasts
|
||||
@using MoonCore.Models
|
||||
@using MoonlightServers.Frontend.Services
|
||||
@using MoonlightServers.Shared.Http.Responses.Client.Servers.Variables
|
||||
|
||||
@@ -8,7 +9,7 @@
|
||||
@inject ServerService ServerService
|
||||
@inject ToastService ToastService
|
||||
|
||||
<LazyLoader Load="Load">
|
||||
<LazyLoader @ref="LazyLoader" Load="Load">
|
||||
<div class="grid grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">
|
||||
@foreach (var variable in Variables)
|
||||
{
|
||||
@@ -37,10 +38,13 @@
|
||||
@code
|
||||
{
|
||||
private ServerVariableDetailResponse[] Variables;
|
||||
private LazyLoader LazyLoader;
|
||||
|
||||
private async Task Load(LazyLoader _)
|
||||
{
|
||||
Variables = await ServerService.GetVariables(Server.Id);
|
||||
Variables = await PagedData<ServerVariableDetailResponse>.All(async (page, pageSize)
|
||||
=> await ServerService.GetVariables(Server.Id, page, pageSize)
|
||||
);
|
||||
}
|
||||
|
||||
private async Task UpdateVariable(ServerVariableDetailResponse variable, ChangeEventArgs args)
|
||||
@@ -52,11 +56,10 @@
|
||||
Key = variable.Key,
|
||||
Value = value
|
||||
});
|
||||
|
||||
|
||||
// Fetch the current data to make sure the user sees the latest data
|
||||
Variables = await ServerService.GetVariables(Server.Id);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
|
||||
await LazyLoader.Reload();
|
||||
|
||||
await ToastService.Success("Successfully updated variable");
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
@using MoonCore.Blazor.FlyonUi.Components
|
||||
@using MoonlightServers.Shared.Enums
|
||||
@using MoonlightServers.Shared.Http.Requests.Client.Servers.Shares
|
||||
@using MoonlightServers.Shared.Http.Responses.Client.Servers
|
||||
@using MoonlightServers.Shared.Http.Responses.Client.Servers.Shares
|
||||
@using MoonlightServers.Shared.Models
|
||||
|
||||
@@ -11,48 +12,7 @@
|
||||
</div>
|
||||
|
||||
<HandleForm @ref="HandleForm" Model="Request" OnValidSubmit="OnValidSubmit">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-y-5 lg:gap-y-3">
|
||||
@foreach (var name in Names)
|
||||
{
|
||||
var i = Permissions.TryGetValue(name, out var permission) ? (int)permission : -1;
|
||||
|
||||
<div class="col-span-1 flex flex-col justify-center lg:justify-start text-center lg:text-start">
|
||||
<span>@name</span>
|
||||
<span class="text-base-content/80 text-sm">This is a long description</span>
|
||||
</div>
|
||||
|
||||
<div class="col-span-1 flex justify-end">
|
||||
<div class="join drop-shadow">
|
||||
@if (i == -1)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="None" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Reset(name)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="None"/>
|
||||
}
|
||||
|
||||
@if (i == 0)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(name, ServerPermissionLevel.Read)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read"/>
|
||||
}
|
||||
|
||||
@if (i == 1)
|
||||
{
|
||||
<input class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read & Write" checked="checked"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<input @onclick="() => Set(name, ServerPermissionLevel.ReadWrite)" class="join-item btn btn-soft" type="radio" name="share-@name" aria-label="Read & Write"/>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<PermissionEditor Server="Server" PermissionLevels="Permissions" />
|
||||
</HandleForm>
|
||||
|
||||
<div class="mt-8 flex space-x-2">
|
||||
@@ -62,6 +22,7 @@
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter] public ServerDetailResponse Server { get; set; }
|
||||
[Parameter] public ServerShareResponse Share { get; set; }
|
||||
[Parameter] public Func<UpdateShareRequest, Task> OnSubmit { get; set; }
|
||||
|
||||
@@ -83,8 +44,8 @@
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Request = new();
|
||||
|
||||
Permissions = Share.Permissions.ToDictionary(x => x.Identifier, x => x.Level);
|
||||
|
||||
Permissions = Share.Permissions;
|
||||
}
|
||||
|
||||
private async Task Set(string name, ServerPermissionLevel level)
|
||||
@@ -93,22 +54,12 @@
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task Reset(string name)
|
||||
{
|
||||
Permissions.Remove(name);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async Task Submit()
|
||||
=> await HandleForm.Submit();
|
||||
|
||||
private async Task OnValidSubmit()
|
||||
{
|
||||
Request.Permissions = Permissions.Select(x => new GrantedServerPermission()
|
||||
{
|
||||
Identifier = x.Key,
|
||||
Level = x.Value
|
||||
}).ToList();
|
||||
Request.Permissions = Permissions;
|
||||
|
||||
await OnSubmit.Invoke(Request);
|
||||
await Hide();
|
||||
|
||||
@@ -223,12 +223,12 @@
|
||||
if (string.IsNullOrEmpty(tab.PermissionId) || tab.PermissionLevel == ServerPermissionLevel.None)
|
||||
return false;
|
||||
|
||||
// If permission is required but not set, we dont have access to it
|
||||
// If permission is required but not set, we don't have access to it
|
||||
if (!Server.Share.Permissions.TryGetValue(tab.PermissionId, out var level))
|
||||
return true;
|
||||
|
||||
// True if the acquired level is higher or equal than the required permission level for the tba
|
||||
return level >= tab.PermissionLevel;
|
||||
// False if the acquired level is higher or equal than the required permission level for the tab so it won't get removed
|
||||
return level < tab.PermissionLevel;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user