made buttons out of checkboxes and added an exclude option

This commit is contained in:
PaulKoudelka 2026-07-22 16:50:35 +02:00
parent 31fff1961c
commit 3a3e8780e8
5 changed files with 209 additions and 85 deletions

View File

@ -1615,6 +1615,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T114706247
-- Select a log file -- Select a log file
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Select a log file" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Select a log file"
-- Show only matching lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T131451442"] = "Show only matching lines"
-- Log level -- Log level
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Log level" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Log level"
@ -1645,6 +1648,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T228853842
-- Showing {0} of {1} lines. Last refresh: {2}. -- Showing {0} of {1} lines. Last refresh: {2}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Showing {0} of {1} lines. Last refresh: {2}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Showing {0} of {1} lines. Last refresh: {2}."
-- Disable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T240826492"] = "Disable auto-refresh"
-- Enable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2467283075"] = "Enable auto-refresh"
-- No matching log lines. -- No matching log lines.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "No matching log lines." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "No matching log lines."
@ -1657,8 +1666,8 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T268681396
-- Loaded {0} lines. Last refresh: {1}. -- Loaded {0} lines. Last refresh: {1}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "Loaded {0} lines. Last refresh: {1}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "Loaded {0} lines. Last refresh: {1}."
-- Filter only -- Disable inverted dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3152625639"] = "Filter only" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3035207754"] = "Disable inverted dropdown filters"
-- Copy visible lines -- Copy visible lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Copy visible lines" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Copy visible lines"
@ -1669,21 +1678,24 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T333036481
-- Unknown error -- Unknown error
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unknown error" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unknown error"
-- Exclude
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3551498825"] = "Exclude"
-- The log file path is not available yet. -- The log file path is not available yet.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "The log file path is not available yet." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "The log file path is not available yet."
-- Logger -- Logger
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger"
-- Auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3837203600"] = "Auto-refresh"
-- not loaded yet -- not loaded yet
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "not loaded yet" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "not loaded yet"
-- Loading... -- Loading...
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Loading..." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Loading..."
-- Select a dropdown filter to invert
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3991737584"] = "Select a dropdown filter to invert"
-- Usage log -- Usage log
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Usage log" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Usage log"
@ -1696,14 +1708,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T413024177
-- Opened the log file location. -- Opened the log file location.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Opened the log file location." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Opened the log file location."
-- Hide timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4263992002"] = "Hide timestamps"
-- Show timestamps -- Show timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Show timestamps" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Show timestamps"
-- Invert filters -- Highlight matches without hiding lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T721900298"] = "Invert filters" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T661180902"] = "Highlight matches without hiding lines"
-- Clear -- Invert dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T77955010"] = "Clear" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T8477641"] = "Invert dropdown filters"
-- You can enter text, attach one or more documents, or use both. At least one input is required. -- You can enter text, attach one or more documents, or use both. At least one input is required.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "You can enter text, attach one or more documents, or use both. At least one input is required." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "You can enter text, attach one or more documents, or use both. At least one input is required."

View File

@ -13,17 +13,22 @@
<MudSelectItem T="LogFileKind" Value="@LogFileKind.APP">@T("Usage log")</MudSelectItem> <MudSelectItem T="LogFileKind" Value="@LogFileKind.APP">@T("Usage log")</MudSelectItem>
<MudSelectItem T="LogFileKind" Value="@LogFileKind.STARTUP">@T("Startup log")</MudSelectItem> <MudSelectItem T="LogFileKind" Value="@LogFileKind.STARTUP">@T("Startup log")</MudSelectItem>
</MudSelect> </MudSelect>
<MudCheckBox T="bool" Value="@this.autoRefresh" ValueChanged="@this.AutoRefreshChanged" Label="@T("Auto-refresh")" Color="Color.Primary" /> <MudTooltip Text="@this.AutoRefreshTooltip" Placement="Placement.Bottom">
<MudIconButton Icon="@Icons.Material.Filled.Update" Variant="@this.AutoRefreshButtonVariant" Color="@this.AutoRefreshButtonColor" OnClick="@this.ToggleAutoRefresh" />
</MudTooltip>
@if (!this.autoRefresh) @if (!this.autoRefresh)
{ {
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Refresh" OnClick="@this.RefreshLogAsync" Disabled="@this.isLoading"> <MudTooltip Text="@T("Refresh")" Placement="Placement.Bottom">
@T("Refresh") <MudIconButton Icon="@Icons.Material.Filled.Refresh" Variant="Variant.Filled" Color="Color.Primary" OnClick="@this.RefreshLogAsync" Disabled="@this.isLoading" />
</MudButton> </MudTooltip>
} }
<MudNumericField T="int" Value="@this.maxLines" ValueChanged="@this.MaxLinesChanged" Label="@T("Max lines")" Variant="Variant.Outlined" Margin="Margin.Dense" Min="@MIN_MAX_LINES" Max="@MAX_MAX_LINES" Step="500" Class="log-viewer-number" /> <MudNumericField T="int" Value="@this.maxLines" ValueChanged="@this.MaxLinesChanged" Label="@T("Max lines")" Variant="Variant.Outlined" Margin="Margin.Dense" Min="@MIN_MAX_LINES" Max="@MAX_MAX_LINES" Step="500" Class="log-viewer-number" />
<MudButton Variant="Variant.Outlined" Color="Color.Default" StartIcon="@Icons.Material.Filled.FolderOpen" OnClick="@this.OpenCurrentLogInFileManager" Disabled="@(!this.CanOpenCurrentLogPath)"> <MudTooltip Text="@T("Open in folder")" Placement="Placement.Bottom">
@T("Open in folder") <MudIconButton Icon="@Icons.Material.Filled.FolderOpen" Variant="Variant.Outlined" Color="Color.Default" OnClick="@this.OpenCurrentLogInFileManager" Disabled="@(!this.CanOpenCurrentLogPath)" />
</MudButton> </MudTooltip>
<MudTooltip Text="@T("Copy visible lines")" Placement="Placement.Bottom">
<MudIconButton Icon="@Icons.Material.Filled.ContentCopy" Variant="Variant.Outlined" Color="Color.Default" Disabled="@(!this.CanCopyDisplayedLines)" OnClick="@this.CopyDisplayedLines" />
</MudTooltip>
</MudStack> </MudStack>
<MudStack Row="@true" Wrap="@Wrap.Wrap" AlignItems="@AlignItems.Center" Spacing="2" Class="mb-1"> <MudStack Row="@true" Wrap="@Wrap.Wrap" AlignItems="@AlignItems.Center" Spacing="2" Class="mb-1">
@ -51,19 +56,20 @@
</MudSelectItem> </MudSelectItem>
} }
</MudSelect> </MudSelect>
<MudCheckBox T="bool" @bind-Value="@this.ShowTimestamps" Label="@T("Show timestamps")" Color="Color.Primary" /> <MudTooltip Text="@this.ShowTimestampsTooltip" Placement="Placement.Bottom">
<MudIconButton Icon="@Icons.Material.Filled.Schedule" Variant="@this.ShowTimestampsButtonVariant" Color="@this.ShowTimestampsButtonColor" OnClick="@this.ToggleShowTimestamps" />
</MudTooltip>
<MudTooltip Text="@this.InvertFiltersTooltip" Placement="Placement.Bottom">
<MudIconButton Icon="@Icons.Material.Filled.SearchOff" Variant="@this.InvertFiltersButtonVariant" Color="@this.InvertFiltersButtonColor" OnClick="@this.ToggleInvertFilters" />
</MudTooltip>
</MudStack> </MudStack>
<MudStack Row="@true" Wrap="@Wrap.Wrap" AlignItems="@AlignItems.Center" Spacing="2" Class="mb-1"> <MudStack Row="@true" Wrap="@Wrap.Wrap" AlignItems="@AlignItems.Center" Spacing="2" Class="mb-1">
<MudTextField T="string" @bind-Text="@this.FilterText" Immediate="@true" Label="@T("Find")" Variant="Variant.Outlined" Margin="Margin.Dense" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" Class="log-viewer-filter" /> <MudTextField T="string" @bind-Text="@this.FilterText" Immediate="@true" Label="@T("Find")" Variant="Variant.Outlined" Margin="Margin.Dense" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" Clearable="@true" ClearIcon="@Icons.Material.Filled.Clear" OnClearButtonClick="@(() => this.ClearFilterText())" Class="log-viewer-filter" />
<MudButton Variant="Variant.Text" Color="Color.Default" StartIcon="@Icons.Material.Filled.Clear" Disabled="@(!this.HasActiveFilter)" OnClick="@this.ClearFilters"> <MudTooltip Text="@this.FilterOnlyTooltip" Placement="Placement.Bottom">
@T("Clear") <MudIconButton Icon="@Icons.Material.Filled.Visibility" Variant="@this.FilterOnlyButtonVariant" Color="@this.FilterOnlyButtonColor" OnClick="@this.ToggleFilterOnly" />
</MudButton> </MudTooltip>
<MudButton Variant="Variant.Text" Color="Color.Default" StartIcon="@Icons.Material.Filled.ContentCopy" Disabled="@(!this.CanCopyDisplayedLines)" OnClick="@this.CopyDisplayedLines"> <MudTextField T="string" @bind-Text="@this.ExcludeText" Immediate="@true" Label="@T("Exclude")" Variant="Variant.Outlined" Margin="Margin.Dense" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Block" Clearable="@true" ClearIcon="@Icons.Material.Filled.Clear" OnClearButtonClick="@(() => this.ClearExcludeText())" Class="log-viewer-filter" />
@T("Copy visible lines")
</MudButton>
<MudCheckBox T="bool" @bind-Value="@this.FilterOnly" Label="@T("Filter only")" Color="Color.Primary" />
<MudCheckBox T="bool" @bind-Value="@this.InvertFilters" Label="@T("Invert filters")" Color="Color.Primary" />
</MudStack> </MudStack>
<MudText Typo="Typo.body2" Class="log-viewer-path mb-1"> <MudText Typo="Typo.body2" Class="log-viewer-path mb-1">

View File

@ -56,8 +56,10 @@ public partial class AssistantLogViewer : MSGComponentBase
private List<string> sourceDetailOptions = [OTHER_OPTION_VALUE]; private List<string> sourceDetailOptions = [OTHER_OPTION_VALUE];
private string[] activeSearchTerms = []; private string[] activeSearchTerms = [];
private string[] activeExcludeTerms = [];
private CancellationTokenSource? autoRefreshCancellationTokenSource; private CancellationTokenSource? autoRefreshCancellationTokenSource;
private string filterText = string.Empty; private string filterText = string.Empty;
private string excludeText = string.Empty;
private string loadError = string.Empty; private string loadError = string.Empty;
private bool isLoading; private bool isLoading;
private bool autoRefresh; private bool autoRefresh;
@ -75,12 +77,41 @@ public partial class AssistantLogViewer : MSGComponentBase
private bool HasDropdownFilter => this.selectedLogLevels.Count > 0 || this.selectedLoggers.Count > 0 || this.selectedSourceDetails.Count > 0; private bool HasDropdownFilter => this.selectedLogLevels.Count > 0 || this.selectedLoggers.Count > 0 || this.selectedSourceDetails.Count > 0;
private bool HasActiveFilter => !string.IsNullOrWhiteSpace(this.filterText) || this.HasDropdownFilter || this.invertFilters;
private bool HasActiveVisibilityFilter => this.HasDropdownFilter || (this.filterOnly && this.activeSearchTerms.Length > 0);
private bool CanCopyDisplayedLines => this.displayLines.Count > 0; private bool CanCopyDisplayedLines => this.displayLines.Count > 0;
private string AutoRefreshTooltip => this.autoRefresh ? T("Disable auto-refresh") : T("Enable auto-refresh");
private Variant AutoRefreshButtonVariant => GetToggleVariant(this.autoRefresh);
private Color AutoRefreshButtonColor => GetToggleColor(this.autoRefresh);
private string FilterOnlyTooltip => this.filterOnly ? T("Highlight matches without hiding lines") : T("Show only matching lines");
private Variant FilterOnlyButtonVariant => GetToggleVariant(this.filterOnly);
private Color FilterOnlyButtonColor => GetToggleColor(this.filterOnly);
private string ShowTimestampsTooltip => this.showTimestamps ? T("Hide timestamps") : T("Show timestamps");
private Variant ShowTimestampsButtonVariant => GetToggleVariant(this.showTimestamps);
private Color ShowTimestampsButtonColor => GetToggleColor(this.showTimestamps);
private string InvertFiltersTooltip
{
get
{
if (!this.HasDropdownFilter)
return T("Select a dropdown filter to invert");
return this.invertFilters ? T("Disable inverted dropdown filters") : T("Invert dropdown filters");
}
}
private Variant InvertFiltersButtonVariant => GetToggleVariant(this.invertFilters);
private Color InvertFiltersButtonColor => GetToggleColor(this.invertFilters);
private string FilterText private string FilterText
{ {
get => this.filterText; get => this.filterText;
@ -94,6 +125,19 @@ public partial class AssistantLogViewer : MSGComponentBase
} }
} }
private string ExcludeText
{
get => this.excludeText;
set
{
if (this.excludeText == value)
return;
this.excludeText = value;
this.RefreshDisplayLines();
}
}
private bool FilterOnly private bool FilterOnly
{ {
get => this.filterOnly; get => this.filterOnly;
@ -112,10 +156,11 @@ public partial class AssistantLogViewer : MSGComponentBase
get => this.invertFilters; get => this.invertFilters;
set set
{ {
if (this.invertFilters == value) var normalizedValue = value && this.HasDropdownFilter;
if (this.invertFilters == normalizedValue)
return; return;
this.invertFilters = value; this.invertFilters = normalizedValue;
this.RefreshDisplayLines(); this.RefreshDisplayLines();
} }
} }
@ -188,6 +233,7 @@ public partial class AssistantLogViewer : MSGComponentBase
private Task SelectedLogLevelsChanged(IEnumerable<string?>? selectedValues) private Task SelectedLogLevelsChanged(IEnumerable<string?>? selectedValues)
{ {
UpdateSelectedValues(this.selectedLogLevels, selectedValues); UpdateSelectedValues(this.selectedLogLevels, selectedValues);
this.DisableInvertFiltersIfNoDropdownFilter();
this.RefreshDisplayLines(); this.RefreshDisplayLines();
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -195,6 +241,7 @@ public partial class AssistantLogViewer : MSGComponentBase
private Task SelectedLoggersChanged(IEnumerable<string?>? selectedValues) private Task SelectedLoggersChanged(IEnumerable<string?>? selectedValues)
{ {
UpdateSelectedValues(this.selectedLoggers, selectedValues); UpdateSelectedValues(this.selectedLoggers, selectedValues);
this.DisableInvertFiltersIfNoDropdownFilter();
this.RefreshDisplayLines(); this.RefreshDisplayLines();
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -202,6 +249,7 @@ public partial class AssistantLogViewer : MSGComponentBase
private Task SelectedSourceDetailsChanged(IEnumerable<string?>? selectedValues) private Task SelectedSourceDetailsChanged(IEnumerable<string?>? selectedValues)
{ {
UpdateSelectedValues(this.selectedSourceDetails, selectedValues); UpdateSelectedValues(this.selectedSourceDetails, selectedValues);
this.DisableInvertFiltersIfNoDropdownFilter();
this.RefreshDisplayLines(); this.RefreshDisplayLines();
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -217,6 +265,26 @@ public partial class AssistantLogViewer : MSGComponentBase
await Task.CompletedTask; await Task.CompletedTask;
} }
private async Task ToggleAutoRefresh()
{
await this.AutoRefreshChanged(!this.autoRefresh);
}
private void ToggleFilterOnly()
{
this.FilterOnly = !this.filterOnly;
}
private void ToggleShowTimestamps()
{
this.ShowTimestamps = !this.showTimestamps;
}
private void ToggleInvertFilters()
{
this.InvertFilters = !this.invertFilters;
}
private async Task MaxLinesChanged(int value) private async Task MaxLinesChanged(int value)
{ {
var normalizedValue = Math.Clamp(value, MIN_MAX_LINES, MAX_MAX_LINES); var normalizedValue = Math.Clamp(value, MIN_MAX_LINES, MAX_MAX_LINES);
@ -280,13 +348,15 @@ public partial class AssistantLogViewer : MSGComponentBase
}); });
} }
private void ClearFilters() private void ClearFilterText()
{ {
this.filterText = string.Empty; this.filterText = string.Empty;
this.selectedLogLevels.Clear(); this.RefreshDisplayLines();
this.selectedLoggers.Clear(); }
this.selectedSourceDetails.Clear();
this.invertFilters = false; private void ClearExcludeText()
{
this.excludeText = string.Empty;
this.RefreshDisplayLines(); this.RefreshDisplayLines();
} }
@ -384,11 +454,29 @@ public partial class AssistantLogViewer : MSGComponentBase
NormalizeSelectedValues(this.selectedLogLevels, this.logLevelOptions); NormalizeSelectedValues(this.selectedLogLevels, this.logLevelOptions);
NormalizeSelectedValues(this.selectedLoggers, this.loggerOptions); NormalizeSelectedValues(this.selectedLoggers, this.loggerOptions);
NormalizeSelectedValues(this.selectedSourceDetails, this.sourceDetailOptions); NormalizeSelectedValues(this.selectedSourceDetails, this.sourceDetailOptions);
this.DisableInvertFiltersIfNoDropdownFilter();
}
private void DisableInvertFiltersIfNoDropdownFilter()
{
if (!this.HasDropdownFilter)
this.invertFilters = false;
}
private static Variant GetToggleVariant(bool isActive)
{
return isActive ? Variant.Filled : Variant.Outlined;
}
private static Color GetToggleColor(bool isActive)
{
return isActive ? Color.Primary : Color.Default;
} }
private void RefreshDisplayLines() private void RefreshDisplayLines()
{ {
this.activeSearchTerms = BuildSearchTerms(this.filterText); this.activeSearchTerms = BuildSearchTerms(this.filterText);
this.activeExcludeTerms = BuildSearchTerms(this.excludeText);
this.displayLines = this.loadedLines this.displayLines = this.loadedLines
.Where(this.LineMatchesFilters) .Where(this.LineMatchesFilters)
.ToList(); .ToList();
@ -396,41 +484,26 @@ public partial class AssistantLogViewer : MSGComponentBase
private bool LineMatchesFilters(LogLine line) private bool LineMatchesFilters(LogLine line)
{ {
if (this.invertFilters && this.HasActiveVisibilityFilter) if (!this.LineMatchesDropdownFilters(line))
return !this.LineMatchesAnyActiveFilter(line); return false;
return this.LineMatchesActiveFilters(line); var renderedLine = this.GetPlainRenderedLine(line);
if (this.filterOnly && this.activeSearchTerms.Length > 0 && !MatchesSearchTerms(renderedLine, this.activeSearchTerms))
return false;
return this.activeExcludeTerms.Length == 0 || !MatchesSearchTerms(renderedLine, this.activeExcludeTerms);
} }
private bool LineMatchesActiveFilters(LogLine line) private bool LineMatchesDropdownFilters(LogLine line)
{ {
if (!MatchesSelection(line.Segments.Level, this.selectedLogLevels)) var matchesDropdownFilters = MatchesSelection(line.Segments.Level, this.selectedLogLevels)
return false; && MatchesSelection(line.Segments.Logger, this.selectedLoggers)
&& MatchesSelection(line.Segments.SourceDetails, this.selectedSourceDetails);
if (!MatchesSelection(line.Segments.Logger, this.selectedLoggers)) if (!this.HasDropdownFilter)
return false;
if (!MatchesSelection(line.Segments.SourceDetails, this.selectedSourceDetails))
return false;
if (!this.filterOnly || this.activeSearchTerms.Length == 0)
return true; return true;
return MatchesSearchTerms(this.GetPlainRenderedLine(line), this.activeSearchTerms); return this.invertFilters ? !matchesDropdownFilters : matchesDropdownFilters;
}
private bool LineMatchesAnyActiveFilter(LogLine line)
{
if (ActiveSelectionMatches(line.Segments.Level, this.selectedLogLevels))
return true;
if (ActiveSelectionMatches(line.Segments.Logger, this.selectedLoggers))
return true;
if (ActiveSelectionMatches(line.Segments.SourceDetails, this.selectedSourceDetails))
return true;
return this.filterOnly && this.activeSearchTerms.Length > 0 && MatchesSearchTerms(this.GetPlainRenderedLine(line), this.activeSearchTerms);
} }
private string RenderLine(LogLine line) private string RenderLine(LogLine line)

View File

@ -1617,6 +1617,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T114706247
-- Select a log file -- Select a log file
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Protokolldatei auswählen" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Protokolldatei auswählen"
-- Show only matching lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T131451442"] = "Nur passende Zeilen anzeigen"
-- Log level -- Log level
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Protokollierungsstufe" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Protokollierungsstufe"
@ -1647,6 +1650,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T228853842
-- Showing {0} of {1} lines. Last refresh: {2}. -- Showing {0} of {1} lines. Last refresh: {2}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Anzeige von {0} von {1} Zeilen. Letzte Aktualisierung: {2}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Anzeige von {0} von {1} Zeilen. Letzte Aktualisierung: {2}."
-- Disable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T240826492"] = "Automatische Aktualisierung deaktivieren"
-- Enable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2467283075"] = "Automatische Aktualisierung aktivieren"
-- No matching log lines. -- No matching log lines.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "Keine passenden Protokollzeilen." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "Keine passenden Protokollzeilen."
@ -1659,10 +1668,10 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T268681396
-- Loaded {0} lines. Last refresh: {1}. -- Loaded {0} lines. Last refresh: {1}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "{0} Zeilen geladen. Letzte Aktualisierung: {1}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "{0} Zeilen geladen. Letzte Aktualisierung: {1}."
-- Filter only -- Disable inverted dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3152625639"] = "Nur filtern" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3035207754"] = "Invertierung der Dropdown-Filter deaktivieren"
-- Copy visible lines -- Copy view
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Ansicht kopieren" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Ansicht kopieren"
-- Loading log file... -- Loading log file...
@ -1671,21 +1680,24 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T333036481
-- Unknown error -- Unknown error
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unbekannter Fehler" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unbekannter Fehler"
-- Exclude
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3551498825"] = "Ausschließen"
-- The log file path is not available yet. -- The log file path is not available yet.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "Der Pfad zur Protokolldatei ist noch nicht verfügbar." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "Der Pfad zur Protokolldatei ist noch nicht verfügbar."
-- Logger -- Logger
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger"
-- Auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3837203600"] = "Automatisch aktualisieren"
-- not loaded yet -- not loaded yet
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "noch nicht geladen" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "noch nicht geladen"
-- Loading... -- Loading...
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Wird geladen..." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Wird geladen..."
-- Select a dropdown filter to invert
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3991737584"] = "Wählen Sie einen Dropdown-Filter zur Invertierung aus"
-- Usage log -- Usage log
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Nutzungsprotokoll" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Nutzungsprotokoll"
@ -1698,14 +1710,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T413024177
-- Opened the log file location. -- Opened the log file location.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Der Speicherort der Protokolldatei wurde geöffnet." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Der Speicherort der Protokolldatei wurde geöffnet."
-- Hide timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4263992002"] = "Zeitstempel ausblenden"
-- Show timestamps -- Show timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Zeitstempel anzeigen" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Zeitstempel anzeigen"
-- Invert filters -- Highlight matches without hiding lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T721900298"] = "Filter umkehren" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T661180902"] = "Treffer hervorheben, ohne übrige Zeilen auszublenden"
-- Clear -- Invert dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T77955010"] = "Löschen" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T8477641"] = "Dropdown-Filter invertieren"
-- You can enter text, attach one or more documents, or use both. At least one input is required. -- You can enter text, attach one or more documents, or use both. At least one input is required.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "Sie können Text eingeben, ein oder mehrere Dokumente anhängen oder beides verwenden. Mindestens eine Eingabe ist erforderlich." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "Sie können Text eingeben, ein oder mehrere Dokumente anhängen oder beides verwenden. Mindestens eine Eingabe ist erforderlich."

View File

@ -1617,6 +1617,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T114706247
-- Select a log file -- Select a log file
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Select a log file" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1231773010"] = "Select a log file"
-- Show only matching lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T131451442"] = "Show only matching lines"
-- Log level -- Log level
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Log level" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T1318706515"] = "Log level"
@ -1647,6 +1650,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T228853842
-- Showing {0} of {1} lines. Last refresh: {2}. -- Showing {0} of {1} lines. Last refresh: {2}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Showing {0} of {1} lines. Last refresh: {2}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2378353570"] = "Showing {0} of {1} lines. Last refresh: {2}."
-- Disable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T240826492"] = "Disable auto-refresh"
-- Enable auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2467283075"] = "Enable auto-refresh"
-- No matching log lines. -- No matching log lines.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "No matching log lines." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2511997530"] = "No matching log lines."
@ -1659,10 +1668,10 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T268681396
-- Loaded {0} lines. Last refresh: {1}. -- Loaded {0} lines. Last refresh: {1}.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "Loaded {0} lines. Last refresh: {1}." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T2920304709"] = "Loaded {0} lines. Last refresh: {1}."
-- Filter only -- Disable inverted dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3152625639"] = "Filter only" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3035207754"] = "Disable inverted dropdown filters"
-- Copy visible lines -- Copy view
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Copy view" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3292961985"] = "Copy view"
-- Loading log file... -- Loading log file...
@ -1671,21 +1680,24 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T333036481
-- Unknown error -- Unknown error
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unknown error" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3461425987"] = "Unknown error"
-- Exclude
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3551498825"] = "Exclude"
-- The log file path is not available yet. -- The log file path is not available yet.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "The log file path is not available yet." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3686775689"] = "The log file path is not available yet."
-- Logger -- Logger
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T376222229"] = "Logger"
-- Auto-refresh
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3837203600"] = "Auto-refresh"
-- not loaded yet -- not loaded yet
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "not loaded yet" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3863250749"] = "not loaded yet"
-- Loading... -- Loading...
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Loading..." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T397479987"] = "Loading..."
-- Select a dropdown filter to invert
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T3991737584"] = "Select a dropdown filter to invert"
-- Usage log -- Usage log
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Usage log" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4031747274"] = "Usage log"
@ -1698,14 +1710,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T413024177
-- Opened the log file location. -- Opened the log file location.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Opened the log file location." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4162897654"] = "Opened the log file location."
-- Hide timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T4263992002"] = "Hide timestamps"
-- Show timestamps -- Show timestamps
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Show timestamps" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T469116133"] = "Show timestamps"
-- Invert filters -- Highlight matches without hiding other lines
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T721900298"] = "Invert filters" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T661180902"] = "Highlight matches without hiding other lines"
-- Clear -- Invert dropdown filters
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T77955010"] = "Clear" UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LOGVIEWER::ASSISTANTLOGVIEWER::T8477641"] = "Invert dropdown filters"
-- You can enter text, attach one or more documents, or use both. At least one input is required. -- You can enter text, attach one or more documents, or use both. At least one input is required.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "You can enter text, attach one or more documents, or use both. At least one input is required." UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1442535450"] = "You can enter text, attach one or more documents, or use both. At least one input is required."