From 786b106096e0f858082cbf6d7a9d7c11a7134062 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Thu, 13 Aug 2026 15:51:28 +0200 Subject: [PATCH] made datasource selection more user friendly --- .../Assistants/I18N/allTexts.lua | 18 ++++ .../Components/DataSourceSelection.razor | 55 +++++++++-- .../Components/DataSourceSelection.razor.cs | 5 +- .../Settings/SettingsDialogDataSources.razor | 94 ++++++++++++------- .../SettingsDialogDataSources.razor.cs | 23 +++++ .../Provider/ConfidenceLevelExtensions.cs | 3 + 6 files changed, 156 insertions(+), 42 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 40df7acf..334a6c68 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -6364,6 +6364,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T214675 -- Edit ERI v1 Data Source UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T221059217"] = "Edit ERI v1 Data Source" +-- Indexed files +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2235289713"] = "Indexed files" + -- Edit Local File Data Source UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2453292893"] = "Edit Local File Data Source" @@ -6373,6 +6376,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T262437 -- Name UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T266367750"] = "Name" +-- Not applicable +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2675917723"] = "Not applicable" + -- No valid embedding UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2698203405"] = "No valid embedding" @@ -6415,6 +6421,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T359566 -- Local data sources refresh when files change. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3687976654"] = "Local data sources refresh when files change." +-- Not available +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3706935413"] = "Not available" + -- Export ERI Data Source UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3831281036"] = "Export ERI Data Source" @@ -6424,6 +6433,12 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T386503 -- This ERI data source has an access token configured. Do you want to include the encrypted access token in the export? Note: The recipient will need the same encryption secret to use the access token. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4027572258"] = "This ERI data source has an access token configured. Do you want to include the encrypted access token in the export? Note: The recipient will need the same encryption secret to use the access token." +-- Waiting for indexing status +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4108252513"] = "Waiting for indexing status" + +-- Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4256323669"] = "Information" + -- Configured Data Sources UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T543942217"] = "Configured Data Sources" @@ -6439,6 +6454,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T774473 -- Cannot export this ERI data source because no authentication secret is configured. The issue was: {0} UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T782820095"] = "Cannot export this ERI data source because no authentication secret is configured. The issue was: {0}" +-- {0} of {1} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T825342513"] = "{0} of {1}" + -- Local data sources refresh only when triggered manually. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T854231603"] = "Local data sources refresh only when triggered manually." diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor b/app/MindWork AI Studio/Components/DataSourceSelection.razor index 74566d7e..08ae07ec 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelection.razor +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor @@ -1,4 +1,5 @@ @using AIStudio.Settings +@using AIStudio.Provider @inherits MSGComponentBase @if (this.SelectionMode is DataSourceSelectionMode.SELECTION_MODE) { @@ -92,7 +93,18 @@ @foreach (var source in this.availableDataSources) { - @source.Name + + + @source.Name + + @if (source is IInternalDataSource) + { + + + + + } + } @@ -106,7 +118,18 @@ @foreach (var source in this.availableDataSources) { - @source.Name + + + @source.Name + + @if (source is IInternalDataSource) + { + + + + + } + } @@ -117,9 +140,18 @@ { - - @source.DataSource.Name - + + + @source.DataSource.Name + + @if (source.DataSource is IInternalDataSource) + { + + + + + } + @@ -170,7 +202,18 @@ else if (this.SelectionMode is DataSourceSelectionMode.CONFIGURATION_MODE) @foreach (var source in this.availableDataSources) { - @source.Name + + + @source.Name + + @if (source is IInternalDataSource) + { + + + + + } + } diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs index 7f11972a..50e7164d 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs @@ -1,4 +1,5 @@ using AIStudio.Dialogs.Settings; +using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Settings.DataModel; using AIStudio.Tools.Services; @@ -141,6 +142,8 @@ public partial class DataSourceSelection : MSGComponentBase private IReadOnlyCollection GetSelectedDataSourcesWithAI() => this.DataSourcesAISelected.Where(n => n.Selected).ToList(); private string GetAIReasoning(DataSourceAgentSelected source) => $"AI reasoning (confidence {source.AIDecision.Confidence:P0}): {source.AIDecision.Reason}"; + + private string GetConfidenceIconStyle(IDataSource source) => $"{source.ComplianceLevel.SetColorStyle(this.SettingsManager)} flex-shrink: 0;"; public void ChangeOptionWithoutSaving(DataSourceOptions options, IReadOnlyList? aiSelectedDataSources = null) { @@ -308,4 +311,4 @@ public partial class DataSourceSelection : MSGComponentBase } #endregion -} \ No newline at end of file +} diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor index e6d58126..308e20c5 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor @@ -1,3 +1,4 @@ +@using AIStudio.Settings @using AIStudio.Settings.DataModel @inherits SettingsDialogBase @@ -16,35 +17,56 @@ - - @T("Refresh all") - + + + + @{ var embeddingStatuses = this.DataSourceEmbeddingService.GetStatuses().ToDictionary(status => status.DataSourceId, StringComparer.OrdinalIgnoreCase); } - - - + + + + # @T("Name") @T("Type") @T("Embedding") + @T("Indexed files") @T("Actions") + @{ var embeddingStatus = embeddingStatuses.GetValueOrDefault(context.Id); } @context.Num - @context.Name - @context.Type.GetDisplayName() - @this.GetEmbeddingName(context) + @context.Name + @context.Type.GetDisplayName() + @this.GetEmbeddingName(context) + + @if (context is IInternalDataSource) + { + + + + @(embeddingStatus is null ? T("Not available") : string.Format(T("{0} of {1}"), embeddingStatus.IndexedFiles, embeddingStatus.TotalFiles)) + + + } + else + { + @T("Not applicable") + } + - - + + + + @if (context.IsEnterpriseConfiguration) { @@ -53,21 +75,21 @@ } else { - - @T("Edit") - - - @T("Refresh") - + + + + + + @if (this.SettingsManager.ConfigurationData.App.ShowAdminSettings && context is DataSourceERI_V1) { - + } - - @T("Delete") - + + + } @@ -81,21 +103,23 @@ } - - - @T("External Data (ERI-Server v1)") - - - @T("Local Directory") - - - @T("Local File") - - - - @T("Close") - + + + + @T("External Data (ERI-Server v1)") + + + @T("Local Directory") + + + @T("Local File") + + + + @T("Close") + + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs index a6136595..25680fa9 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs @@ -12,6 +12,29 @@ public partial class SettingsDialogDataSources : SettingsDialogBase [Inject] private DataSourceEmbeddingService DataSourceEmbeddingService { get; init; } = null!; + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED, Event.RAG_EMBEDDING_STATUS_CHANGED ]); + } + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + { + await base.ProcessIncomingMessage(sendingComponent, triggeredEvent, data); + if (triggeredEvent is Event.RAG_EMBEDDING_STATUS_CHANGED) + this.StateHasChanged(); + } + + private static Color GetIndexingStatusColor(DataSourceEmbeddingStatus? status) + { + if (status is null || status.State is DataSourceEmbeddingState.IDLE or DataSourceEmbeddingState.QUEUED or DataSourceEmbeddingState.RUNNING) + return Color.Warning; + + return status.State is DataSourceEmbeddingState.FAILED || status.FailedFiles > 0 + ? Color.Error + : Color.Success; + } + private string GetEmbeddingName(IDataSource dataSource) { if(dataSource is IInternalDataSource internalDataSource) diff --git a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs index 426bdffb..ccfdcd1f 100644 --- a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs +++ b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs @@ -25,6 +25,9 @@ public static class ConfidenceLevelExtensions public static string GetColor(this ConfidenceLevel level, SettingsManager settingsManager) => (level, settingsManager.IsDarkMode) switch { (ConfidenceLevel.NONE, _) => "#cccccc", + + (ConfidenceLevel.UNKNOWN, false) => "#777777", + (ConfidenceLevel.UNKNOWN, true) => "#aaaaaa", (ConfidenceLevel.UNTRUSTED, false) => "#ff0000", (ConfidenceLevel.UNTRUSTED, true) => "#800000",