From 649679cb30689115ccabb360ce6f07cdd207b125 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 6 Jan 2016 14:24:53 +0100 Subject: [PATCH 1/7] U4-7612 Properties Pane is empty when trying to add a new Property to a new or existing Document Type --- src/Umbraco.Web/Editors/DataTypeController.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs index c2d7ec37d2..931d00968b 100644 --- a/src/Umbraco.Web/Editors/DataTypeController.cs +++ b/src/Umbraco.Web/Editors/DataTypeController.cs @@ -299,14 +299,16 @@ namespace Umbraco.Web.Editors { var dataTypes = Services.DataTypeService .GetAllDataTypeDefinitions() - .Select(Mapper.Map); + .Select(Mapper.Map) + .ToArray(); var propertyEditors = PropertyEditorResolver.Current.PropertyEditors.ToArray(); foreach (var dataType in dataTypes) { - var propertyEditor = propertyEditors.Single(x => x.Alias == dataType.Alias); - dataType.HasPrevalues = propertyEditor.PreValueEditor.Fields.Any(); ; + var propertyEditor = propertyEditors.SingleOrDefault(x => x.Alias == dataType.Alias); + if(propertyEditor != null) + dataType.HasPrevalues = propertyEditor.PreValueEditor.Fields.Any(); ; } var grouped = dataTypes From e016622fe3322e64c701d368d557f716b7d7c8b2 Mon Sep 17 00:00:00 2001 From: Claus Date: Mon, 11 Jan 2016 11:57:52 +0100 Subject: [PATCH 2/7] Fixes: U4-7639 Misleading message on creating first document type and click on "compositions" Added in FirstContentType property on object returned from GetEmpty to indicate whether this is the first content type being created or not (different error messages in backoffice). --- .../Mapping/ContentTypeModelMappingTests.cs | 2 +- .../ContentEditing/ContentTypeDisplay.cs | 57 +++++++++---------- .../Models/Mapping/ContentTypeModelMapper.cs | 8 ++- .../Mapping/FirstContentTypeResolver.cs | 24 ++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + 5 files changed, 60 insertions(+), 32 deletions(-) create mode 100644 src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs diff --git a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs index 76d1220ea3..e066f03da4 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Models.Mapping Mapper.Initialize(configuration => { //initialize our content type mapper - var mapper = new ContentTypeModelMapper(new Lazy(() => _propertyEditorResolver.Object)); + var mapper = new ContentTypeModelMapper(new Lazy(() => _propertyEditorResolver.Object), new Lazy(() => appContext.Services.ContentTypeService)); mapper.ConfigureMappings(configuration, appContext); var entityMapper = new EntityModelMapper(); entityMapper.ConfigureMappings(configuration, appContext); diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentTypeDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentTypeDisplay.cs index e0165450ed..d5166a9180 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentTypeDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentTypeDisplay.cs @@ -1,31 +1,28 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; - -namespace Umbraco.Web.Models.ContentEditing -{ - - [DataContract(Name = "contentType", Namespace = "")] - public class ContentTypeDisplay : ContentTypeCompositionDisplay +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Umbraco.Web.Models.ContentEditing +{ + + [DataContract(Name = "contentType", Namespace = "")] + public class ContentTypeDisplay : ContentTypeCompositionDisplay { - public ContentTypeDisplay() - { - //initialize collections so at least their never null - AllowedTemplates = new List(); - } - - //name, alias, icon, thumb, desc, inherited from the content type - - // Templates - [DataMember(Name = "allowedTemplates")] - public IEnumerable AllowedTemplates { get; set; } - - [DataMember(Name = "defaultTemplate")] - public EntityBasic DefaultTemplate { get; set; } - - } -} + public ContentTypeDisplay() + { + //initialize collections so at least their never null + AllowedTemplates = new List(); + } + + //name, alias, icon, thumb, desc, inherited from the content type + + // Templates + [DataMember(Name = "allowedTemplates")] + public IEnumerable AllowedTemplates { get; set; } + + [DataMember(Name = "defaultTemplate")] + public EntityBasic DefaultTemplate { get; set; } + + [DataMember(Name = "firstContentType")] + public bool FirstContentType { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs index 39f4a57b32..1152284068 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs @@ -9,6 +9,7 @@ using Umbraco.Core.PropertyEditors; using Umbraco.Web.Models.ContentEditing; using System.Collections.Generic; using AutoMapper.Internal; +using Umbraco.Core.Services; using Property = umbraco.NodeFactory.Property; namespace Umbraco.Web.Models.Mapping @@ -19,17 +20,20 @@ namespace Umbraco.Web.Models.Mapping internal class ContentTypeModelMapper : MapperConfiguration { private readonly Lazy _propertyEditorResolver; + private readonly Lazy _contentTypeService; //default ctor public ContentTypeModelMapper() { _propertyEditorResolver = new Lazy(() => PropertyEditorResolver.Current); + _contentTypeService = new Lazy(() => ApplicationContext.Current.Services.ContentTypeService); } //ctor can be used for testing - public ContentTypeModelMapper(Lazy propertyEditorResolver) + public ContentTypeModelMapper(Lazy propertyEditorResolver, Lazy contentTypeService) { _propertyEditorResolver = propertyEditorResolver; + _contentTypeService = contentTypeService; } public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) @@ -114,6 +118,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore()) .ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore()) .ForMember(display => display.Notifications, expression => expression.Ignore()) + .ForMember(x => x.FirstContentType, exp => exp.ResolveUsing(new FirstContentTypeResolver(_contentTypeService))) .AfterMap((source, dest) => { //sync templates @@ -176,6 +181,7 @@ namespace Umbraco.Web.Models.Mapping .MapBaseContentTypeSaveToDisplay() .ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore()) .ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore()) + .ForMember(dto => dto.FirstContentType, exp => exp.Ignore()) .AfterMap((source, dest) => { //sync templates diff --git a/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs b/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs new file mode 100644 index 0000000000..406c5e2681 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Core.Services; + +namespace Umbraco.Web.Models.Mapping +{ + internal class FirstContentTypeResolver : ValueResolver + { + private readonly Lazy _contentTypeService; + + public FirstContentTypeResolver(Lazy contentTypeService) + { + _contentTypeService = contentTypeService; + } + + protected override bool ResolveCore(IContentType source) + { + var contentTypes = _contentTypeService.Value.GetAllContentTypes(); + return contentTypes.Any() == false; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 89780c9aae..30100d78f6 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -309,6 +309,7 @@ + From ce382c42c4783b5e8c4b6d513cc250d38ce8df35 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Jan 2016 13:02:59 +0100 Subject: [PATCH 3/7] Fixes: U4-7639 show another message when first document type --- .../contenttypeeditor/compositions/compositions.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html index 3467b8568e..14055c3d56 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html @@ -15,7 +15,13 @@ + There are no content types available to use as a composition. + + + This content type is used in a composition, and therefore cannot be composed itself. From 6f6c2a3d9053a19649b0da5c22b81dada560cfc3 Mon Sep 17 00:00:00 2001 From: Claus Date: Mon, 11 Jan 2016 14:59:16 +0100 Subject: [PATCH 4/7] changing bindings to be compatible with other PR. --- .../contenttypeeditor/compositions/compositions.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html index 14055c3d56..f6723a22c0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html @@ -21,15 +21,15 @@ This content type is used in a composition, and therefore cannot be composed itself.
    -
  • +
  • -
    +
    Date: Mon, 11 Jan 2016 17:06:11 +0100 Subject: [PATCH 5/7] fixes usage of model.contentType.availableCompositeContentTypes to use the availableCompositeContentTypes directly attached to the model. removes the FirstContentType property and adds simple content type service methods to count the doc type number, moves the request to get availableCompositeContentTypes to the dialog (where it's needed and so it's lazy) --- .../Services/ContentTypeService.cs | 16 +++++++++++++ .../Services/IContentTypeService.cs | 3 +++ .../Mapping/ContentTypeModelMappingTests.cs | 2 +- .../components/umbgroupsbuilder.directive.js | 2 +- .../common/resources/contenttype.resource.js | 9 +++++++ .../common/resources/mediatype.resource.js | 9 +++++++ .../compositions/compositions.html | 6 ++--- .../views/documenttypes/edit.controller.js | 8 +------ .../src/views/mediatypes/edit.controller.js | 8 +------ .../Editors/ContentTypeController.cs | 4 ++++ .../Editors/MediaTypeController.cs | 4 ++++ .../ContentEditing/ContentTypeDisplay.cs | 4 +--- .../Models/Mapping/ContentTypeModelMapper.cs | 9 ++----- .../Mapping/FirstContentTypeResolver.cs | 24 ------------------- src/Umbraco.Web/Umbraco.Web.csproj | 1 - 15 files changed, 55 insertions(+), 54 deletions(-) delete mode 100644 src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index 75afb33a84..ab3be7aaeb 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -461,6 +461,22 @@ namespace Umbraco.Core.Services } + public int CountContentTypes() + { + using (var repository = RepositoryFactory.CreateContentTypeRepository(UowProvider.GetUnitOfWork())) + { + return repository.Count(Query.Builder); + } + } + + public int CountMediaTypes() + { + using (var repository = RepositoryFactory.CreateMediaTypeRepository(UowProvider.GetUnitOfWork())) + { + return repository.Count(Query.Builder); + } + } + /// /// Validates the composition, if its invalid a list of property type aliases that were duplicated is returned /// diff --git a/src/Umbraco.Core/Services/IContentTypeService.cs b/src/Umbraco.Core/Services/IContentTypeService.cs index 9e59308a39..2fa92f2311 100644 --- a/src/Umbraco.Core/Services/IContentTypeService.cs +++ b/src/Umbraco.Core/Services/IContentTypeService.cs @@ -11,6 +11,9 @@ namespace Umbraco.Core.Services /// public interface IContentTypeService : IService { + int CountContentTypes(); + int CountMediaTypes(); + /// /// Validates the composition, if its invalid a list of property type aliases that were duplicated is returned /// diff --git a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs index e066f03da4..76d1220ea3 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentTypeModelMappingTests.cs @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Models.Mapping Mapper.Initialize(configuration => { //initialize our content type mapper - var mapper = new ContentTypeModelMapper(new Lazy(() => _propertyEditorResolver.Object), new Lazy(() => appContext.Services.ContentTypeService)); + var mapper = new ContentTypeModelMapper(new Lazy(() => _propertyEditorResolver.Object)); mapper.ConfigureMappings(configuration, appContext); var entityMapper = new EntityModelMapper(); entityMapper.ConfigureMappings(configuration, appContext); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js index a514de7ee8..2a54f57a6c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js @@ -1,7 +1,7 @@ (function() { 'use strict'; - function GroupsBuilderDirective(contentTypeHelper, contentTypeResource, mediaTypeResource, dataTypeHelper, dataTypeResource, $filter) { + function GroupsBuilderDirective(contentTypeHelper, contentTypeResource, mediaTypeResource, dataTypeHelper, dataTypeResource, $filter, iconHelper, $q) { function link(scope, el, attr, ctrl) { diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 4b1ed8f9c1..a59bc83ccb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -7,6 +7,15 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { return { + getCount: function () { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "contentTypeApiBaseUrl", + "GetCount")), + 'Failed to retrieve count'); + }, + getAvailableCompositeContentTypes: function (contentTypeId) { return umbRequestHelper.resourcePromise( $http.get( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js index 555889e5a3..39315c6074 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js @@ -7,6 +7,15 @@ function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { return { + getCount: function () { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "mediaTypeApiBaseUrl", + "GetCount")), + 'Failed to retrieve count'); + }, + getAvailableCompositeContentTypes: function (contentTypeId) { return umbRequestHelper.resourcePromise( $http.get( diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html index f6723a22c0..c9ca6695a6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html @@ -15,19 +15,19 @@
    There are no content types available to use as a composition. This content type is used in a composition, and therefore cannot be composed itself.
      -
    • +
    • _propertyEditorResolver; - private readonly Lazy _contentTypeService; //default ctor public ContentTypeModelMapper() { _propertyEditorResolver = new Lazy(() => PropertyEditorResolver.Current); - _contentTypeService = new Lazy(() => ApplicationContext.Current.Services.ContentTypeService); } //ctor can be used for testing - public ContentTypeModelMapper(Lazy propertyEditorResolver, Lazy contentTypeService) + public ContentTypeModelMapper(Lazy propertyEditorResolver) { - _propertyEditorResolver = propertyEditorResolver; - _contentTypeService = contentTypeService; + _propertyEditorResolver = propertyEditorResolver; } public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) @@ -118,7 +115,6 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore()) .ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore()) .ForMember(display => display.Notifications, expression => expression.Ignore()) - .ForMember(x => x.FirstContentType, exp => exp.ResolveUsing(new FirstContentTypeResolver(_contentTypeService))) .AfterMap((source, dest) => { //sync templates @@ -181,7 +177,6 @@ namespace Umbraco.Web.Models.Mapping .MapBaseContentTypeSaveToDisplay() .ForMember(dto => dto.AllowedTemplates, expression => expression.Ignore()) .ForMember(dto => dto.DefaultTemplate, expression => expression.Ignore()) - .ForMember(dto => dto.FirstContentType, exp => exp.Ignore()) .AfterMap((source, dest) => { //sync templates diff --git a/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs b/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs deleted file mode 100644 index 406c5e2681..0000000000 --- a/src/Umbraco.Web/Models/Mapping/FirstContentTypeResolver.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Linq; -using AutoMapper; -using Umbraco.Core.Models; -using Umbraco.Core.Services; - -namespace Umbraco.Web.Models.Mapping -{ - internal class FirstContentTypeResolver : ValueResolver - { - private readonly Lazy _contentTypeService; - - public FirstContentTypeResolver(Lazy contentTypeService) - { - _contentTypeService = contentTypeService; - } - - protected override bool ResolveCore(IContentType source) - { - var contentTypes = _contentTypeService.Value.GetAllContentTypes(); - return contentTypes.Any() == false; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 30100d78f6..89780c9aae 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -309,7 +309,6 @@ - From e17c900beb964ab551813a2eb37677cc2f5f417e Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 11 Jan 2016 17:21:59 +0100 Subject: [PATCH 6/7] fixes merge/rebase with latest other pr merge --- .../components/umbgroupsbuilder.directive.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js index 2a54f57a6c..3ab653a3c3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js @@ -155,7 +155,6 @@ scope.compositionsDialogModel = { title: "Compositions", contentType: scope.model, - availableCompositeContentTypes: scope.model.availableCompositeContentTypes, compositeContentTypes: scope.model.compositeContentTypes, view: "views/common/overlays/contenttypeeditor/compositions/compositions.html", confirmSubmit: { @@ -164,7 +163,6 @@ checkboxLabel: "I know what I'm doing", enable: true }, - show: true, submit: function(model, oldModel, confirmed) { var compositionRemoved = false; @@ -242,6 +240,24 @@ } }; + var availableContentTypeResource = scope.contentType === "documentType" ? contentTypeResource.getAvailableCompositeContentTypes : mediaTypeResource.getAvailableCompositeContentTypes; + var countContentTypeResource = scope.contentType === "documentType" ? contentTypeResource.getCount : mediaTypeResource.getCount; + $q.all([ + //get available composite types + availableContentTypeResource(scope.model.id).then(function (result) { + scope.compositionsDialogModel.availableCompositeContentTypes = result; + // convert icons for composite content types + iconHelper.formatContentTypeIcons(scope.compositionsDialogModel.availableCompositeContentTypes); + }), + //get content type count + countContentTypeResource().then(function (result) { + scope.compositionsDialogModel.totalContentTypes = result; + }) + ]).then(function () { + //resolves when both other promises are done, now show it + scope.compositionsDialogModel.show = true; + }); + }; From bbd6908af344142503a6526d2193fb7e4648b75f Mon Sep 17 00:00:00 2001 From: Claus Date: Tue, 12 Jan 2016 13:06:33 +0100 Subject: [PATCH 7/7] Ensuring you can create new document types in root. Parsing result of webservice call as integer. Ensuring the correct error messages are shown. --- .../Services/ContentTypeServiceExtensions.cs | 17 +++++++++-------- .../components/umbgroupsbuilder.directive.js | 2 +- .../compositions/compositions.html | 7 +++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs b/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs index 6b440c6b2c..d16e7946b9 100644 --- a/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs +++ b/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs @@ -15,8 +15,6 @@ namespace Umbraco.Core.Services IContentTypeComposition source, IContentTypeComposition[] allContentTypes) { - - if (source == null) throw new ArgumentNullException("source"); //below is all ported from the old doc type editor and comes with the same weaknesses /insanity / magic // note: there are many sanity checks missing here and there ;-(( @@ -24,12 +22,15 @@ namespace Umbraco.Core.Services //if (allContentTypes.Any(x => x.ParentId > 0 && x.ContentTypeComposition.Any(y => y.Id == x.ParentId) == false)) // throw new Exception("A parent does not belong to a composition."); - // find out if any content type uses this content type - var isUsing = allContentTypes.Where(x => x.ContentTypeComposition.Any(y => y.Id == source.Id)).ToArray(); - if (isUsing.Length > 0) + if (source != null) { - //if already in use a composition, do not allow any composited types - return new List(); + // find out if any content type uses this content type + var isUsing = allContentTypes.Where(x => x.ContentTypeComposition.Any(y => y.Id == source.Id)).ToArray(); + if (isUsing.Length > 0) + { + //if already in use a composition, do not allow any composited types + return new List(); + } } // if it is not used then composition is possible @@ -61,7 +62,7 @@ namespace Umbraco.Core.Services // .ToArray(); return list - .Where(x => x.Id != source.Id) + .Where(x => x.Id != (source != null ? source.Id : 0)) .OrderBy(x => x.Name) .ToList(); } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js index 3ab653a3c3..c8ea32110e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js @@ -251,7 +251,7 @@ }), //get content type count countContentTypeResource().then(function (result) { - scope.compositionsDialogModel.totalContentTypes = result; + scope.compositionsDialogModel.totalContentTypes = parseInt(result, 10); }) ]).then(function () { //resolves when both other promises are done, now show it diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html index c9ca6695a6..2cdcef5ee6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html @@ -15,13 +15,12 @@
      There are no content types available to use as a composition. - This content type is used in a composition, and therefore cannot be composed itself. @@ -42,4 +41,4 @@
  • -
+ \ No newline at end of file