diff --git a/src/Blazored.Modal/Blazored.Modal.csproj b/src/Blazored.Modal/Blazored.Modal.csproj index c7ef3ee..10f00d4 100644 --- a/src/Blazored.Modal/Blazored.Modal.csproj +++ b/src/Blazored.Modal/Blazored.Modal.csproj @@ -30,6 +30,8 @@ + + diff --git a/src/Blazored.Modal/BlazoredModal.razor b/src/Blazored.Modal/BlazoredModal.razor index fe16c9d..44512cf 100644 --- a/src/Blazored.Modal/BlazoredModal.razor +++ b/src/Blazored.Modal/BlazoredModal.razor @@ -1,5 +1,7 @@ @using System.Collections.ObjectModel +@using Blazored.Modal.Configuration @using Microsoft.AspNetCore.Components.Routing +@using Microsoft.Extensions.Options @inject NavigationManager NavigationManager @inject IJSRuntime JsRuntime @@ -37,6 +39,14 @@ internal event Action? OnModalClosed; + public BlazoredModal() + { + if (baseUri != null) + return; + // creates a lazy object that will determine the baseUri from the first request + baseUri = new(() => (NavigationManager.BaseUri ?? "./") + "_content/Blazored.Modal/"); + } + protected override void OnInitialized() { if (CascadedModalService == null) @@ -63,13 +73,49 @@ _globalModalOptions.ActivateFocusTrap = ActivateFocusTrap; } - protected override async Task OnAfterRenderAsync(bool firstRender) + #region JavaScript path customization + // This allows the javascript to be located on a CDN or shared location for server caching + // and/or sharing between multiple apps, or that the path can be customized for the app + // automatically base on the BaseUri found in NavigationManager + + [Inject] + private IOptions Settings { get; set; } = null!; + + // stores the basePath for all instances + private static string? sharedBasePath; + + // default location for the JS file + private const string DefaultLocation = "./"; + + // a lazy object that will hold the baseUri + private static Lazy? baseUri; + + // gets the baseUri from the lazy object + private string? BaseUri => baseUri?.Value; + + // gets the location from the settings + private string? Location => Settings.Value.JsPath; + + private string JsPath { - if (firstRender) + get { - _styleFunctions = await JsRuntime.InvokeAsync("import", "./_content/Blazored.Modal/BlazoredModal.razor.js"); + // if the basePath is already set, return it + var basePath = sharedBasePath; + if (basePath != null) + return basePath; + // if the location is null, use the default location + var str = Location ?? BaseUri; + return sharedBasePath = str + "BlazoredModal.razor.js"; } } + #endregion + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + _styleFunctions = await JsRuntime.InvokeAsync("import", JsPath); + } internal async Task CloseInstance(ModalReference? modal, ModalResult result) { diff --git a/src/Blazored.Modal/BlazoredModalInstance.razor b/src/Blazored.Modal/BlazoredModalInstance.razor index aa9f7d0..518efb1 100644 --- a/src/Blazored.Modal/BlazoredModalInstance.razor +++ b/src/Blazored.Modal/BlazoredModalInstance.razor @@ -21,6 +21,10 @@ else {

@Title

} + @if (HeaderContent != null) + { + @HeaderContent + } @if (!HideCloseButton) {