Skip to content

Commit

Permalink
Merge pull request #11 from Lombiq/issue/SNOW-56
Browse files Browse the repository at this point in the history
SNOW-56: .NET 6 and Orchard Core 1.3 upgrade
  • Loading branch information
Luko6 committed Mar 22, 2022
2 parents fa1805a + affa79e commit 5af1200
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 242 deletions.
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

0 comments on commit 5af1200

Please sign in to comment.