Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SNOW-56: .NET 6 and Orchard Core 1.3 upgrade #11

Merged
merged 3 commits into from
Mar 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions Constants/CssClassNames.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace Lombiq.BaseTheme.Constants
namespace Lombiq.BaseTheme.Constants;

public static class CssClassNames
{
public static class CssClassNames
{
public const string LayoutContentWithSidebar = "layoutContent_withSidebar";
}
public const string LayoutContentWithSidebar = "layoutContent_withSidebar";
}
9 changes: 4 additions & 5 deletions Constants/FeatureIds.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace Lombiq.BaseTheme.Constants
namespace Lombiq.BaseTheme.Constants;

public static class FeatureIds
{
public static class FeatureIds
{
public const string Area = "Lombiq.BaseTheme";
}
public const string Area = "Lombiq.BaseTheme";
}
13 changes: 6 additions & 7 deletions Constants/ResourceNames.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
namespace Lombiq.BaseTheme.Constants
namespace Lombiq.BaseTheme.Constants;

public static class ResourceNames
{
public static class ResourceNames
{
private const string Prefix = FeatureIds.Area + ".";
private const string Prefix = FeatureIds.Area + ".";

public const string Site = Prefix + nameof(Site);
public const string Helpers = Prefix + nameof(Helpers);
}
public const string Site = Prefix + nameof(Site);
public const string Helpers = Prefix + nameof(Helpers);
}
31 changes: 15 additions & 16 deletions Constants/ZoneNames.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
namespace Lombiq.BaseTheme.Constants
namespace Lombiq.BaseTheme.Constants;

public static class ZoneNames
{
public static class ZoneNames
{
public const string Header = nameof(Header);
public const string Navigation = nameof(Navigation);
public const string BeforeMain = nameof(BeforeMain);
public const string Featured = nameof(Featured);
public const string AsideFirst = nameof(AsideFirst);
public const string Messages = nameof(Messages);
public const string BeforeContent = nameof(BeforeContent);
public const string Content = nameof(Content);
public const string AfterContent = nameof(AfterContent);
public const string AsideSecond = nameof(AsideSecond);
public const string AfterMain = nameof(AfterMain);
public const string Footer = nameof(Footer);
}
public const string Header = nameof(Header);
public const string Navigation = nameof(Navigation);
public const string BeforeMain = nameof(BeforeMain);
public const string Featured = nameof(Featured);
public const string AsideFirst = nameof(AsideFirst);
public const string Messages = nameof(Messages);
public const string BeforeContent = nameof(BeforeContent);
public const string Content = nameof(Content);
public const string AfterContent = nameof(AfterContent);
public const string AsideSecond = nameof(AsideSecond);
public const string AfterMain = nameof(AfterMain);
public const string Footer = nameof(Footer);
}
10 changes: 5 additions & 5 deletions Lombiq.BaseTheme.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
<DefaultItemExcludes>$(DefaultItemExcludes);.git*;node_modules\**;Tests\**</DefaultItemExcludes>
</PropertyGroup>
Expand All @@ -20,10 +20,10 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="OrchardCore.Theme.Targets" Version="1.2.2" />
<PackageReference Include="OrchardCore.ContentManagement" Version="1.2.2" />
<PackageReference Include="OrchardCore.DisplayManagement" Version="1.2.2" />
<PackageReference Include="OrchardCore.ResourceManagement" Version="1.2.2" />
<PackageReference Include="OrchardCore.Theme.Targets" Version="1.3.0" />
<PackageReference Include="OrchardCore.ContentManagement" Version="1.3.0" />
<PackageReference Include="OrchardCore.DisplayManagement" Version="1.3.0" />
<PackageReference Include="OrchardCore.ResourceManagement" Version="1.3.0" />
</ItemGroup>

<ItemGroup>
Expand Down
183 changes: 91 additions & 92 deletions Models/ZoneDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,113 +9,112 @@
using System.Linq;
using System.Threading.Tasks;

namespace Lombiq.BaseTheme.Models
namespace Lombiq.BaseTheme.Models;

public class ZoneDescriptor
{
public class ZoneDescriptor
{
public const string LayoutElementClassName = "layoutElement";
public const string LeafClassName = LayoutElementClassName + "_leaf";
public const string LayoutElementClassName = "layoutElement";
public const string LeafClassName = LayoutElementClassName + "_leaf";

public string ZoneName { get; set; }
public string ElementName { get; set; }
public bool WrapBody { get; set; }
public string ZoneName { get; set; }
public string ElementName { get; set; }
public bool WrapBody { get; set; }

public IEnumerable<ZoneDescriptor> ChildrenBefore { get; init; }
public IEnumerable<ZoneDescriptor> ChildrenAfter { get; init; }
public IEnumerable<ZoneDescriptor> ChildrenBefore { get; init; }
public IEnumerable<ZoneDescriptor> ChildrenAfter { get; init; }

public ZoneDescriptor(string zoneName = null, string elementName = null, bool wrapBody = false)
public ZoneDescriptor(string zoneName = null, string elementName = null, bool wrapBody = false)
{
ZoneName = zoneName;
ElementName = elementName;
WrapBody = wrapBody;
}

public async Task<IHtmlContent> DisplayZoneAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
string parent)
{
if (page.Model is not IZoneHolding model ||
model.Zones[ZoneName] is not { } zone)
{
ZoneName = zoneName;
ElementName = elementName;
WrapBody = wrapBody;
return new HtmlString(string.Empty);
}

public async Task<IHtmlContent> DisplayZoneAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
string parent)
ElementName ??= "div";

// The zone name should already be PascalCase.
var id = ZoneName.ToCamelCase();
var layoutClassName = string.IsNullOrEmpty(parent)
? "layout" + ZoneName
: FormattableString.Invariant($"layout{parent}__{id}");

var classNames = classHolder.ConcatenateZoneClasses(
ZoneName,
layoutClassName,
LayoutElementClassName,
ChildrenBefore?.Any() != true || ChildrenAfter?.Any() != true ? LeafClassName : null);

var body = await page.DisplayAsync(zone);
if (WrapBody)
{
if (page.Model is not IZoneHolding model ||
model.Zones[ZoneName] is not { } zone)
{
return new HtmlString(string.Empty);
}

ElementName ??= "div";

// The zone name should already be PascalCase.
var id = ZoneName.ToCamelCase();
var layoutClassName = string.IsNullOrEmpty(parent)
? "layout" + ZoneName
: FormattableString.Invariant($"layout{parent}__{id}");

var classNames = classHolder.ConcatenateZoneClasses(
ZoneName,
layoutClassName,
LayoutElementClassName,
ChildrenBefore?.Any() != true || ChildrenAfter?.Any() != true ? LeafClassName : null);

var body = await page.DisplayAsync(zone);
if (WrapBody)
{
// If there is no parent then "body" becomes the BEM element, otherwise there already is an element so
// "Body" becomes a suffix to that.
var bodyWrapperClass = string.IsNullOrEmpty(parent)
? layoutClassName + "__body"
: layoutClassName + "Body";

// This improves accessibility by providing a main landmark, see:
// https://dequeuniversity.com/rules/axe/4.2/bypass?application=axeAPI
var elementName = ZoneName == ZoneNames.Content ? "main" : "div";

body = new HtmlContentBuilder()
.AppendHtml(FormattableString.Invariant($"<{elementName} class=\"{bodyWrapperClass} {LeafClassName}\">"))
.AppendHtml(body)
.AppendHtml(FormattableString.Invariant($"</{elementName}>"));
}

return new HtmlContentBuilder()
.AppendHtml(FormattableString.Invariant($"<{ElementName} id=\"{id}\" class=\"{classNames}\">"))
.AppendHtml(await ConcatenateAsync(classHolder, page, ChildrenBefore, parent))
// If there is no parent then "body" becomes the BEM element, otherwise there already is an element so
// "Body" becomes a suffix to that.
var bodyWrapperClass = string.IsNullOrEmpty(parent)
? layoutClassName + "__body"
: layoutClassName + "Body";

// This improves accessibility by providing a main landmark, see:
// https://dequeuniversity.com/rules/axe/4.2/bypass?application=axeAPI
var elementName = ZoneName == ZoneNames.Content ? "main" : "div";

body = new HtmlContentBuilder()
.AppendHtml(FormattableString.Invariant($"<{elementName} class=\"{bodyWrapperClass} {LeafClassName}\">"))
.AppendHtml(body)
.AppendHtml(await ConcatenateAsync(classHolder, page, ChildrenAfter, parent))
.AppendHtml(FormattableString.Invariant($"</{ElementName}>"));
.AppendHtml(FormattableString.Invariant($"</{elementName}>"));
}

private Task<IHtmlContent> ConcatenateAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors,
string parent) =>
zoneDescriptors == null
? Task.FromResult<IHtmlContent>(new HtmlString(string.Empty))
: ConcatenateInnerAsync(classHolder, page, zoneDescriptors, ZoneName, parent);

private static async Task<IHtmlContent> ConcatenateInnerAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors,
string zoneName,
string parent)
{
var builder = new HtmlContentBuilder();
return new HtmlContentBuilder()
.AppendHtml(FormattableString.Invariant($"<{ElementName} id=\"{id}\" class=\"{classNames}\">"))
.AppendHtml(await ConcatenateAsync(classHolder, page, ChildrenBefore, parent))
.AppendHtml(body)
.AppendHtml(await ConcatenateAsync(classHolder, page, ChildrenAfter, parent))
.AppendHtml(FormattableString.Invariant($"</{ElementName}>"));
}

var newParent = string.IsNullOrEmpty(parent)
? zoneName
: FormattableString.Invariant($"{parent}__{zoneName}");
private Task<IHtmlContent> ConcatenateAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors,
string parent) =>
zoneDescriptors == null
? Task.FromResult<IHtmlContent>(new HtmlString(string.Empty))
: ConcatenateInnerAsync(classHolder, page, zoneDescriptors, ZoneName, parent);

private static async Task<IHtmlContent> ConcatenateInnerAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors,
string zoneName,
string parent)
{
var builder = new HtmlContentBuilder();

foreach (var zoneDescriptor in zoneDescriptors)
{
_ = builder.AppendHtml(await zoneDescriptor.DisplayZoneAsync(classHolder, page, newParent));
}
var newParent = string.IsNullOrEmpty(parent)
? zoneName
: FormattableString.Invariant($"{parent}__{zoneName}");

return builder;
foreach (var zoneDescriptor in zoneDescriptors)
{
_ = builder.AppendHtml(await zoneDescriptor.DisplayZoneAsync(classHolder, page, newParent));
}

public static Task<IHtmlContent> DisplayZonesAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors) =>
ConcatenateInnerAsync(classHolder, page, zoneDescriptors, zoneName: null, parent: null);
return builder;
}

public static Task<IHtmlContent> DisplayZonesAsync<TModel>(
ICssClassHolder classHolder,
RazorPage<TModel> page,
IEnumerable<ZoneDescriptor> zoneDescriptors) =>
ConcatenateInnerAsync(classHolder, page, zoneDescriptors, zoneName: null, parent: null);
}
45 changes: 22 additions & 23 deletions ResourceManagementOptionsConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,33 @@
using Microsoft.Extensions.Options;
using OrchardCore.ResourceManagement;

namespace Lombiq.BaseTheme
{
public class ResourceManagementOptionsConfiguration : IConfigureOptions<ResourceManagementOptions>
{
private const string WwwRoot = "~/" + FeatureIds.Area + "/";
private const string Css = WwwRoot + "css/";
private const string Js = WwwRoot + "js/";
private const string Vendors = WwwRoot + "vendors/";
namespace Lombiq.BaseTheme;

private static readonly ResourceManifest _manifest = new();
public class ResourceManagementOptionsConfiguration : IConfigureOptions<ResourceManagementOptions>
{
private const string WwwRoot = "~/" + FeatureIds.Area + "/";
private const string Css = WwwRoot + "css/";
private const string Js = WwwRoot + "js/";
private const string Vendors = WwwRoot + "vendors/";

static ResourceManagementOptionsConfiguration()
{
_manifest.DefineResource("$" + nameof(FeatureIds.Area), FeatureIds.Area);
private static readonly ResourceManifest _manifest = new();

_manifest
.DefineStyle(ResourceNames.Site)
.SetUrl(Css + "site.min.css", Css + "site.css");
static ResourceManagementOptionsConfiguration()
{
_manifest.DefineResource("$" + nameof(FeatureIds.Area), FeatureIds.Area);

_manifest
.DefineScript(ResourceNames.Helpers)
.SetUrl(Js + "helpers.js");
_manifest
.DefineStyle(ResourceNames.Site)
.SetUrl(Css + "site.min.css", Css + "site.css");

_manifest
.DefineScript("bootstrap")
.SetUrl(Vendors + "bootstrap/js/bootstrap.min.js", Vendors + "bootstrap/js/bootstrap.js");
}
_manifest
.DefineScript(ResourceNames.Helpers)
.SetUrl(Js + "helpers.js");

public void Configure(ResourceManagementOptions options) => options.ResourceManifests.Add(_manifest);
_manifest
.DefineScript("bootstrap")
.SetUrl(Vendors + "bootstrap/js/bootstrap.min.js", Vendors + "bootstrap/js/bootstrap.js");
}

public void Configure(ResourceManagementOptions options) => options.ResourceManifests.Add(_manifest);
}
Loading