Skip to content

Commit 3f9e7d2

Browse files
Custom URLs improvements (#8743)
* Custom URLs improvements - Control whether URL is visible on resources page or not - Add helper method to get resource endpoint from ResourceUrlsCallbackContext - Support relative URLs for endpoints - Add overload of WithUrlForEndpoint for adding extra endpoint URLs Fixes #8725, #8636, #8640, #8638, #6454 * Update tests * Fix test name * Always handle relative endpoint URLs * Use enum for URL display location
1 parent 1bbc4ef commit 3f9e7d2

24 files changed

+449
-59
lines changed

playground/TestShop/TestShop.AppHost/Program.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@
6666
.WithExternalHttpEndpoints()
6767
.WithReference(basketService)
6868
.WithReference(catalogService)
69-
.WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Online store ({u.Endpoint?.EndpointName})"));
69+
// Modify the display text of the URLs
70+
.WithUrls(c => c.Urls.ForEach(u => u.DisplayText = $"Online store ({u.Endpoint?.EndpointName})"))
71+
// Don't show the non-HTTPS link on the resources page (details only)
72+
.WithUrlForEndpoint("http", url => url.DisplayLocation = UrlDisplayLocation.DetailsOnly)
73+
// Add health relative URL (show in details only)
74+
.WithUrlForEndpoint("https", ep => new() { Url = "/health", DisplayText = "Health", DisplayLocation = UrlDisplayLocation.DetailsOnly });
7075

7176
var _ = frontend.GetEndpoint("https").Exists ? frontend.WithHttpsHealthCheck("/health") : frontend.WithHttpHealthCheck("/health");
7277

src/Aspire.Dashboard/Components/Controls/ResourceDetails.razor

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,25 @@
7474
ResizeType="DataGridResizeType.Discrete"
7575
Style="width:100%"
7676
RowSize="DataGridRowSize.Medium"
77-
GridTemplateColumns="1fr 1.5fr"
77+
GridTemplateColumns="1fr 1fr 0.5fr"
7878
ShowHover="true">
79-
<AspireTemplateColumn Sortable="true" SortBy="@_urlValueSort" Title="@ControlStringsLoc[nameof(ControlsStrings.LinkColumnHeader)]">
80-
<GridValue ValueDescription="@ControlStringsLoc[nameof(ControlsStrings.LinkColumnHeader)]"
79+
<AspireTemplateColumn Sortable="true" SortBy="@_urlValueSort" Title="@ControlStringsLoc[nameof(ControlsStrings.LinkAddressColumnHeader)]">
80+
<GridValue ValueDescription="@ControlStringsLoc[nameof(ControlsStrings.LinkAddressColumnHeader)]"
8181
Value="@context.OriginalUrlString"
8282
ValueTemplate="@(_ => RenderUrlValue(context, _filter))"
8383
EnableHighlighting="@(!string.IsNullOrEmpty(_filter))"
8484
IsMaskedChanged="@(_ => OnValueMaskedChanged(context))"
8585
HighlightText="@_filter" />
8686
</AspireTemplateColumn>
87-
<AspireTemplateColumn Sortable="true" SortBy="@(GridSort<DisplayedUrl>.ByAscending(i => i.DisplayName))" Title="@ControlStringsLoc[nameof(ControlsStrings.EndpointNameColumnHeader)]">
87+
<AspireTemplateColumn Sortable="true" SortBy="@_urlValueSort" Title="@ControlStringsLoc[nameof(ControlsStrings.LinkTextColumnHeader)]">
88+
<GridValue ValueDescription="@ControlStringsLoc[nameof(ControlsStrings.LinkTextColumnHeader)]"
89+
Value="@context.Text"
90+
ValueTemplate="@(_ => RenderTextValue(context, _filter))"
91+
EnableHighlighting="@(!string.IsNullOrEmpty(_filter))"
92+
IsMaskedChanged="@(_ => OnValueMaskedChanged(context))"
93+
HighlightText="@_filter" />
94+
</AspireTemplateColumn>
95+
<AspireTemplateColumn Sortable="true" SortBy="@(GridSort<DisplayedUrl>.ByAscending(i => i.DisplayName))" Title="@ControlStringsLoc[nameof(ControlsStrings.EndpointNameColumnHeader)]">
8896
<GridValue ValueDescription="@ControlStringsLoc[nameof(ControlsStrings.EndpointNameColumnHeader)]"
8997
Value="@context.Name"
9098
EnableHighlighting="@(!string.IsNullOrEmpty(_filter) && context.Name != "-")"
@@ -292,15 +300,26 @@
292300
}
293301
return @<span>@vm.Text</span>;
294302
}
295-
// If the URL and text are the same, render a link for the URL
296-
else if (string.Equals(vm.Url, vm.Text, StringComparison.Ordinal))
303+
// Otherwise, render a link for the URL
304+
else
297305
{
298306
if (highlighting)
299307
{
300308
return @<a href="@vm.Url" target="_blank"><FluentHighlighter HighlightedText="@filter" Text="@vm.Url" /></a>;
301309
}
302310
return @<a href="@vm.Url" target="_blank">@vm.Url</a>;
303311
}
312+
}
313+
314+
private static RenderFragment RenderTextValue(DisplayedUrl vm, string filter)
315+
{
316+
var highlighting = !string.IsNullOrEmpty(filter) && vm.Text != "-";
317+
318+
// If there's no URL, e.g. this is a tcp:// URI, show nothing, or URL is same as Text, then show nothing
319+
if (vm.Url is null || string.Equals(vm.Url, vm.Text, StringComparison.Ordinal))
320+
{
321+
return @<span></span>;
322+
}
304323
// Otherwise, render a link with the text as the anchor text & title as the URL
305324
else
306325
{

src/Aspire.Dashboard/Resources/ControlsStrings.Designer.cs

Lines changed: 12 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/ControlsStrings.resx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,8 @@
466466
<data name="EndpointNameColumnHeader" xml:space="preserve">
467467
<value>Endpoint name</value>
468468
</data>
469-
<data name="LinkColumnHeader" xml:space="preserve">
470-
<value>Link</value>
469+
<data name="LinkAddressColumnHeader" xml:space="preserve">
470+
<value>Address</value>
471471
</data>
472472
<data name="ResourceGraphNoEndpoints" xml:space="preserve">
473473
<value>No endpoints</value>
@@ -484,4 +484,7 @@
484484
<data name="TotalItemsFooterCapturePaused" xml:space="preserve">
485485
<value>Capture paused</value>
486486
</data>
487+
<data name="LinkTextColumnHeader" xml:space="preserve">
488+
<value>Text</value>
489+
</data>
487490
</root>

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.cs.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.de.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.es.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.fr.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.it.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Aspire.Dashboard/Resources/xlf/ControlsStrings.ja.xlf

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)