diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index 022fb6ed03..c6edce83c3 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -14,7 +14,10 @@ namespace Umbraco.Core.Models [DebuggerDisplay("Id: {Id}, Name: {Name}")] public class PropertyGroup : EntityBase, IEquatable { + private Guid? _parentKey; + private short _level; private string _name; + private string _icon; private int _sortOrder; private PropertyTypeCollection _propertyTypes; @@ -32,6 +35,26 @@ namespace Umbraco.Core.Models OnPropertyChanged(nameof(PropertyTypes)); } + /// + /// Gets or sets the parent key of the group. + /// + [DataMember] + public Guid? ParentKey + { + get => _parentKey; + set => SetPropertyValueAndDetectChanges(value, ref _parentKey, nameof(ParentKey)); + } + + /// + /// Gets or sets the Sort Order of the Group + /// + [DataMember] + public short Level + { + get => _level; + set => SetPropertyValueAndDetectChanges(value, ref _level, nameof(Level)); + } + /// /// Gets or sets the Name of the Group, which corresponds to the Tab-name in the UI /// @@ -42,6 +65,16 @@ namespace Umbraco.Core.Models set => SetPropertyValueAndDetectChanges(value, ref _name, nameof(Name)); } + /// + /// Gets or sets the icon of the group. + /// + [DataMember] + public string Icon + { + get => _icon; + set => SetPropertyValueAndDetectChanges(value, ref _icon, nameof(Icon)); + } + /// /// Gets or sets the Sort Order of the Group /// @@ -82,18 +115,9 @@ namespace Umbraco.Core.Models } } - public bool Equals(PropertyGroup other) - { - if (base.Equals(other)) return true; - return other != null && Name.InvariantEquals(other.Name); - } + public bool Equals(PropertyGroup other) => other != null && base.Equals(other) && ParentKey == other.ParentKey && Level == other.Level && Icon == other.Icon && Name.InvariantEquals(other.Name); - public override int GetHashCode() - { - var baseHash = base.GetHashCode(); - var nameHash = Name.ToLowerInvariant().GetHashCode(); - return baseHash ^ nameHash; - } + public override int GetHashCode() => (base.GetHashCode(), ParentKey, Level, Icon, Name.ToLowerInvariant()).GetHashCode(); protected override void PerformDeepClone(object clone) { diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs index 58107ade5c..70a4c1f9be 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs @@ -34,10 +34,14 @@ namespace Umbraco.Core.Persistence.Factories if (groupDto.ContentTypeNodeId == contentTypeId) group.Id = groupDto.Id; + group.Key = groupDto.UniqueId; + group.ParentKey = groupDto.ParentKey; + group.Level = groupDto.Level; + group.Icon = groupDto.Icon; group.Name = groupDto.Text; group.SortOrder = groupDto.SortOrder; + group.PropertyTypes = new PropertyTypeCollection(isPublishing); - group.Key = groupDto.UniqueId; //Because we are likely to have a group with no PropertyTypes we need to ensure that these are excluded var typeDtos = groupDto.PropertyTypeDtos.Where(x => x.Id > 0); @@ -103,10 +107,13 @@ namespace Umbraco.Core.Persistence.Factories { var dto = new PropertyTypeGroupDto { + UniqueId = propertyGroup.Key, + ParentKey = propertyGroup.ParentKey, + Level = propertyGroup.Level, ContentTypeNodeId = contentTypeId, - SortOrder = propertyGroup.SortOrder, + Icon = propertyGroup.Icon, Text = propertyGroup.Name, - UniqueId = propertyGroup.Key + SortOrder = propertyGroup.SortOrder }; if (propertyGroup.HasIdentity) diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs index 19b5859bcd..b88af3f76f 100644 --- a/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs @@ -20,8 +20,11 @@ namespace Umbraco.Core.Persistence.Mappers { DefineMap(nameof(PropertyGroup.Id), nameof(PropertyTypeGroupDto.Id)); DefineMap(nameof(PropertyGroup.Key), nameof(PropertyTypeGroupDto.UniqueId)); - DefineMap(nameof(PropertyGroup.SortOrder), nameof(PropertyTypeGroupDto.SortOrder)); + DefineMap(nameof(PropertyGroup.ParentKey), nameof(PropertyTypeGroupDto.ParentKey)); + DefineMap(nameof(PropertyGroup.Level), nameof(PropertyTypeGroupDto.Level)); + DefineMap(nameof(PropertyGroup.Icon), nameof(PropertyTypeGroupDto.Icon)); DefineMap(nameof(PropertyGroup.Name), nameof(PropertyTypeGroupDto.Text)); + DefineMap(nameof(PropertyGroup.SortOrder), nameof(PropertyTypeGroupDto.SortOrder)); } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs index ec998660fd..8a949d384a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeCommonRepository.cs @@ -272,9 +272,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return new PropertyGroup(new PropertyTypeCollection(isPublishing)) { Id = dto.Id, + Key = dto.UniqueId, + ParentKey = dto.ParentKey, + Level = dto.Level, + Icon = dto.Icon, Name = dto.Text, - SortOrder = dto.SortOrder, - Key = dto.UniqueId + SortOrder = dto.SortOrder }; } diff --git a/src/Umbraco.Web/Models/ContentEditing/PropertyGroupBasic.cs b/src/Umbraco.Web/Models/ContentEditing/PropertyGroupBasic.cs index a516dbd1d5..d10c767dd4 100644 --- a/src/Umbraco.Web/Models/ContentEditing/PropertyGroupBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/PropertyGroupBasic.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; @@ -32,12 +33,24 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "id")] public int Id { get; set; } - [DataMember(Name = "sortOrder")] - public int SortOrder { get; set; } + [DataMember(Name = "key")] + public Guid Key { get; set; } + + [DataMember(Name = "parentKey")] + public Guid? ParentKey { get; set; } + + [DataMember(Name = "level")] + public short Level { get; set; } + + [DataMember(Name = "icon")] + public string Icon { get; set; } [Required] [DataMember(Name = "name")] public string Name { get; set; } + + [DataMember(Name = "sortOrder")] + public int SortOrder { get; set; } } [DataContract(Name = "propertyGroup", Namespace = "")] diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs index 7028518794..de87f8b904 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs @@ -300,6 +300,11 @@ namespace Umbraco.Web.Models.Mapping { if (source.Id > 0) target.Id = source.Id; + + target.Key = source.Key; + target.ParentKey = source.ParentKey; + target.Level = source.Level; + target.Icon = source.Icon; target.Name = source.Name; target.SortOrder = source.SortOrder; } @@ -309,6 +314,11 @@ namespace Umbraco.Web.Models.Mapping { if (source.Id > 0) target.Id = source.Id; + + target.Key = source.Key; + target.ParentKey = source.ParentKey; + target.Level = source.Level; + target.Icon = source.Icon; target.Name = source.Name; target.SortOrder = source.SortOrder; } @@ -319,10 +329,14 @@ namespace Umbraco.Web.Models.Mapping if (source.Id > 0) target.Id = source.Id; - target.Inherited = source.Inherited; + target.Key = source.Key; + target.ParentKey = source.ParentKey; + target.Level = source.Level; + target.Icon = source.Icon; target.Name = source.Name; target.SortOrder = source.SortOrder; + target.Inherited = source.Inherited; target.Properties = context.MapEnumerable(source.Properties); } @@ -332,10 +346,14 @@ namespace Umbraco.Web.Models.Mapping if (source.Id > 0) target.Id = source.Id; - target.Inherited = source.Inherited; + target.Key = source.Key; + target.ParentKey = source.ParentKey; + target.Level = source.Level; + target.Icon = source.Icon; target.Name = source.Name; target.SortOrder = source.SortOrder; + target.Inherited = source.Inherited; target.Properties = context.MapEnumerable(source.Properties); } diff --git a/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs b/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs index 33fce221b4..24079e70ef 100644 --- a/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/PropertyTypeGroupMapper.cs @@ -75,9 +75,12 @@ namespace Umbraco.Web.Models.Mapping var group = new PropertyGroupDisplay { Id = tab.Id, - Inherited = false, + Key = tab.Key, + ParentKey = tab.ParentKey, + Level = tab.Level, Name = tab.Name, SortOrder = tab.SortOrder, + Inherited = false, ContentTypeId = source.Id }; @@ -100,9 +103,12 @@ namespace Umbraco.Web.Models.Mapping var group = new PropertyGroupDisplay { Id = tab.Id, - Inherited = true, + Key = tab.Key, + ParentKey = tab.ParentKey, + Level = tab.Level, Name = tab.Name, SortOrder = tab.SortOrder, + Inherited = true, ContentTypeId = definingContentType.Id, ParentTabContentTypes = new[] { definingContentType.Id }, ParentTabContentTypeNames = new[] { definingContentType.Name }