Browse Source

Resolve branding logo urls with the request path base

pull/26065/head
maliming 2 days ago
parent
commit
2849534bb9
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 40
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Branding/UrlHelperBrandingExtensions.cs
  2. 20
      framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/BrandingProviderLogoExtensions.cs
  3. 6
      framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/DefaultBrandingProvider.cs
  4. 18
      framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/IBrandingLogoProvider.cs
  5. 3
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Brand/Default.cshtml
  6. 3
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml

40
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Branding/UrlHelperBrandingExtensions.cs

@ -0,0 +1,40 @@
using System;
using Microsoft.AspNetCore.Mvc;
namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Branding;
public static class UrlHelperBrandingExtensions
{
/// <summary>
/// Resolves a branding url of <see cref="Volo.Abp.Ui.Branding.IBrandingProvider"/> for the current request.
/// "logo.svg", "/logo.svg" and "~/logo.svg" all mean the same application relative url and keep working
/// under a non-root <see cref="Microsoft.AspNetCore.Http.HttpRequest.PathBase"/>.
/// External urls ("http://", "https://" and "//host/") are returned as they are.
/// Returns null when <paramref name="url"/> is null or white space.
/// </summary>
public static string? ResolveBrandingUrl(this IUrlHelper urlHelper, string? url)
{
if (url.IsNullOrWhiteSpace())
{
return null;
}
if (IsExternalUrl(url!))
{
return url;
}
var applicationRelativeUrl = url!.StartsWith("~/", StringComparison.Ordinal)
? url
: "~/" + url.TrimStart('/');
return urlHelper.Content(applicationRelativeUrl);
}
private static bool IsExternalUrl(string url)
{
return url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
|| url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
|| url.StartsWith("//", StringComparison.Ordinal);
}
}

20
framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/BrandingProviderLogoExtensions.cs

@ -0,0 +1,20 @@
namespace Volo.Abp.Ui.Branding;
public static class BrandingProviderLogoExtensions
{
/// <summary>
/// Returns the compact logo of the branding provider on white background when available; otherwise, null.
/// </summary>
public static string? GetLogoIconUrlOrNull(this IBrandingProvider brandingProvider)
{
return (brandingProvider as IBrandingLogoProvider)?.LogoIconUrl;
}
/// <summary>
/// Returns the compact logo of the branding provider on dark background when available; otherwise, null.
/// </summary>
public static string? GetLogoIconReverseUrlOrNull(this IBrandingProvider brandingProvider)
{
return (brandingProvider as IBrandingLogoProvider)?.LogoIconReverseUrl;
}
}

6
framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/DefaultBrandingProvider.cs

@ -2,11 +2,15 @@
namespace Volo.Abp.Ui.Branding;
public class DefaultBrandingProvider : IBrandingProvider, ITransientDependency
public class DefaultBrandingProvider : IBrandingProvider, IBrandingLogoProvider, ITransientDependency
{
public virtual string AppName => "MyApplication";
public virtual string? LogoUrl => null;
public virtual string? LogoReverseUrl => null;
public virtual string? LogoIconUrl => null;
public virtual string? LogoIconReverseUrl => null;
}

18
framework/src/Volo.Abp.UI/Volo/Abp/Ui/Branding/IBrandingLogoProvider.cs

@ -0,0 +1,18 @@
namespace Volo.Abp.Ui.Branding;
/// <summary>
/// Optionally implemented by an <see cref="IBrandingProvider"/> to provide a compact logo,
/// used where the full logo does not fit, like a collapsed menu.
/// </summary>
public interface IBrandingLogoProvider
{
/// <summary>
/// Compact logo on white background
/// </summary>
string? LogoIconUrl { get; }
/// <summary>
/// Compact logo on dark background
/// </summary>
string? LogoIconReverseUrl { get; }
}

3
modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Brand/Default.cshtml

@ -1,9 +1,10 @@
@using Volo.Abp.Ui.Branding
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Branding
@inject IBrandingProvider BrandingProvider
<a class="navbar-brand" href="~/">
@if (!BrandingProvider.LogoUrl.IsNullOrWhiteSpace())
{
<img src="@BrandingProvider.LogoUrl" alt="@BrandingProvider.AppName" >
<img src="@Url.ResolveBrandingUrl(BrandingProvider.LogoUrl)" alt="@BrandingProvider.AppName" >
}
@BrandingProvider.AppName
</a>

3
modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml

@ -12,6 +12,7 @@
@using Volo.Abp.MultiTenancy
@using Volo.Abp.Localization
@using Volo.Abp.Ui.Branding
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Branding
@using Volo.Abp.Ui.LayoutHooks
@inject IBrandingProvider BrandingProvider
@inject IOptions<AbpMultiTenancyOptions> MultiTenancyOptions
@ -64,7 +65,7 @@
<abp-row>
<abp-column class="col mx-auto mb-5" style="max-width: 440px">
<div class="brand-container">
<img class="brand-logo" src="@(BrandingProvider.LogoUrl ?? Url.Content("~/themes/basic/logo.svg"))" alt="@BrandingProvider.AppName"/>
<img class="brand-logo" src="@(Url.ResolveBrandingUrl(BrandingProvider.LogoUrl) ?? Url.Content("~/themes/basic/logo.svg"))" alt="@BrandingProvider.AppName"/>
<h2 class="brand-text">@BrandingProvider.AppName</h2>
</div>
@if (MultiTenancyOptions.Value.IsEnabled &&

Loading…
Cancel
Save