diff --git a/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor b/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor new file mode 100644 index 00000000..aebe6e5c --- /dev/null +++ b/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor @@ -0,0 +1,8 @@ +@using AIStudio.Settings + +<MudSelect T="Provider" Value="@this.ProviderSettings" ValueChanged="@this.SelectionChanged" Validation="@this.ValidateProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> + @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) + { + <MudSelectItem Value="@provider"/> + } +</MudSelect> \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor.cs b/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor.cs new file mode 100644 index 00000000..96204d0c --- /dev/null +++ b/app/MindWork AI Studio/Components/Blocks/ProviderSelection.razor.cs @@ -0,0 +1,26 @@ +using AIStudio.Settings; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components.Blocks; + +public partial class ProviderSelection : ComponentBase +{ + [Parameter] + public Settings.Provider ProviderSettings { get; set; } + + [Parameter] + public EventCallback<Settings.Provider> ProviderSettingsChanged { get; set; } + + [Parameter] + public Func<Settings.Provider, string?> ValidateProvider { get; set; } = _ => null; + + [Inject] + protected SettingsManager SettingsManager { get; set; } = null!; + + private async Task SelectionChanged(Settings.Provider provider) + { + this.ProviderSettings = provider; + await this.ProviderSettingsChanged.InvokeAsync(provider); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor b/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor index 911b7ecc..5674dbf5 100644 --- a/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor +++ b/app/MindWork AI Studio/Components/Pages/Agenda/AssistantAgenda.razor @@ -1,5 +1,4 @@ @page "/assistant/agenda" -@using AIStudio.Settings @using AIStudio.Tools @inherits AssistantBaseCore @@ -50,12 +49,7 @@ } <EnumSelection T="CommonLanguages" NameFunc="@(language => language.NameSelecting())" @bind-Value="@this.selectedTargetLanguage" ValidateSelection="@this.ValidateTargetLanguage" Icon="@Icons.Material.Filled.Translate" Label="Target language" AllowOther="@true" OtherValue="CommonLanguages.OTHER" @bind-OtherInput="@this.customTargetLanguage" ValidateOther="@this.ValidateCustomLanguage" LabelOther="Custom target language" /> -<MudSelect T="Provider" @bind-Value="@this.providerSettings" Validation="@this.ValidatingProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> +<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/> <MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.CreateAgenda()"> Create agenda diff --git a/app/MindWork AI Studio/Components/Pages/Chat.razor b/app/MindWork AI Studio/Components/Pages/Chat.razor index a039e2c5..5a7f7fac 100644 --- a/app/MindWork AI Studio/Components/Pages/Chat.razor +++ b/app/MindWork AI Studio/Components/Pages/Chat.razor @@ -1,6 +1,5 @@ @page "/chat" @using AIStudio.Chat -@using AIStudio.Settings @using AIStudio.Settings.DataModel @inherits MSGComponentBase @@ -16,13 +15,7 @@ } </MudText> -<MudSelect T="Provider" @bind-Value="@this.providerSettings" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-2 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> - +<ProviderSelection @bind-ProviderSettings="@this.providerSettings"/> <InnerScrolling HeaderHeight="12.3em"> <ChildContent> @if (this.chatThread is not null) diff --git a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor index 9353d315..9d110343 100644 --- a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor +++ b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor @@ -1,5 +1,4 @@ @page "/assistant/coding" -@using AIStudio.Settings @inherits AssistantBaseCore <MudExpansionPanels Class="mb-3"> @@ -24,13 +23,7 @@ </MudStack> <MudTextField T="string" @bind-Text="@this.questions" Validation="@this.ValidateQuestions" AdornmentIcon="@Icons.Material.Filled.QuestionMark" Adornment="Adornment.Start" Label="Your question(s)" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/> - -<MudSelect T="Provider" @bind-Value="@this.providerSettings" Validation="@this.ValidatingProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> +<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/> <MudButton Variant="Variant.Filled" Color="Color.Info" OnClick="() => this.GetSupport()" Class="mb-3"> Get support diff --git a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor index 02a59938..97dc5bc2 100644 --- a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor +++ b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor @@ -1,5 +1,4 @@ @page "/assistant/icons" -@using AIStudio.Settings @inherits AssistantBaseCore <MudTextField T="string" @bind-Text="@this.inputContext" Validation="@this.ValidatingContext" AdornmentIcon="@Icons.Material.Filled.Description" Adornment="Adornment.Start" Label="Your context" Variant="Variant.Outlined" Lines="3" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/> @@ -16,13 +15,7 @@ <MudButton Href="@this.selectedIconSource.URL()" Target="_blank" Variant="Variant.Filled" Size="Size.Medium">Open website</MudButton> } </MudStack> - -<MudSelect T="Provider" @bind-Value="@this.providerSettings" Validation="@this.ValidatingProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> +<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/> <MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.FindIcon()"> Find icon diff --git a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor index 6ea597f4..98a7d4c0 100644 --- a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor +++ b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor @@ -1,5 +1,4 @@ @page "/assistant/summarizer" -@using AIStudio.Settings @using AIStudio.Tools @inherits AssistantBaseCore @@ -11,12 +10,7 @@ <MudTextField T="string" Disabled="@this.isAgentRunning" @bind-Text="@this.inputText" Validation="@this.ValidatingText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/> <EnumSelection T="CommonLanguages" NameFunc="@(language => language.Name())" @bind-Value="@this.selectedTargetLanguage" Icon="@Icons.Material.Filled.Translate" Label="Target language" AllowOther="@true" @bind-OtherInput="@this.customTargetLanguage" OtherValue="CommonLanguages.OTHER" LabelOther="Custom target language" ValidateOther="@this.ValidateCustomLanguage" /> <EnumSelection T="Complexity" NameFunc="@(complexity => complexity.Name())" @bind-Value="@this.selectedComplexity" Icon="@Icons.Material.Filled.Layers" Label="Target complexity" AllowOther="@true" @bind-OtherInput="@this.expertInField" OtherValue="Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS" LabelOther="Your expertise" ValidateOther="@this.ValidateExpertInField" /> -<MudSelect T="Provider" Disabled="@this.isAgentRunning" @bind-Value="@this.providerSettings" Validation="@this.ValidatingProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> +<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/> <MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.SummarizeText()" Disabled="@this.isAgentRunning"> Summarize diff --git a/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor b/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor index 0d30af06..7818c512 100644 --- a/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor +++ b/app/MindWork AI Studio/Components/Pages/Translation/AssistantTranslation.razor @@ -1,5 +1,4 @@ @page "/assistant/translation" -@using AIStudio.Settings @using AIStudio.Tools @inherits AssistantBaseCore @@ -19,12 +18,7 @@ else } <EnumSelection T="CommonLanguages" NameFunc="@(language => language.NameSelecting())" @bind-Value="@this.selectedTargetLanguage" ValidateSelection="@this.ValidatingTargetLanguage" Icon="@Icons.Material.Filled.Translate" Label="Target language" AllowOther="@true" OtherValue="CommonLanguages.OTHER" @bind-OtherInput="@this.customTargetLanguage" ValidateOther="@this.ValidateCustomLanguage" LabelOther="Custom target language" /> -<MudSelect T="Provider" @bind-Value="@this.providerSettings" Disabled="@this.isAgentRunning" Validation="@this.ValidatingProvider" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Apps" Margin="Margin.Dense" Label="Provider" Class="mb-3 rounded-lg" Variant="Variant.Outlined"> - @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) - { - <MudSelectItem Value="@provider"/> - } -</MudSelect> +<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/> <MudButton Disabled="@this.isAgentRunning" Variant="Variant.Filled" Class="mb-3" OnClick="() => this.TranslateText(force: true)"> Translate