Don't allow selecting non-element types when composing element types

This commit is contained in:
Kenn Jacobsen
2019-08-16 13:13:22 +02:00
committed by Sebastiaan Janssen
parent a7f1001c53
commit 604bb6b526
8 changed files with 23 additions and 12 deletions

View File

@@ -37,12 +37,14 @@ namespace Umbraco.Core.Services
/// This is required because in the case of creating/modifying a content type because new property types being added to it are not yet persisted so cannot
/// be looked up via the db, they need to be passed in.
/// </param>
/// <param name="isElement">Wether the composite content types should be applicable for an element type</param>
/// <returns></returns>
internal static ContentTypeAvailableCompositionsResults GetAvailableCompositeContentTypes(this IContentTypeService ctService,
IContentTypeComposition source,
IContentTypeComposition[] allContentTypes,
string[] filterContentTypes = null,
string[] filterPropertyTypes = null)
string[] filterPropertyTypes = null,
bool isElement = false)
{
filterContentTypes = filterContentTypes == null
? Array.Empty<string>()
@@ -61,7 +63,7 @@ namespace Umbraco.Core.Services
.Select(c => c.Alias)
.Union(filterPropertyTypes)
.ToArray();
var sourceId = source?.Id ?? 0;
// find out if any content type uses this content type
@@ -79,8 +81,9 @@ namespace Umbraco.Core.Services
x => x.Id));
// usable types are those that are top-level
// do not allow element types to be composed by non-element types as this will break the model generation in ModelsBuilder
var usableContentTypes = allContentTypes
.Where(x => x.ContentTypeComposition.Any() == false).ToArray();
.Where(x => x.ContentTypeComposition.Any() == false && (isElement == false || x.IsElement)).ToArray();
foreach (var x in usableContentTypes)
list.Add(x);

View File

@@ -257,7 +257,7 @@
view: "views/common/infiniteeditors/compositions/compositions.html",
size: "small",
submit: function() {
// make sure that all tabs has an init property
if (scope.model.groups.length !== 0) {
angular.forEach(scope.model.groups, function(group) {
@@ -341,7 +341,7 @@
scope.compositionsButtonState = "busy";
$q.all([
//get available composite types
availableContentTypeResource(scope.model.id, [], propAliasesExisting).then(function (result) {
availableContentTypeResource(scope.model.id, [], propAliasesExisting, scope.model.isElement).then(function (result) {
setupAvailableContentTypesModel(result);
}),
//get where used document types

View File

@@ -16,7 +16,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca
'Failed to retrieve count');
},
getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes, isElement) {
if (!filterContentTypes) {
filterContentTypes = [];
}
@@ -27,7 +27,8 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca
var query = {
contentTypeId: contentTypeId,
filterContentTypes: filterContentTypes,
filterPropertyTypes: filterPropertyTypes
filterPropertyTypes: filterPropertyTypes,
isElement: isElement
};
return umbRequestHelper.resourcePromise(

View File

@@ -132,7 +132,7 @@ namespace Umbraco.Web.Editors
[HttpPost]
public HttpResponseMessage GetAvailableCompositeContentTypes(GetAvailableCompositionsFilter filter)
{
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.DocumentType, filter.FilterContentTypes, filter.FilterPropertyTypes)
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.DocumentType, filter.FilterContentTypes, filter.FilterPropertyTypes, filter.IsElement)
.Select(x => new
{
contentType = x.Item1,

View File

@@ -53,11 +53,13 @@ namespace Umbraco.Web.Editors
/// be looked up via the db, they need to be passed in.
/// </param>
/// <param name="contentTypeId"></param>
/// <param name="isElement">Wether the composite content types should be applicable for an element type</param>
/// <returns></returns>
protected IEnumerable<Tuple<EntityBasic, bool>> PerformGetAvailableCompositeContentTypes(int contentTypeId,
UmbracoObjectTypes type,
string[] filterContentTypes,
string[] filterPropertyTypes)
string[] filterPropertyTypes,
bool isElement)
{
IContentTypeComposition source = null;
@@ -98,7 +100,7 @@ namespace Umbraco.Web.Editors
throw new ArgumentOutOfRangeException("The entity type was not a content type");
}
var availableCompositions = Services.ContentTypeService.GetAvailableCompositeContentTypes(source, allContentTypes, filterContentTypes, filterPropertyTypes);
var availableCompositions = Services.ContentTypeService.GetAvailableCompositeContentTypes(source, allContentTypes, filterContentTypes, filterPropertyTypes, isElement);

View File

@@ -110,7 +110,7 @@ namespace Umbraco.Web.Editors
[HttpPost]
public HttpResponseMessage GetAvailableCompositeMediaTypes(GetAvailableCompositionsFilter filter)
{
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.MediaType, filter.FilterContentTypes, filter.FilterPropertyTypes)
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.MediaType, filter.FilterContentTypes, filter.FilterPropertyTypes, filter.IsElement)
.Select(x => new
{
contentType = x.Item1,

View File

@@ -89,7 +89,7 @@ namespace Umbraco.Web.Editors
[FromUri]string[] filterContentTypes,
[FromUri]string[] filterPropertyTypes)
{
var result = PerformGetAvailableCompositeContentTypes(contentTypeId, UmbracoObjectTypes.MemberType, filterContentTypes, filterPropertyTypes)
var result = PerformGetAvailableCompositeContentTypes(contentTypeId, UmbracoObjectTypes.MemberType, filterContentTypes, filterPropertyTypes, false)
.Select(x => new
{
contentType = x.Item1,

View File

@@ -16,5 +16,10 @@
/// along with any content types that have matching property types that are included in the filtered content types
/// </summary>
public string[] FilterContentTypes { get; set; }
/// <summary>
/// Wether the content type is currently marked as an element type
/// </summary>
public bool IsElement { get; set; }
}
}