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

View File

@ -1,8 +1,6 @@
using AIStudio.Settings.DataModel;
using AIStudio.Dialogs.Settings;
using AIStudio.Settings.DataModel;
using Microsoft.AspNetCore.Components;
using DialogOptions = AIStudio.Dialogs.DialogOptions;
namespace AIStudio.Components;
@ -24,6 +22,12 @@ public partial class AssistantBlock<TSettings> : MSGComponentBase where TSetting
[Parameter]
public string Link { get; set; } = string.Empty;
[Parameter]
public bool Disabled { get; set; }
[Parameter]
public RenderFragment? SecurityBadge { get; set; }
[Parameter]
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.Settings.DataModel
@using AIStudio.Tools.PluginSystem
@using AIStudio.Tools.PluginSystem.Assistants
@using ReverseMarkdown.Converters
@attribute [Route(Routes.ASSISTANTS)]
@inherits MSGComponentBase
<div class="inner-scrolling-context">
@ -41,11 +39,17 @@
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
@foreach (var assistantPlugin in this.AssistantPlugins)
{
var securityState = PluginAssistantSecurityResolver.Resolve(this.SettingsManager, assistantPlugin);
<AssistantBlock TSettings="SettingsDialogDynamic"
Name="@T(assistantPlugin.AssistantTitle)"
Description="@T(assistantPlugin.Description)"
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>
}

View File

@ -1,15 +1,28 @@
using AIStudio.Components;
using AIStudio.Tools.PluginSystem;
using AIStudio.Tools.PluginSystem.Assistants;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Components;
namespace AIStudio.Pages;
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 =>
PluginFactory.RunningPlugins.OfType<PluginAssistants>()
.Where(plugin => this.SettingsManager.IsPluginEnabled(plugin))
.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;
}
}