Don't allow selecting non-element types when composing element types
This commit is contained in:
committed by
Sebastiaan Janssen
parent
a7f1001c53
commit
604bb6b526
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user