Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/Aspire.Dashboard/Aspire.Dashboard.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,22 @@
<InternalsVisibleTo Include="Aspire.Dashboard.Tests" />
</ItemGroup>

<ItemGroup>
<Compile Update="Resources\ControlsStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>ControlsStrings.resx</DependentUpon>
</Compile>
</ItemGroup>

<ItemGroup>
<EmbeddedResource Update="Resources\ControlsStrings.resx">
<XlfSourceFormat>Resx</XlfSourceFormat>
<XlfOutputItem>EmbeddedResource</XlfOutputItem>
<SubType>Designer</SubType>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>ControlsStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

</Project>
14 changes: 8 additions & 6 deletions src/Aspire.Dashboard/Components/Controls/ChartContainer.razor
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
@using Aspire.Dashboard.Model
@using Aspire.Dashboard.Otlp.Model
@using Aspire.Dashboard.Otlp.Model.MetricValues
@using Aspire.Dashboard.Resources
@inject IStringLocalizer<ControlsStrings> Loc

@if (_instrument == null)
@if (_instrument is null)
{
<div>Unable to display chart.</div>
<div>@Loc[nameof(ControlsStrings.ChartContainerUnableToDisplay)]</div>
}
else
{
Expand All @@ -22,7 +24,7 @@ else
{
<div class="metrics-filters-container">
<div style="margin-left: 10px">
<h5>Filters</h5>
<h5>@Loc[ControlsStrings.ChartContainerFiltersHeader]</h5>
<table style="width:100%">
@foreach (var item in _viewModel.DimensionFilters)
{
Expand All @@ -31,8 +33,8 @@ else
<td class="dimension-values" title="@string.Join(", ", item.SelectedValues.Select(v => v.Name))">
<FluentAutocomplete TOption="DimensionValueViewModel"
Width="250px"
Placeholder="Select filters"
AriaLabel="Select filters"
Placeholder="@Loc[ControlsStrings.ChartContainerSelectFilters]"
AriaLabel="@Loc[ControlsStrings.ChartContainerSelectFilters]"
OnOptionsSearch="item.OnSearchAsync"
OptionText="@(item => item.Name)"
@bind-SelectedOptions="item.SelectedValues"
Expand All @@ -44,5 +46,5 @@ else
</div>
</div>
}
</div>
</div>
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
@using Aspire.Dashboard.Model
@using Aspire.Dashboard.Resources
@inject IStringLocalizer<ControlsStrings> Loc

<div class="environment-variables-layout">

Expand All @@ -7,18 +9,18 @@
{
<FluentButton Appearance="Appearance.Lightweight"
IconEnd="@(_showAll ? _showSpecOnlyIcon : _showAllIcon)"
Title="@(_showAll ? "Show Spec Only" : "Show All")"
aria-label="@(_showAll ? "Show Spec Only" : "Show All")"
Title="@(_showAll ? Loc[ControlsStrings.EnvironmentVariablesFilterToggleShowSpecOnly] : ControlsStrings.EnvironmentVariablesFilterToggleShowAll)"
aria-label="@(_showAll ? Loc[ControlsStrings.EnvironmentVariablesFilterToggleShowSpecOnly] : ControlsStrings.EnvironmentVariablesFilterToggleShowAll)"
OnClick="() => _showAll = !_showAll"
slot="end" />
}
<FluentButton Appearance="Appearance.Lightweight"
IconEnd="@(_defaultMasked ? _unmaskIcon : _maskIcon)"
Title="@(_defaultMasked ? "Show Values" : "Hide Values")"
aria-label="@(_defaultMasked ? "Show Values" : "Hide Values")"
Title="@(_defaultMasked ? Loc[ControlsStrings.EnvironmentVariablesShowVariableValues] : Loc[ControlsStrings.EnvironmentVariablesHideVariableValues])"
aria-label="@(_defaultMasked ? Loc[ControlsStrings.EnvironmentVariablesShowVariableValues] : Loc[ControlsStrings.EnvironmentVariablesHideVariableValues])"
OnClick="ToggleMaskState"
slot="end" />
<FluentSearch Placeholder="Filter..."
<FluentSearch Placeholder="@Loc[ControlsStrings.FilterPlaceholder]"
Immediate="true"
Autofocus="true"
@bind-Value="_filter"
Expand Down
10 changes: 6 additions & 4 deletions src/Aspire.Dashboard/Components/Controls/GridValue.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
@inject IJSRuntime JS
@using Aspire.Dashboard.Resources
@inject IJSRuntime JS
@inject IStringLocalizer<ControlsStrings> Loc

<div class="@GetContainerClass()">
@if (EnableMasking && IsMasked)
Expand All @@ -24,15 +26,15 @@
{
<FluentButton Appearance="Appearance.Lightweight"
IconEnd="@(IsMasked ? _unmaskIcon : _maskIcon)"
Title="@(IsMasked ? "Show Value" : "Hide Value")"
Title="@(IsMasked ? Loc[ControlsStrings.GridValueMaskShowValue] : Loc[ControlsStrings.GridValueMaskHideValue])"
OnClick="ToggleMaskStateAsync"
aria-label="@(IsMasked ? "Show Value" : "Hide Value")" />
aria-label="@(IsMasked ? Loc[ControlsStrings.GridValueMaskShowValue] : Loc[ControlsStrings.GridValueMaskHideValue])" />
}
<FluentButton Appearance="Appearance.Lightweight"
Id="@_anchorId"
IconEnd="@(new Icons.Regular.Size16.Copy())"
Class="defaultHidden"
@onclick="@(() => CopyTextToClipboardAsync(Value, @_anchorId))"
aria-label="Copy to Clipboard" />
aria-label="@Loc[ControlsStrings.GridValueCopyToClipboard]" />
<FluentTooltip Anchor="@_anchorId" Position="TooltipPosition.Top">@PreCopyToolTip</FluentTooltip>
</div>
4 changes: 3 additions & 1 deletion src/Aspire.Dashboard/Components/Controls/PlotlyChart.razor
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@namespace Aspire.Dashboard.Components
@using Aspire.Dashboard.Resources
@namespace Aspire.Dashboard.Components
@inject IStringLocalizer<ControlsStrings> Loc

<div id="plotly-chart-container" style="width:650px; height:400px"></div>
9 changes: 5 additions & 4 deletions src/Aspire.Dashboard/Components/Controls/PlotlyChart.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Otlp.Model;
using Aspire.Dashboard.Otlp.Model.MetricValues;
using Aspire.Dashboard.Resources;
using Humanizer;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
Expand Down Expand Up @@ -436,7 +437,7 @@ await JSRuntime.InvokeVoidAsync("updateChart",
}
}

private static string GetDisplayedUnit(OtlpInstrument instrument)
private string GetDisplayedUnit(OtlpInstrument instrument)
{
if (!string.IsNullOrEmpty(instrument.Unit))
{
Expand All @@ -448,15 +449,15 @@ private static string GetDisplayedUnit(OtlpInstrument instrument)
// but have a descriptive name that lets us infer the unit.
if (instrument.Name.EndsWith(".count"))
{
return "Count";
return Loc[ControlsStrings.PlotlyChartCount];
}
else if (instrument.Name.EndsWith(".length"))
{
return "Length";
return Loc[ControlsStrings.PlotlyChartLength];
}
else
{
return "Value";
return Loc[ControlsStrings.PlotlyChartValue];
}
}
}
8 changes: 5 additions & 3 deletions src/Aspire.Dashboard/Components/Controls/PropertyGrid.razor
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
@typeparam TItem
@using Aspire.Dashboard.Resources
@typeparam TItem
@inject IStringLocalizer<ControlsStrings> Loc

<FluentDataGrid Items="@Items"
ResizableColumns="true"
Style="width:100%"
GenerateHeader="GenerateHeaderOption.Sticky"
GridTemplateColumns="@GridTemplateColumns">
<TemplateColumn Title="@NameColumnTitle" Class="nameColumn" SortBy="@NameSort" Sortable="@IsNameSortable">
<TemplateColumn Title="@(NameColumnTitle ?? Loc[ControlsStrings.PropertyGridNameColumnTitle])" Class="nameColumn" SortBy="@NameSort" Sortable="@IsNameSortable">
<GridValue Value="@NameColumnValue(context)" HighlightText="@HighlightText" />
</TemplateColumn>
<TemplateColumn Title="@ValueColumnTitle" Class="valueColumn" SortBy="@ValueSort" Sortable="@IsValueSortable">
<TemplateColumn Title="@(ValueColumnTitle ?? Loc[ControlsStrings.PropertyGridValueColumnTitle])" Class="valueColumn" SortBy="@ValueSort" Sortable="@IsValueSortable">
<GridValue Value="@ValueColumnValue(context)" HighlightText="@HighlightText"
EnableMasking="@EnableValueMasking" IsMasked="@GetIsItemMasked(context)"
IsMaskedChanged="(newValue) => OnIsMaskedChanged(context, newValue)" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@ namespace Aspire.Dashboard.Components.Controls;

public partial class PropertyGrid<TItem>
{

[Parameter, EditorRequired]
public IQueryable<TItem>? Items { get; set; }

[Parameter]
public string GridTemplateColumns { get; set; } = "1fr 1fr";

[Parameter]
public string NameColumnTitle { get; set; } = "Name";
public string? NameColumnTitle { get; set; }

[Parameter]
public string ValueColumnTitle { get; set; } = "Value";
public string? ValueColumnTitle { get; set; }

[Parameter]
public GridSort<TItem>? NameSort { get; set; }
Expand Down
12 changes: 7 additions & 5 deletions src/Aspire.Dashboard/Components/Controls/SpanDetails.razor
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
@using Aspire.Dashboard.Model
@using Aspire.Dashboard.Otlp.Model
@using Aspire.Dashboard.Resources
@inject IStringLocalizer<ControlsStrings> Loc

<div class="span-details-layout">
<FluentToolbar Orientation="Orientation.Horizontal">
<div>
Service <strong>@ViewModel.Span.Source.ApplicationName</strong>
@((MarkupString)string.Format(ControlsStrings.SpanDetailsService, ViewModel.Span.Source.ApplicationName))
</div>
<FluentDivider Role="DividerRole.Presentation" Orientation="Orientation.Vertical" />
<div>
Duration <strong>@DurationFormatter.FormatDuration(ViewModel.Span.Duration)</strong>
@((MarkupString)string.Format(ControlsStrings.SpanDetailsDuration, DurationFormatter.FormatDuration(ViewModel.Span.Duration)))
</div>
<FluentDivider Role="DividerRole.Presentation" Orientation="Orientation.Vertical" />
<div>
Start Time <strong>@DurationFormatter.FormatDuration(ViewModel.Span.StartTime - ViewModel.Span.Trace.FirstSpan.StartTime)</strong>
@((MarkupString)string.Format(ControlsStrings.SpanDetailsStartTime, DurationFormatter.FormatDuration(ViewModel.Span.StartTime - ViewModel.Span.Trace.FirstSpan.StartTime)))
</div>
<FluentAnchor slot="end" Appearance="Appearance.Lightweight" Href="@($"/StructuredLogs?spanId={ViewModel.Span.SpanId}")">View Logs</FluentAnchor>
<FluentAnchor slot="end" Appearance="Appearance.Lightweight" Href="@($"/StructuredLogs?spanId={ViewModel.Span.SpanId}")">@Loc[ControlsStrings.SpanDetailsViewLogsLink]</FluentAnchor>
<FluentDivider slot="end" Role="DividerRole.Presentation" Orientation="Orientation.Vertical" />
<FluentSearch Placeholder="Filter..."
<FluentSearch Placeholder="@Loc[ControlsStrings.FilterPlaceholder]"
Immediate="true"
Autofocus="true"
@bind-Value="_filter"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
@using Aspire.Dashboard.Model
@using Aspire.Dashboard.Resources
@inject IStringLocalizer<ControlsStrings> Loc

<div class="structured-log-details-layout">
<FluentToolbar Orientation="Orientation.Horizontal">
<FluentSearch Placeholder="Filter..."
<FluentSearch Placeholder="@Loc[ControlsStrings.FilterPlaceholder]"
Immediate="true"
Autofocus="true"
@bind-Value="_filter"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<div class="summary-details-container">
@using Aspire.Dashboard.Resources
@inject IStringLocalizer<ControlsStrings> Loc

<div class="summary-details-container">
<FluentSplitter Orientation="@Orientation" Collapsed="@(!ShowDetails)"
OnResized="HandleSplitterResize"
Panel1Size="@_panel1Size" Panel2Size="@_panel2Size"
Expand All @@ -23,10 +26,10 @@
<FluentButton Appearance="Appearance.Stealth"
IconEnd="@(Orientation == Orientation.Horizontal ? _splitHorizontalIcon : _splitVerticalIcon)"
OnClick="HandleToggleOrientation"
Title="@(Orientation == Orientation.Horizontal ? "Split Horizontal" : "Split Vertical")"
aria-label="@(Orientation == Orientation.Horizontal ? "Split Horizontal" : "Split Vertical")" />
Title="@(Orientation == Orientation.Horizontal ? Loc[ControlsStrings.SummaryDetailsViewSplitHorizontal] : Loc[ControlsStrings.SummaryDetailsViewSplitVertical])"
aria-label="@(Orientation == Orientation.Horizontal ? Loc[ControlsStrings.SummaryDetailsViewSplitHorizontal] : Loc[ControlsStrings.SummaryDetailsViewSplitVertical])" />
<FluentButton Appearance="Appearance.Stealth" IconEnd="@(new Icons.Regular.Size16.Dismiss())"
OnClick="HandleDismissAsync" Title="Close" aria-label="Close" />
OnClick="HandleDismissAsync" Title="@Loc[ControlsStrings.SummaryDetailsViewCloseView]" aria-label="@Loc[ControlsStrings.SummaryDetailsViewCloseView]" />
</div>
</header>
@Details
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
@namespace Aspire.Dashboard.Components
@using Aspire.Dashboard.Resources
@namespace Aspire.Dashboard.Components
@inject IStringLocalizer<ControlsStrings> Loc

<div class="total-items-footer">Total: <strong>@_totalItemCount results found</strong></div>
<div class="total-items-footer">@((MarkupString)string.Format(Loc[ControlsStrings.TotalItemsFooterText], _totalItemCount))</div>

@code {
private int _totalItemCount;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading