diff --git a/src/Umbraco.Core/EnumExtensions.cs b/src/Umbraco.Core/EnumExtensions.cs
new file mode 100644
index 0000000000..1443a27876
--- /dev/null
+++ b/src/Umbraco.Core/EnumExtensions.cs
@@ -0,0 +1,45 @@
+using System;
+
+namespace Umbraco.Core
+{
+ ///
+ /// Provides extension methods to enums.
+ ///
+ public static class EnumExtensions
+ {
+ // note:
+ // - no need to HasFlagExact, that's basically an == test
+ // - HasFlagAll cannot be named HasFlag because ext. methods never take priority over instance methods
+
+ ///
+ /// Determines whether a flag enum has all the specified values.
+ ///
+ ///
+ /// True when all bits set in are set in , though other bits may be set too.
+ /// This is the behavior of the original method.
+ ///
+ public static bool HasFlagAll(this T use, T uses)
+ where T : Enum
+ {
+ var num = Convert.ToUInt64(use);
+ var nums = Convert.ToUInt64(uses);
+
+ return (num & nums) == nums;
+ }
+
+ ///
+ /// Determines whether a flag enum has any of the specified values.
+ ///
+ ///
+ /// True when at least one of the bits set in is set in .
+ ///
+ public static bool HasFlagAny(this T use, T uses)
+ where T : Enum
+ {
+ var num = Convert.ToUInt64(use);
+ var nums = Convert.ToUInt64(uses);
+
+ return (num & nums) > 0;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 1a978650f0..10c3964448 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -333,6 +333,7 @@
+
diff --git a/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs b/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs
new file mode 100644
index 0000000000..72a55cee85
--- /dev/null
+++ b/src/Umbraco.Tests/CoreThings/EnumExtensionsTests.cs
@@ -0,0 +1,55 @@
+using NUnit.Framework;
+using Umbraco.Web.Trees;
+using Umbraco.Core;
+
+namespace Umbraco.Tests.CoreThings
+{
+ [TestFixture]
+ public class EnumExtensionsTests
+ {
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Main, false)]
+ [TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, false)]
+ public void HasFlagTest(TreeUse value, TreeUse test, bool expected)
+ {
+ // the built-in Enum.HasFlag() method determines whether
+ // all bits from are set (other bits can be set too)
+
+ if (expected)
+ Assert.IsTrue(value.HasFlag(test));
+ else
+ Assert.IsFalse(value.HasFlag(test));
+ }
+
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Main, false)]
+ [TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, false)]
+ public void HasFlagAllTest(TreeUse value, TreeUse test, bool expected)
+ {
+ // the HasFlagAll() extension method determines whether
+ // all bits from are set (other bits can be set too)
+
+ if (expected)
+ Assert.IsTrue(value.HasFlagAll(test));
+ else
+ Assert.IsFalse(value.HasFlagAll(test));
+ }
+
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Main, false)]
+ [TestCase(TreeUse.Dialog | TreeUse.Main, TreeUse.Dialog, true)]
+ [TestCase(TreeUse.Dialog, TreeUse.Dialog | TreeUse.Main, true)]
+ public void HasFlagAnyTest(TreeUse value, TreeUse test, bool expected)
+ {
+ // the HasFlagAny() extension method determines whether
+ // at least one bit from is set
+
+ if (expected)
+ Assert.IsTrue(value.HasFlagAny(test));
+ else
+ Assert.IsFalse(value.HasFlagAny(test));
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 11f5527a8c..95b6608c42 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -69,6 +69,7 @@
+
@@ -122,6 +123,7 @@
+
diff --git a/src/Umbraco.Web/Services/TreeService.cs b/src/Umbraco.Web/Services/TreeService.cs
index a5574946a6..dc500f2583 100644
--- a/src/Umbraco.Web/Services/TreeService.cs
+++ b/src/Umbraco.Web/Services/TreeService.cs
@@ -26,11 +26,14 @@ namespace Umbraco.Web.Services
public Tree GetByAlias(string treeAlias) => _treeCollection.FirstOrDefault(x => x.TreeAlias == treeAlias);
///
- public IEnumerable GetAll(TreeUse use = TreeUse.Main) => _treeCollection.Where(x => x.TreeUse.HasAny(use));
+ public IEnumerable GetAll(TreeUse use = TreeUse.Main)
+ // use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
+ => _treeCollection.Where(x => x.TreeUse.HasFlagAny(use));
///
public IEnumerable GetBySection(string sectionAlias, TreeUse use = TreeUse.Main)
- => _treeCollection.Where(x => x.SectionAlias.InvariantEquals(sectionAlias) && x.TreeUse.HasAny(use)).OrderBy(x => x.SortOrder).ToList();
+ // use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
+ => _treeCollection.Where(x => x.SectionAlias.InvariantEquals(sectionAlias) && x.TreeUse.HasFlagAny(use)).OrderBy(x => x.SortOrder).ToList();
///
public IDictionary> GetBySectionGrouped(string sectionAlias, TreeUse use = TreeUse.Main)
diff --git a/src/Umbraco.Web/Trees/TreeUseExtensions.cs b/src/Umbraco.Web/Trees/TreeUseExtensions.cs
deleted file mode 100644
index 02b417eb98..0000000000
--- a/src/Umbraco.Web/Trees/TreeUseExtensions.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Umbraco.Web.Trees
-{
- ///
- /// Provides extension methods to the method.
- ///
- public static class TreeUseExtensions
- {
- ///
- /// Determines whether a TreeUse has all the specified values.
- ///
- public static bool Has(this TreeUse use, TreeUse uses)
- {
- return (use & uses) == uses;
- }
-
- ///
- /// Determines whether a TreeUse has any of the specified values.
- ///
- public static bool HasAny(this TreeUse use, TreeUse uses)
- {
- return (use & uses) > 0;
- }
- }
-}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 361c2aa28a..f5cd7ce142 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -186,7 +186,6 @@
-
diff --git a/src/umbraco.sln.DotSettings b/src/umbraco.sln.DotSettings
index d6826e5f90..2f99fe6350 100644
--- a/src/umbraco.sln.DotSettings
+++ b/src/umbraco.sln.DotSettings
@@ -4,6 +4,6 @@
Disposable construction
HINT
False
- CSharp71
+ Default
True
True