From 8d7456dfe7f19da5b94da7470a9d850803770d02 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 4 Nov 2013 22:12:17 +1100 Subject: [PATCH] Fixes: U4-3309 Dashboards cannot have multiple area elements --- .../Configuration/Dashboard/AreaCollection.cs | 32 +++++++++++++++++++ .../Configuration/Dashboard/AreaElement.cs | 12 +++++++ .../Configuration/Dashboard/AreasElement.cs | 15 ++++----- .../Configuration/Dashboard/ISection.cs | 2 +- .../Configuration/Dashboard/SectionElement.cs | 9 +++--- src/Umbraco.Core/Umbraco.Core.csproj | 2 ++ .../DashboardSettings/Dashboard.config | 1 + .../DashboardSettingsTests.cs | 11 ++++--- .../Editors/DashboardController.cs | 2 +- 9 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 src/Umbraco.Core/Configuration/Dashboard/AreaCollection.cs create mode 100644 src/Umbraco.Core/Configuration/Dashboard/AreaElement.cs diff --git a/src/Umbraco.Core/Configuration/Dashboard/AreaCollection.cs b/src/Umbraco.Core/Configuration/Dashboard/AreaCollection.cs new file mode 100644 index 0000000000..03acce069f --- /dev/null +++ b/src/Umbraco.Core/Configuration/Dashboard/AreaCollection.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Collections.Generic; +using System.Configuration; + +namespace Umbraco.Core.Configuration.Dashboard +{ + internal class AreaCollection : ConfigurationElementCollection, IEnumerable + { + protected override ConfigurationElement CreateNewElement() + { + return new AreaElement(); + } + + protected override object GetElementKey(ConfigurationElement element) + { + return ((AreaElement) element).Value; + } + + IEnumerator IEnumerable.GetEnumerator() + { + for (var i = 0; i < Count; i++) + { + yield return BaseGet(i) as IArea; + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Dashboard/AreaElement.cs b/src/Umbraco.Core/Configuration/Dashboard/AreaElement.cs new file mode 100644 index 0000000000..1f498f9eae --- /dev/null +++ b/src/Umbraco.Core/Configuration/Dashboard/AreaElement.cs @@ -0,0 +1,12 @@ +using System.Configuration; + +namespace Umbraco.Core.Configuration.Dashboard +{ + internal class AreaElement : InnerTextConfigurationElement, IArea + { + string IArea.AreaName + { + get { return Value; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Dashboard/AreasElement.cs b/src/Umbraco.Core/Configuration/Dashboard/AreasElement.cs index 8ab27f6387..3b63a4188f 100644 --- a/src/Umbraco.Core/Configuration/Dashboard/AreasElement.cs +++ b/src/Umbraco.Core/Configuration/Dashboard/AreasElement.cs @@ -2,17 +2,14 @@ namespace Umbraco.Core.Configuration.Dashboard { - internal class AreasElement : ConfigurationElement, IArea + internal class AreasElement : ConfigurationElement { - [ConfigurationProperty("area", IsRequired = true)] - public InnerTextConfigurationElement AreaName + [ConfigurationCollection(typeof(SectionCollection), AddItemName = "area")] + [ConfigurationProperty("", IsDefaultCollection = true)] + public AreaCollection AreaCollection { - get { return (InnerTextConfigurationElement)this["area"]; } - } - - string IArea.AreaName - { - get { return AreaName; } + get { return (AreaCollection)base[""]; } + set { base[""] = value; } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/Dashboard/ISection.cs b/src/Umbraco.Core/Configuration/Dashboard/ISection.cs index f841b71e40..39b86717e7 100644 --- a/src/Umbraco.Core/Configuration/Dashboard/ISection.cs +++ b/src/Umbraco.Core/Configuration/Dashboard/ISection.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration.Dashboard { string Alias { get; } - string Area { get; } + IEnumerable Areas { get; } IEnumerable Tabs { get; } diff --git a/src/Umbraco.Core/Configuration/Dashboard/SectionElement.cs b/src/Umbraco.Core/Configuration/Dashboard/SectionElement.cs index b2be96712b..b34d2c6293 100644 --- a/src/Umbraco.Core/Configuration/Dashboard/SectionElement.cs +++ b/src/Umbraco.Core/Configuration/Dashboard/SectionElement.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Configuration; +using System.Linq; namespace Umbraco.Core.Configuration.Dashboard { @@ -12,7 +13,7 @@ namespace Umbraco.Core.Configuration.Dashboard } [ConfigurationProperty("areas", IsRequired = true)] - public AreasElement Area + public AreasElement Areas { get { return (AreasElement)this["areas"]; } } @@ -35,10 +36,10 @@ namespace Umbraco.Core.Configuration.Dashboard { get { return TabCollection; } } - - string ISection.Area + + IEnumerable ISection.Areas { - get { return Area.AreaName; } + get { return Areas.AreaCollection.Cast().Select(x => x.Value); } } IAccess ISection.AccessRights diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3561009c07..6c8fdc5a54 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -159,6 +159,8 @@ + + diff --git a/src/Umbraco.Tests/Configurations/DashboardSettings/Dashboard.config b/src/Umbraco.Tests/Configurations/DashboardSettings/Dashboard.config index fc8750f67b..2586682fdb 100644 --- a/src/Umbraco.Tests/Configurations/DashboardSettings/Dashboard.config +++ b/src/Umbraco.Tests/Configurations/DashboardSettings/Dashboard.config @@ -96,6 +96,7 @@
+ default member diff --git a/src/Umbraco.Tests/Configurations/DashboardSettings/DashboardSettingsTests.cs b/src/Umbraco.Tests/Configurations/DashboardSettings/DashboardSettingsTests.cs index 3130ec47ca..613a697c70 100644 --- a/src/Umbraco.Tests/Configurations/DashboardSettings/DashboardSettingsTests.cs +++ b/src/Umbraco.Tests/Configurations/DashboardSettings/DashboardSettingsTests.cs @@ -41,11 +41,12 @@ namespace Umbraco.Tests.Configurations.DashboardSettings [Test] public void Test_Section_Area() { - Assert.AreEqual("settings", SettingsSection.Sections.ElementAt(0).Area); - Assert.AreEqual("developer", SettingsSection.Sections.ElementAt(1).Area); - Assert.AreEqual("media", SettingsSection.Sections.ElementAt(2).Area); - Assert.AreEqual("content", SettingsSection.Sections.ElementAt(3).Area); - Assert.AreEqual("member", SettingsSection.Sections.ElementAt(4).Area); + Assert.AreEqual("settings", SettingsSection.Sections.ElementAt(0).Areas.First()); + Assert.AreEqual("developer", SettingsSection.Sections.ElementAt(1).Areas.First()); + Assert.AreEqual("media", SettingsSection.Sections.ElementAt(2).Areas.First()); + Assert.AreEqual("content", SettingsSection.Sections.ElementAt(3).Areas.First()); + Assert.AreEqual("default", SettingsSection.Sections.ElementAt(4).Areas.First()); + Assert.AreEqual("member", SettingsSection.Sections.ElementAt(4).Areas.Last()); } [Test] diff --git a/src/Umbraco.Web/Editors/DashboardController.cs b/src/Umbraco.Web/Editors/DashboardController.cs index c93fc65a17..d031c9a691 100644 --- a/src/Umbraco.Web/Editors/DashboardController.cs +++ b/src/Umbraco.Web/Editors/DashboardController.cs @@ -21,7 +21,7 @@ namespace Umbraco.Web.Editors var tabs = new List>(); var dashboardSection = UmbracoConfig.For.DashboardSettings() - .Sections.FirstOrDefault(x => x.Area.InvariantEquals(section)); + .Sections.FirstOrDefault(x => x.Areas.Contains(section)); //if we cannot find it for whatever reason just return an empty one. if (dashboardSection == null)