From 5b9584e1bf3a2f4a571c1a094b081402111e6a23 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Tue, 5 Mar 2024 10:30:50 -0800 Subject: [PATCH 1/5] Add Navbar shape liquid helpers --- .../Liquid/NavbarAccessor.cs | 5 +++ .../Liquid/NavbarShapeFilter.cs | 30 +++++++++++++++++ .../OrchardCore.Admin/Startup.cs | 32 +++++++++++++++++++ .../TheAdmin/Views/Layout.cshtml | 2 +- .../TheBlogTheme/Views/Layout.liquid | 2 ++ .../TheTheme/Views/Layout.cshtml | 2 +- 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarAccessor.cs create mode 100644 src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarShapeFilter.cs diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarAccessor.cs b/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarAccessor.cs new file mode 100644 index 00000000000..d661765ef7a --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarAccessor.cs @@ -0,0 +1,5 @@ +namespace OrchardCore.Admin.Liquid; + +public class NavbarAccessor +{ +} diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarShapeFilter.cs b/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarShapeFilter.cs new file mode 100644 index 00000000000..268b27dfc4d --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Liquid/NavbarShapeFilter.cs @@ -0,0 +1,30 @@ +using System.Threading.Tasks; +using Fluid; +using Fluid.Values; +using OrchardCore.Admin.Models; +using OrchardCore.DisplayManagement; +using OrchardCore.DisplayManagement.ModelBinding; +using OrchardCore.Liquid; + +namespace OrchardCore.Admin.Liquid; + +public class NavbarShapeFilter : ILiquidFilter +{ + private readonly IDisplayManager _displayManager; + private readonly IUpdateModelAccessor _updateModelAccessor; + + public NavbarShapeFilter( + IDisplayManager displayManager, + IUpdateModelAccessor updateModelAccessor) + { + _displayManager = displayManager; + _updateModelAccessor = updateModelAccessor; + } + + public async ValueTask ProcessAsync(FluidValue input, FilterArguments arguments, LiquidTemplateContext context) + { + var shape = await _displayManager.BuildDisplayAsync(_updateModelAccessor.ModelUpdater); + + return FluidValue.Create(shape, context.Options); + } +} diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs index 7d08f46eabb..cc8023b5484 100644 --- a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs @@ -1,4 +1,6 @@ using System; +using Fluid; +using Fluid.Values; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApplicationModels; @@ -8,11 +10,15 @@ using Microsoft.Extensions.Options; using OrchardCore.Admin.Controllers; using OrchardCore.Admin.Drivers; +using OrchardCore.Admin.Liquid; using OrchardCore.Admin.Models; +using OrchardCore.DisplayManagement; using OrchardCore.DisplayManagement.Handlers; +using OrchardCore.DisplayManagement.ModelBinding; using OrchardCore.DisplayManagement.Theming; using OrchardCore.Environment.Shell.Configuration; using OrchardCore.Environment.Shell.Scope; +using OrchardCore.Liquid; using OrchardCore.Modules; using OrchardCore.Mvc.Core.Utilities; using OrchardCore.Mvc.Routing; @@ -93,4 +99,30 @@ public override void ConfigureServices(IServiceCollection services) services.AddSiteSettingsPropertyDeploymentStep(S => S["Admin settings"], S => S["Exports the admin settings."]); } } + + [RequireFeatures("OrchardCore.Liquid")] + public class LiquidStartup : StartupBase + { + public override void ConfigureServices(IServiceCollection services) + { + services.Configure(o => + { + o.Scope.SetValue("Navbar", new ObjectValue(new NavbarAccessor())); + o.MemberAccessStrategy.Register(async (obj, name, ctx) => + { + if (ctx is LiquidTemplateContext context) + { + var displayManager = context.Services.GetRequiredService>(); + var updateModelAccessor = context.Services.GetRequiredService(); + + var shape = await displayManager.BuildDisplayAsync(updateModelAccessor.ModelUpdater); + + return FluidValue.Create(shape, ctx.Options); + } + + return NilValue.Instance; + }); + }); + } + } } diff --git a/src/OrchardCore.Themes/TheAdmin/Views/Layout.cshtml b/src/OrchardCore.Themes/TheAdmin/Views/Layout.cshtml index f1f5e2e92c2..be7a31a8c0d 100644 --- a/src/OrchardCore.Themes/TheAdmin/Views/Layout.cshtml +++ b/src/OrchardCore.Themes/TheAdmin/Views/Layout.cshtml @@ -12,7 +12,7 @@ // Branding and Navbar are pre-rendered to allow resource injection. var brandingHtml = await DisplayAsync(await New.AdminBranding()); - var navbar = await DisplayAsync(await DisplayManager.BuildDisplayAsync(UpdateModelAccessor.ModelUpdater, "DetailAdmin")); + var navbar = await DisplayAsync(await DisplayManager.BuildDisplayAsync(UpdateModelAccessor.ModelUpdater, "DetailAdmin")); } diff --git a/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid b/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid index eef06ae255c..4cfb2137fc1 100644 --- a/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid +++ b/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid @@ -1,3 +1,4 @@ +{% assign navbarShape = Navbar | shape_render %} @@ -30,6 +31,7 @@ {{ "Menu" | t }} {% shape "menu", alias: "alias:main-menu", cache_id: "main-menu", cache_fixed_duration: "00:05:00", cache_tag: "alias:main-menu" %} + {{ navbarShape }} {% render_section "Header", required: false %} diff --git a/src/OrchardCore.Themes/TheTheme/Views/Layout.cshtml b/src/OrchardCore.Themes/TheTheme/Views/Layout.cshtml index d4b1f23ac1c..2fe8b0e2ea0 100644 --- a/src/OrchardCore.Themes/TheTheme/Views/Layout.cshtml +++ b/src/OrchardCore.Themes/TheTheme/Views/Layout.cshtml @@ -11,7 +11,7 @@ @{ var adminSettings = Site.As(); // Navbar is pre-rendered to allow resource injection. - var navbar = await DisplayAsync(await DisplayManager.BuildDisplayAsync(UpdateModelAccessor.ModelUpdater)); + var navbar = await DisplayAsync(await DisplayManager.BuildDisplayAsync(UpdateModelAccessor.ModelUpdater)); } From 30d2ae5ece62ba9b0ea20c7454fc163135951f7c Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Sun, 17 Mar 2024 13:14:33 -0700 Subject: [PATCH 2/5] Adding Navbar shape type for Liquid --- src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs | 11 ++++++++++- .../TheBlogTheme/Views/Layout.liquid | 2 -- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs index cc8023b5484..acbd6fd9bc3 100644 --- a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs @@ -107,7 +107,7 @@ public override void ConfigureServices(IServiceCollection services) { services.Configure(o => { - o.Scope.SetValue("Navbar", new ObjectValue(new NavbarAccessor())); + o.Scope.SetValue(nameof(Navbar), new ObjectValue(new NavbarAccessor())); o.MemberAccessStrategy.Register(async (obj, name, ctx) => { if (ctx is LiquidTemplateContext context) @@ -122,6 +122,15 @@ public override void ConfigureServices(IServiceCollection services) return NilValue.Instance; }); + + o.MemberAccessStrategy.Register((navbar, name, context) => + { + return name switch + { + nameof(Navbar.Properties) => new ObjectValue(navbar.Properties), + _ => NilValue.Instance + }; + }); }); } } diff --git a/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid b/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid index 4cfb2137fc1..eef06ae255c 100644 --- a/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid +++ b/src/OrchardCore.Themes/TheBlogTheme/Views/Layout.liquid @@ -1,4 +1,3 @@ -{% assign navbarShape = Navbar | shape_render %} @@ -31,7 +30,6 @@ {{ "Menu" | t }} {% shape "menu", alias: "alias:main-menu", cache_id: "main-menu", cache_fixed_duration: "00:05:00", cache_tag: "alias:main-menu" %} - {{ navbarShape }} {% render_section "Header", required: false %} From c714cde78df3cdf7eed31c86e5316191f74d62d8 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 21 Mar 2024 11:46:47 -0700 Subject: [PATCH 3/5] Add Navbar() function and document the changes --- .../OrchardCore.Admin/Startup.cs | 9 +++-- .../OrchardCore.Admin/Views/Navbar.cshtml | 16 ++++++++- ...ContentCulturePickerNavbarDisplayDriver.cs | 34 ++----------------- .../Views/ContentCulturePicker.cshtml | 21 ++++++++++-- .../Views/NavbarUserMenu.cshtml | 2 +- .../TheTheme/Views/NavbarUserMenu.cshtml | 2 +- .../LiquidViewParser.cs | 2 ++ src/docs/reference/modules/Admin/README.md | 30 +++++++++++++++- src/docs/releases/1.9.0.md | 16 ++++++++- 9 files changed, 89 insertions(+), 43 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs index acbd6fd9bc3..9a7ff60dec3 100644 --- a/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Startup.cs @@ -10,7 +10,6 @@ using Microsoft.Extensions.Options; using OrchardCore.Admin.Controllers; using OrchardCore.Admin.Drivers; -using OrchardCore.Admin.Liquid; using OrchardCore.Admin.Models; using OrchardCore.DisplayManagement; using OrchardCore.DisplayManagement.Handlers; @@ -107,8 +106,7 @@ public override void ConfigureServices(IServiceCollection services) { services.Configure(o => { - o.Scope.SetValue(nameof(Navbar), new ObjectValue(new NavbarAccessor())); - o.MemberAccessStrategy.Register(async (obj, name, ctx) => + o.Scope.SetValue(nameof(Navbar), new FunctionValue(async (args, ctx) => { if (ctx is LiquidTemplateContext context) { @@ -121,8 +119,8 @@ public override void ConfigureServices(IServiceCollection services) } return NilValue.Instance; - }); - + })); + /* o.MemberAccessStrategy.Register((navbar, name, context) => { return name switch @@ -131,6 +129,7 @@ public override void ConfigureServices(IServiceCollection services) _ => NilValue.Instance }; }); + */ }); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Admin/Views/Navbar.cshtml b/src/OrchardCore.Modules/OrchardCore.Admin/Views/Navbar.cshtml index 91b5f1d422d..660e9509314 100644 --- a/src/OrchardCore.Modules/OrchardCore.Admin/Views/Navbar.cshtml +++ b/src/OrchardCore.Modules/OrchardCore.Admin/Views/Navbar.cshtml @@ -1,6 +1,20 @@ +@using OrchardCore.Admin.Models +@using OrchardCore.DisplayManagement +@using OrchardCore.DisplayManagement.ModelBinding + +@inject IDisplayManager DisplayManager +@inject IUpdateModelAccessor UpdateModelAccessor + @if (Model.Content == null) { - return; + dynamic shape = await DisplayAsync(await DisplayManager.BuildDisplayAsync(UpdateModelAccessor.ModelUpdater, "DetailAdmin")); + + if (shape.Content == null) + { + return; + } + + Model.Content = shape.Content; }