diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor
index 158a72a0..325a6f39 100644
--- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor
+++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor
@@ -12,7 +12,7 @@
if (component is AssistantTextArea textArea)
{
var lines = textArea.IsSingleLine ? 1 : 6;
-
+
}
break;
case AssistantComponentType.IMAGE:
@@ -23,7 +23,7 @@
{
var image = assistantImage;
-
+
@if (!string.IsNullOrWhiteSpace(image.Caption))
{
@image.Caption
@@ -39,13 +39,17 @@
ProviderSettings="@this.providerSettings"
@bind-AgentIsRunning="@webState.AgentIsRunning"
@bind-Preselect="@webState.Preselect"
- @bind-PreselectContentCleanerAgent="@webState.PreselectContentCleanerAgent" />
+ @bind-PreselectContentCleanerAgent="@webState.PreselectContentCleanerAgent"
+ Class="@webContent.Class"
+ Style="@webContent.Style" />
}
break;
case AssistantComponentType.FILE_CONTENT_READER:
if (component is AssistantFileContentReader fileContent && this.fileContentFields.TryGetValue(fileContent.Name, out var fileState))
{
-
+
}
break;
@@ -56,26 +60,34 @@
@bind-Value="@this.dropdownFields[assistantDropdown.Name]"
Default="@assistantDropdown.Default"
Label="@assistantDropdown.Label"
- Icon="@Icons.Material.Filled.Translate"/>
+ Icon="@Icons.Material.Filled.Translate"
+ Class="@assistantDropdown.Class"
+ Style="@assistantDropdown.Style"/>
}
break;
case AssistantComponentType.PROVIDER_SELECTION:
if (component is AssistantProviderSelection providerSelection)
{
-
+
}
break;
case AssistantComponentType.PROFILE_SELECTION:
if (component is AssistantProfileSelection profileSelection)
{
var selection = profileSelection;
-
+
}
break;
case AssistantComponentType.SWITCH:
if (component is AssistantSwitch assistantSwitch)
{
-
+
}
break;
case AssistantComponentType.HEADING:
@@ -85,16 +97,16 @@
@switch (assistantHeading.Level)
{
case 1:
-
@heading.Text
+
@heading.Text
break;
case 2:
-
@heading.Text
+
@heading.Text
break;
case 3:
-
@heading.Text
+
@heading.Text
break;
default:
-
@heading.Text
+
@heading.Text
break;
}
}
@@ -103,14 +115,14 @@
if (component is AssistantText assistantText)
{
var text = assistantText;
-
@text.Content
+
@text.Content
}
break;
case AssistantComponentType.LIST:
if (component is AssistantList assistantList)
{
var list = assistantList;
-
+
@foreach (var item in list.Items)
{
@if (item.Type == "LINK")
diff --git a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs
index c1d93359..7fbb79cb 100644
--- a/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs
+++ b/app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs
@@ -307,6 +307,21 @@ public partial class AssistantDynamic : AssistantBaseCore
return prompt;
}
+
+ private static string MergeClass(string customClass, string fallback)
+ {
+ var trimmedCustom = customClass?.Trim() ?? string.Empty;
+ var trimmedFallback = fallback?.Trim() ?? string.Empty;
+ if (string.IsNullOrEmpty(trimmedCustom))
+ return trimmedFallback;
+
+ if (string.IsNullOrEmpty(trimmedFallback))
+ return trimmedCustom;
+
+ return $"{trimmedCustom} {trimmedFallback}";
+ }
+
+ private string? GetOptionalStyle(string? style) => string.IsNullOrWhiteSpace(style) ? null : style;
private string? ValidateProfileSelection(AssistantProfileSelection profileSelection, Profile profile)
{
diff --git a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor
index 647bc2ca..0c209c11 100644
--- a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor
+++ b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor
@@ -1,4 +1,4 @@
-
+
}
-
\ No newline at end of file
+
diff --git a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs
index 5ecc5a1a..cde6cdfd 100644
--- a/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs
+++ b/app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs
@@ -9,27 +9,24 @@ namespace AIStudio.Components
{
public partial class DynamicAssistantDropdown : ComponentBase
{
- [Parameter]
- public List Items { get; set; } = new();
-
- [Parameter]
- public AssistantDropdownItem Default { get; set; } = new();
+ [Parameter] public List Items { get; set; } = new();
- [Parameter]
- public string Value { get; set; } = string.Empty;
+ [Parameter] public AssistantDropdownItem Default { get; set; } = new();
- [Parameter]
- public EventCallback ValueChanged { get; set; }
+ [Parameter] public string Value { get; set; } = string.Empty;
- [Parameter]
- public string Label { get; set; } = string.Empty;
+ [Parameter] public EventCallback ValueChanged { get; set; }
- [Parameter]
- public Func ValidateSelection { get; set; } = _ => null;
+ [Parameter] public string Label { get; set; } = string.Empty;
+
+ [Parameter] public Func ValidateSelection { get; set; } = _ => null;
+
+ [Parameter] public string Icon { get; set; } = Icons.Material.Filled.ArrowDropDown;
+
+ [Parameter] public string Class { get; set; } = string.Empty;
+
+ [Parameter] public string Style { get; set; } = string.Empty;
- [Parameter]
- public string Icon { get; set; } = Icons.Material.Filled.ArrowDropDown;
-
private async Task OnValueChanged(string newValue)
{
if (this.Value != newValue)
@@ -38,5 +35,18 @@ namespace AIStudio.Components
await this.ValueChanged.InvokeAsync(newValue);
}
}
+
+ internal string MergeClasses(string custom, string fallback)
+ {
+ var trimmedCustom = custom?.Trim() ?? string.Empty;
+ var trimmedFallback = fallback?.Trim() ?? string.Empty;
+ if (string.IsNullOrEmpty(trimmedCustom))
+ return trimmedFallback;
+
+ if (string.IsNullOrEmpty(trimmedFallback))
+ return trimmedCustom;
+
+ return $"{trimmedCustom} {trimmedFallback}";
+ }
}
}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantButton.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantButton.cs
index 00d134fc..65dc0301 100644
--- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantButton.cs
+++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantButton.cs
@@ -1,6 +1,6 @@
namespace AIStudio.Tools.PluginSystem.Assistants.DataModel;
-public class AssistantButton : AssistantComponentBase
+internal sealed class AssistantButton : AssistantComponentBase
{
public override AssistantComponentType Type => AssistantComponentType.BUTTON;
public Dictionary Props { get; set; } = new();
@@ -8,23 +8,30 @@ public class AssistantButton : AssistantComponentBase
public string Name
{
- get => this.Props.TryGetValue(nameof(this.Name), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.Name)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Name));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Name), value);
}
public string Text
{
- get => this.Props.TryGetValue(nameof(this.Text), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.Text)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Text));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Text), value);
}
+
public string Action
{
- get => this.Props.TryGetValue(nameof(this.Action), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.Action)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Action));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Action), value);
}
-}
\ No newline at end of file
+
+ public string Class
+ {
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Class));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Class), value);
+ }
+
+ public string Style
+ {
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Style));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Style), value);
+ }
+}
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantComponentPropHelper.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantComponentPropHelper.cs
new file mode 100644
index 00000000..dff3dd18
--- /dev/null
+++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantComponentPropHelper.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+
+namespace AIStudio.Tools.PluginSystem.Assistants.DataModel;
+
+internal static class AssistantComponentPropHelper
+{
+ public static string ReadString(Dictionary props, string key)
+ {
+ if (props.TryGetValue(key, out var value))
+ {
+ return value?.ToString() ?? string.Empty;
+ }
+
+ return string.Empty;
+ }
+
+ public static void WriteString(Dictionary props, string key, string value)
+ {
+ props[key] = value ?? string.Empty;
+ }
+}
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantDropdown.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantDropdown.cs
index ef3483f2..0357efa8 100644
--- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantDropdown.cs
+++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/DataModel/AssistantDropdown.cs
@@ -1,34 +1,31 @@
-namespace AIStudio.Tools.PluginSystem.Assistants.DataModel;
+using System.Collections.Generic;
-public class AssistantDropdown : AssistantComponentBase
+namespace AIStudio.Tools.PluginSystem.Assistants.DataModel;
+
+internal sealed class AssistantDropdown : AssistantComponentBase
{
public override AssistantComponentType Type => AssistantComponentType.DROPDOWN;
public Dictionary Props { get; set; } = new();
public List Children { get; set; } = new();
-
+
public string Name
{
- get => this.Props.TryGetValue(nameof(this.Name), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.Name)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Name));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Name), value);
}
+
public string Label
{
- get => this.Props.TryGetValue(nameof(this.Label), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.Label)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.Label));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.Label), value);
}
-
+
public string UserPrompt
{
- get => this.Props.TryGetValue(nameof(this.UserPrompt), out var v)
- ? v.ToString() ?? string.Empty
- : string.Empty;
- set => this.Props[nameof(this.UserPrompt)] = value;
+ get => AssistantComponentPropHelper.ReadString(this.Props, nameof(this.UserPrompt));
+ set => AssistantComponentPropHelper.WriteString(this.Props, nameof(this.UserPrompt), value);
}
-
+
public AssistantDropdownItem Default
{
get
@@ -40,15 +37,15 @@ public class AssistantDropdown : AssistantComponentBase
}
set => this.Props[nameof(this.Default)] = value;
}
-
+
public List Items
{
- get => this.Props.TryGetValue(nameof(this.Items), out var v) && v is List list
- ? list
+ get => this.Props.TryGetValue(nameof(this.Items), out var v) && v is List list
+ ? list
: [];
set => this.Props[nameof(this.Items)] = value;
}
-
+
public string ValueType
{
get => this.Props.TryGetValue(nameof(this.ValueType), out var v)
@@ -56,7 +53,7 @@ public class AssistantDropdown : AssistantComponentBase
: "string";
set => this.Props[nameof(this.ValueType)] = value;
}
-
+
public IEnumerable