integrating the security rules and badge to the assistant page and block

This commit is contained in:
nilsk 2026-03-31 15:36:22 +02:00
parent b579129535
commit 09d13e66c2
4 changed files with 45 additions and 16 deletions

View File

@ -22,8 +22,9 @@
</MudStack> </MudStack>
</MudCardContent> </MudCardContent>
<MudCardActions> <MudCardActions>
<MudStack Row="@true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween" Style="width: 100%;">
<MudButtonGroup Variant="Variant.Outlined"> <MudButtonGroup Variant="Variant.Outlined">
<MudButton Size="Size.Large" Variant="Variant.Filled" StartIcon="@this.Icon" Color="Color.Default" Href="@this.Link"> <MudButton Size="Size.Large" Variant="Variant.Filled" StartIcon="@this.Icon" Color="Color.Default" Href="@this.Link" Disabled="@this.Disabled">
@this.ButtonText @this.ButtonText
</MudButton> </MudButton>
@if (this.HasSettingsPanel) @if (this.HasSettingsPanel)
@ -31,6 +32,13 @@
<MudIconButton Variant="Variant.Text" Icon="@Icons.Material.Filled.Settings" Color="Color.Default" OnClick="@this.OpenSettingsDialog"/> <MudIconButton Variant="Variant.Text" Icon="@Icons.Material.Filled.Settings" Color="Color.Default" OnClick="@this.OpenSettingsDialog"/>
} }
</MudButtonGroup> </MudButtonGroup>
@if (this.SecurityBadge is not null)
{
<MudElement>
@this.SecurityBadge
</MudElement>
}
</MudStack>
</MudCardActions> </MudCardActions>
</MudCard> </MudCard>
} }

View File

@ -1,8 +1,6 @@
using AIStudio.Settings.DataModel;
using AIStudio.Dialogs.Settings; using AIStudio.Dialogs.Settings;
using AIStudio.Settings.DataModel;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using DialogOptions = AIStudio.Dialogs.DialogOptions; using DialogOptions = AIStudio.Dialogs.DialogOptions;
namespace AIStudio.Components; namespace AIStudio.Components;
@ -24,6 +22,12 @@ public partial class AssistantBlock<TSettings> : MSGComponentBase where TSetting
[Parameter] [Parameter]
public string Link { get; set; } = string.Empty; public string Link { get; set; } = string.Empty;
[Parameter]
public bool Disabled { get; set; }
[Parameter]
public RenderFragment? SecurityBadge { get; set; }
[Parameter] [Parameter]
public Tools.Components Component { get; set; } = Tools.Components.NONE; public Tools.Components Component { get; set; } = Tools.Components.NONE;

View File

@ -1,9 +1,7 @@
@attribute [Route(Routes.ASSISTANTS)]
@using AIStudio.Dialogs.Settings @using AIStudio.Dialogs.Settings
@using AIStudio.Settings.DataModel @using AIStudio.Settings.DataModel
@using AIStudio.Tools.PluginSystem
@using AIStudio.Tools.PluginSystem.Assistants @using AIStudio.Tools.PluginSystem.Assistants
@using ReverseMarkdown.Converters
@attribute [Route(Routes.ASSISTANTS)]
@inherits MSGComponentBase @inherits MSGComponentBase
<div class="inner-scrolling-context"> <div class="inner-scrolling-context">
@ -41,11 +39,17 @@
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3"> <MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
@foreach (var assistantPlugin in this.AssistantPlugins) @foreach (var assistantPlugin in this.AssistantPlugins)
{ {
var securityState = PluginAssistantSecurityResolver.Resolve(this.SettingsManager, assistantPlugin);
<AssistantBlock TSettings="SettingsDialogDynamic" <AssistantBlock TSettings="SettingsDialogDynamic"
Name="@T(assistantPlugin.AssistantTitle)" Name="@T(assistantPlugin.AssistantTitle)"
Description="@T(assistantPlugin.Description)" Description="@T(assistantPlugin.Description)"
Icon="@Icons.Material.Filled.FindInPage" Icon="@Icons.Material.Filled.FindInPage"
Link="@($"{Routes.ASSISTANT_DYNAMIC}?assistantId={assistantPlugin.Id}")"/> Disabled="@(!securityState.CanStartAssistant)"
Link="@($"{Routes.ASSISTANT_DYNAMIC}?assistantId={assistantPlugin.Id}")">
<SecurityBadge>
<AssistantPluginSecurityCard Plugin="@assistantPlugin" Compact="@true" />
</SecurityBadge>
</AssistantBlock>
} }
</MudStack> </MudStack>
} }

View File

@ -1,15 +1,28 @@
using AIStudio.Components; using AIStudio.Components;
using AIStudio.Tools.PluginSystem; using AIStudio.Tools.PluginSystem;
using AIStudio.Tools.PluginSystem.Assistants; using AIStudio.Tools.PluginSystem.Assistants;
using System.Collections.Generic; using Microsoft.AspNetCore.Components;
using System.Linq;
namespace AIStudio.Pages; namespace AIStudio.Pages;
public partial class Assistants : MSGComponentBase public partial class Assistants : MSGComponentBase
{ {
protected override async Task OnInitializedAsync()
{
this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED, Event.PLUGINS_RELOADED ]);
await base.OnInitializedAsync();
}
private IReadOnlyCollection<PluginAssistants> AssistantPlugins => private IReadOnlyCollection<PluginAssistants> AssistantPlugins =>
PluginFactory.RunningPlugins.OfType<PluginAssistants>() PluginFactory.RunningPlugins.OfType<PluginAssistants>()
.Where(plugin => this.SettingsManager.IsPluginEnabled(plugin)) .Where(plugin => this.SettingsManager.IsPluginEnabled(plugin))
.ToList(); .ToList();
protected override Task ProcessIncomingMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
{
if (triggeredEvent is Event.CONFIGURATION_CHANGED or Event.PLUGINS_RELOADED)
return this.InvokeAsync(this.StateHasChanged);
return Task.CompletedTask;
}
} }