@attribute [Route(Routes.ASSISTANT_DYNAMIC)] @using AIStudio.Settings @using AIStudio.Tools.PluginSystem.Assistants.DataModel @using AIStudio.Tools.PluginSystem.Assistants.DataModel.Layout @inherits AssistantBaseCore @if (this.RootComponent is null) { @this.T("No assistant plugin are currently installed.") } else { @foreach (var component in this.RootComponent.Children) { @this.RenderComponent(component) } } @code { private RenderFragment RenderSwitch(AssistantSwitch assistantSwitch) => @ @(this.assistantState.Bools[assistantSwitch.Name] ? assistantSwitch.LabelOn : assistantSwitch.LabelOff) ; } @code {private RenderFragment RenderChildren(IEnumerable children) => @ @foreach (var child in children) { @this.RenderComponent(child) } ; private RenderFragment RenderComponent(IAssistantComponent component) => @ @switch (component.Type) { case AssistantComponentType.TEXT_AREA: if (component is AssistantTextArea textArea) { var lines = textArea.IsSingleLine ? 1 : 6; } break; case AssistantComponentType.IMAGE: if (component is AssistantImage assistantImage) { var resolvedSource = this.ResolveImageSource(assistantImage); if (!string.IsNullOrWhiteSpace(resolvedSource)) { var image = assistantImage;
@if (!string.IsNullOrWhiteSpace(image.Caption)) { @image.Caption }
} } break; case AssistantComponentType.WEB_CONTENT_READER: if (component is AssistantWebContentReader webContent) { var webState = this.assistantState.WebContent[webContent.Name];
} break; case AssistantComponentType.FILE_CONTENT_READER: if (component is AssistantFileContentReader fileContent) { var fileState = this.assistantState.FileContent[fileContent.Name];
} break; case AssistantComponentType.DROPDOWN: if (component is AssistantDropdown assistantDropdown) { if (assistantDropdown.IsMultiselect) { } else { } } break; case AssistantComponentType.BUTTON: if (component is AssistantButton assistantButton) { var button = assistantButton; var icon = AssistantComponentPropHelper.GetIconSvg(button.StartIcon); var iconColor = AssistantComponentPropHelper.GetColor(button.IconColor, Color.Inherit); var color = AssistantComponentPropHelper.GetColor(button.Color, Color.Default); var size = AssistantComponentPropHelper.GetComponentSize(button.Size, Size.Medium); var iconSize = AssistantComponentPropHelper.GetComponentSize(button.IconSize, Size.Medium); var variant = button.GetButtonVariant(); var disabled = this.IsButtonActionRunning(button.Name); var buttonClass = MergeClass(button.Class, ""); var style = this.GetOptionalStyle(button.Style); if (!button.IsIconButton) { @button.Text } else { } } break; case AssistantComponentType.BUTTON_GROUP: if (component is AssistantButtonGroup assistantButtonGroup) { var buttonGroup = assistantButtonGroup; @this.RenderChildren(buttonGroup.Children) } break; case AssistantComponentType.LAYOUT_GRID: if (component is AssistantGrid assistantGrid) { var grid = assistantGrid; @this.RenderChildren(grid.Children) } break; case AssistantComponentType.LAYOUT_ITEM: if (component is AssistantItem assistantItem) { @this.RenderLayoutItem(assistantItem) } break; case AssistantComponentType.LAYOUT_PAPER: if (component is AssistantPaper assistantPaper) { var paper = assistantPaper; @this.RenderChildren(paper.Children) } break; case AssistantComponentType.LAYOUT_STACK: if (component is AssistantStack assistantStack) { var stack = assistantStack; @this.RenderChildren(stack.Children) } break; case AssistantComponentType.LAYOUT_ACCORDION: if (component is AssistantAccordion assistantAccordion) { var accordion = assistantAccordion; @this.RenderChildren(accordion.Children) } break; case AssistantComponentType.LAYOUT_ACCORDION_SECTION: if (component is AssistantAccordionSection assistantAccordionSection) { var accordionSection = assistantAccordionSection; var textColor = accordionSection.IsDisabled ? Color.Info : AssistantComponentPropHelper.GetColor(accordionSection.HeaderColor, Color.Inherit);
@accordionSection.HeaderText
@this.RenderChildren(accordionSection.Children)
} 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 switchComponent) { var assistantSwitch = switchComponent; if (string.IsNullOrEmpty(assistantSwitch.Label)) { @this.RenderSwitch(assistantSwitch) } else { @this.RenderSwitch(assistantSwitch) } } break; case AssistantComponentType.HEADING: if (component is AssistantHeading assistantHeading) { var heading = assistantHeading; @switch (assistantHeading.Level) { case 1: @heading.Text break; case 2: @heading.Text break; case 3: @heading.Text break; default: @heading.Text break; } } break; case AssistantComponentType.TEXT: if (component is AssistantText assistantText) { var text = assistantText; @text.Content } break; case AssistantComponentType.LIST: if (component is AssistantList assistantList) { var list = assistantList; @foreach (var item in list.Items) { var iconColor = AssistantComponentPropHelper.GetColor(item.IconColor, Color.Default); @if (item.Type == "LINK") { @item.Text } else { var icon = !string.IsNullOrEmpty(item.Icon) ? AssistantComponentPropHelper.GetIconSvg(item.Icon) : string.Empty; @item.Text } } } break; case AssistantComponentType.COLOR_PICKER: if (component is AssistantColorPicker assistantColorPicker) { var colorPicker = assistantColorPicker; var variant = colorPicker.GetPickerVariant(); var rounded = variant == PickerVariant.Static; } break; case AssistantComponentType.DATE_PICKER: if (component is AssistantDatePicker assistantDatePicker) { var datePicker = assistantDatePicker; var format = datePicker.GetDateFormat(); } break; case AssistantComponentType.DATE_RANGE_PICKER: if (component is AssistantDateRangePicker assistantDateRangePicker) { var dateRangePicker = assistantDateRangePicker; var format = dateRangePicker.GetDateFormat(); } break; case AssistantComponentType.TIME_PICKER: if (component is AssistantTimePicker assistantTimePicker) { var timePicker = assistantTimePicker; var format = timePicker.GetTimeFormat(); } break; }
; private string? BuildPaperStyle(AssistantPaper paper) { List styles = []; this.AddStyle(styles, "height", paper.Height); this.AddStyle(styles, "max-height", paper.MaxHeight); this.AddStyle(styles, "min-height", paper.MinHeight); this.AddStyle(styles, "width", paper.Width); this.AddStyle(styles, "max-width", paper.MaxWidth); this.AddStyle(styles, "min-width", paper.MinWidth); var customStyle = paper.Style; if (!string.IsNullOrWhiteSpace(customStyle)) styles.Add(customStyle.Trim().TrimEnd(';')); return styles.Count == 0 ? null : string.Join("; ", styles); } private RenderFragment RenderLayoutItem(AssistantItem item) => builder => { builder.OpenComponent(0); if (item.Xs.HasValue) builder.AddAttribute(1, "xs", item.Xs.Value); if (item.Sm.HasValue) builder.AddAttribute(2, "sm", item.Sm.Value); if (item.Md.HasValue) builder.AddAttribute(3, "md", item.Md.Value); if (item.Lg.HasValue) builder.AddAttribute(4, "lg", item.Lg.Value); if (item.Xl.HasValue) builder.AddAttribute(5, "xl", item.Xl.Value); if (item.Xxl.HasValue) builder.AddAttribute(6, "xxl", item.Xxl.Value); var itemClass = item.Class; if (!string.IsNullOrWhiteSpace(itemClass)) builder.AddAttribute(7, nameof(MudItem.Class), itemClass); var itemStyle = this.GetOptionalStyle(item.Style); if (!string.IsNullOrWhiteSpace(itemStyle)) builder.AddAttribute(8, nameof(MudItem.Style), itemStyle); builder.AddAttribute(9, nameof(MudItem.ChildContent), this.RenderChildren(item.Children)); builder.CloseComponent(); }; private void AddStyle(List styles, string key, string value) { if (!string.IsNullOrWhiteSpace(value)) styles.Add($"{key}: {value.Trim().TrimEnd(';')}"); } }