Skip to content

Commit

Permalink
Popover: add Legacy mode (uses old MudPopoverService) (#7497)
Browse files Browse the repository at this point in the history
  • Loading branch information
ScarletKuro committed Sep 14, 2023
1 parent e4f916e commit ca6c54d
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using MudBlazor.Interop;
using MudBlazor.Services;
using MudBlazor.UnitTests.Mocks;
using NUnit.Framework;
Expand Down Expand Up @@ -320,6 +319,7 @@ public void AddMudPopoverService_ShouldRegisterServices_WithOptionsAction()
options.ContainerClass = "container_class";
options.FlipMargin = 100;
options.ThrowOnDuplicateProvider = false;
options.Mode = PopoverMode.Legacy;
expectedOptions = options;
});
var serviceProvider = services.BuildServiceProvider();
Expand Down Expand Up @@ -539,6 +539,7 @@ public void AddMudServices_ShouldRegisterAllServices_WithOptionsAction()
options.PopoverOptions.ContainerClass = "container_class";
options.PopoverOptions.FlipMargin = 100;
options.PopoverOptions.ThrowOnDuplicateProvider = false;
options.PopoverOptions.Mode = PopoverMode.Legacy;
expectedOptions = options;
});
Expand Down Expand Up @@ -611,6 +612,7 @@ public void AddMudServices_ShouldRegisterAllServices_WithOptionsAction()
Assert.AreEqual(expectedOptions.PopoverOptions.ContainerClass, actualPopoverOptions.ContainerClass);
Assert.AreEqual(expectedOptions.PopoverOptions.FlipMargin, actualPopoverOptions.FlipMargin);
Assert.AreEqual(expectedOptions.PopoverOptions.ThrowOnDuplicateProvider, actualPopoverOptions.ThrowOnDuplicateProvider);
Assert.AreEqual(expectedOptions.PopoverOptions.Mode, actualPopoverOptions.Mode);

Assert.AreEqual(expectedOptions.ResizeObserverOptions.EnableLogging, actualResizeObserverOptions.EnableLogging);
Assert.AreEqual(expectedOptions.ResizeObserverOptions.ReportRate, actualResizeObserverOptions.ReportRate);
Expand Down
4 changes: 0 additions & 4 deletions src/MudBlazor/Components/Popover/MudPopover.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ namespace MudBlazor
#nullable enable
public partial class MudPopover : MudPopoverBase
{
[Inject]
[Obsolete($"Replaced by {nameof(PopoverService)}. Will be removed in v7.")]
public IMudPopoverService Service { get; set; } = null!;

protected internal override string PopoverClass =>
new CssBuilder("mud-popover")
.AddClass($"mud-popover-fixed", Fixed)
Expand Down
64 changes: 59 additions & 5 deletions src/MudBlazor/Components/Popover/MudPopoverBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,17 @@ namespace MudBlazor;
/// </remarks>
public abstract class MudPopoverBase : MudComponentBase, IPopover, IAsyncDisposable
{
[Obsolete("For Legacy compatibility mode only, will be removed in v7.")]
private MudPopoverHandler? _handler;

private bool _afterFirstRender;

/// <inheritdoc />
public virtual Guid Id { get; } = Guid.NewGuid();
public virtual Guid Id { get; [Obsolete("Set is only needed for legacy mode only. Remove in v7.")] private set; } = Guid.NewGuid();

[Inject]
[Obsolete($"Replaced by {nameof(PopoverService)}. Will be removed in v7.")]
public IMudPopoverService Service { get; set; } = null!;

[Inject]
protected IPopoverService PopoverService { get; set; } = null!;
Expand Down Expand Up @@ -51,7 +58,18 @@ public abstract class MudPopoverBase : MudComponentBase, IPopover, IAsyncDisposa
/// <inheritdoc />
protected override async Task OnInitializedAsync()
{
await PopoverService.CreatePopoverAsync(this);
if (PopoverService.PopoverOptions.Mode == PopoverMode.Legacy)
#pragma warning disable CS0618 // Type or member is obsolete
{
_handler = Service.Register(ChildContent ?? new RenderFragment((x) => { }));
_handler.SetComponentBaseParameters(this, PopoverClass, PopoverStyles, Open);
Id = _handler.Id;
}
#pragma warning restore CS0618 // Type or member is obsolete
else
{
await PopoverService.CreatePopoverAsync(this);
}

await base.OnInitializedAsync();
}
Expand All @@ -63,7 +81,19 @@ protected override async Task OnParametersSetAsync()

if (_afterFirstRender)
{
await PopoverService.UpdatePopoverAsync(this);
if (PopoverService.PopoverOptions.Mode == PopoverMode.Legacy)
#pragma warning disable CS0618 // Type or member is obsolete
{
if (_handler is not null)
{
await _handler.UpdateFragmentAsync(ChildContent, this, PopoverClass, PopoverStyles, Open);
}
}
#pragma warning restore CS0618 // Type or member is obsolete
else
{
await PopoverService.UpdatePopoverAsync(this);
}
}
}

Expand All @@ -72,7 +102,22 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await PopoverService.UpdatePopoverAsync(this);
if (PopoverService.PopoverOptions.Mode == PopoverMode.Legacy)
#pragma warning disable CS0618 // Type or member is obsolete
{
if (_handler is not null)
{
await _handler.Initialize();
await Service.InitializeIfNeeded();
await _handler.UpdateFragmentAsync(ChildContent, this, PopoverClass, PopoverStyles, Open);
}
}
#pragma warning restore CS0618 // Type or member is obsolete
else
{
await PopoverService.UpdatePopoverAsync(this);
}

_afterFirstRender = true;
}

Expand All @@ -87,7 +132,16 @@ public virtual async ValueTask DisposeAsync()
{
if (IsJSRuntimeAvailable)
{
await PopoverService.DestroyPopoverAsync(this);
#pragma warning disable CS0618 // Type or member is obsolete
if (PopoverService.PopoverOptions.Mode == PopoverMode.Legacy)
{
await Service.Unregister(_handler);
}
#pragma warning restore CS0618 // Type or member is obsolete
else
{
await PopoverService.DestroyPopoverAsync(this);
}
}
}
catch (JSDisconnectedException) { }
Expand Down
2 changes: 2 additions & 0 deletions src/MudBlazor/Extensions/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ public static IServiceCollection AddMudPopoverService(this IServiceCollection se
popoverOptions.FlipMargin = options.FlipMargin;
popoverOptions.QueueDelay = options.QueueDelay;
popoverOptions.ThrowOnDuplicateProvider = options.ThrowOnDuplicateProvider;
popoverOptions.Mode = options.Mode;
});

return services;
Expand Down Expand Up @@ -470,6 +471,7 @@ public static IServiceCollection AddMudServices(this IServiceCollection services
popoverOptions.FlipMargin = options.PopoverOptions.FlipMargin;
popoverOptions.QueueDelay = options.PopoverOptions.QueueDelay;
popoverOptions.ThrowOnDuplicateProvider = options.PopoverOptions.ThrowOnDuplicateProvider;
popoverOptions.Mode = options.PopoverOptions.Mode;
})
.AddMudBlazorScrollSpy()
.AddMudEventManager()
Expand Down
2 changes: 1 addition & 1 deletion src/MudBlazor/Services/Popover/MudPopoverHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public void SetComponentBaseParameters(MudComponentBase componentBase, string @c
Fragment = fragment;
SetComponentBaseParameters(componentBase, @class, @style, showContent);
ElementReference?.StateHasChanged();
_updater.Invoke(); // <-- this doesn't do anything anymore except making unit tests happy
_updater?.Invoke(); // <-- this doesn't do anything anymore except making unit tests happy
}
finally
{
Expand Down
26 changes: 26 additions & 0 deletions src/MudBlazor/Services/Popover/PopoverMode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (c) MudBlazor 2021
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

namespace MudBlazor;

#nullable enable

/// <summary>
/// Specifies the mode for displaying popovers.
/// </summary>
public enum PopoverMode
{
/// <summary>
/// The default popover mode that uses the <see cref="IPopoverService"/>.
/// </summary>
Default = 0,

/// <summary>
/// The legacy popover mode used for backward compatibility, which utilizes the old <see cref="IMudPopoverService"/> instead of <see cref="IPopoverService"/>.
/// </summary>
/// <remarks>
/// This property is only for backward compatibility with old behaviour. This will be removed in v7.
/// </remarks>
Legacy = 1,
}
11 changes: 11 additions & 0 deletions src/MudBlazor/Services/Popover/PopoverOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,16 @@ public class PopoverOptions
/// The default value is <c>true</c>.
/// </summary>
public bool ThrowOnDuplicateProvider { get; set; } = true;

/// <summary>
/// Gets or sets the mode for displaying popovers.
/// The default value is <c>PopoverMode.Default</c>.
/// </summary>
/// <remarks>
/// This property determines the behavior of popovers. You can set it to either <see cref="PopoverMode.Default"/>
/// to use the <see cref="IPopoverService"/> or <see cref="PopoverMode.Legacy"/> to use the old <see cref="IMudPopoverService"/>
/// for backward compatibility.
/// </remarks>
public PopoverMode Mode { get; set; } = PopoverMode.Default;
}
}

0 comments on commit ca6c54d

Please sign in to comment.