diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
index 439720e461..dab6cb8eda 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
@@ -37,7 +37,7 @@
var saveModel = _.pick(displayModel,
'compositeContentTypes', 'isContainer', 'allowAsRoot', 'allowedTemplates', 'allowedContentTypes',
'alias', 'description', 'thumbnail', 'name', 'id', 'icon', 'trashed',
- 'key', 'parentId', 'alias', 'path');
+ 'key', 'parentId', 'alias', 'path', 'allowCultureVariant');
//TODO: Map these
saveModel.allowedTemplates = _.map(displayModel.allowedTemplates, function (t) { return t.alias; });
diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/views/permissions/permissions.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/views/permissions/permissions.html
index d9c7d185da..7df2577871 100644
--- a/src/Umbraco.Web.UI.Client/src/views/documenttypes/views/permissions/permissions.html
+++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/views/permissions/permissions.html
@@ -7,7 +7,7 @@
-
-
+
-
+
+
+
+
+
Content Type Variation
+ Define the rules for how this content type's properties can be varied
+
+
+
+
+ Allow varying by Culture
+
+
+
+
+
diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentTypeSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentTypeSave.cs
index 3f3efa15d8..c2ec70d3dc 100644
--- a/src/Umbraco.Web/Models/ContentEditing/ContentTypeSave.cs
+++ b/src/Umbraco.Web/Models/ContentEditing/ContentTypeSave.cs
@@ -57,6 +57,15 @@ namespace Umbraco.Web.Models.ContentEditing
Groups = new List>();
}
+ ///
+ /// A rule for defining how a content type can be varied
+ ///
+ ///
+ /// This is only supported on document types right now but in the future it could be media types too
+ ///
+ [DataMember(Name = "allowCultureVariant")]
+ public bool AllowCultureVariant { get; set; }
+
//Tabs
[DataMember(Name = "groups")]
public IEnumerable> Groups { get; set; }
diff --git a/src/Umbraco.Web/Models/ContentEditing/DocumentTypeDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/DocumentTypeDisplay.cs
index 7965b90ae0..6b82f74ca7 100644
--- a/src/Umbraco.Web/Models/ContentEditing/DocumentTypeDisplay.cs
+++ b/src/Umbraco.Web/Models/ContentEditing/DocumentTypeDisplay.cs
@@ -20,6 +20,9 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "defaultTemplate")]
public EntityBasic DefaultTemplate { get; set; }
+
+ [DataMember(Name = "allowCultureVariant")]
+ public bool AllowCultureVariant { get; set; }
}
}
diff --git a/src/Umbraco.Web/Models/ContentEditing/DocumentTypeSave.cs b/src/Umbraco.Web/Models/ContentEditing/DocumentTypeSave.cs
index 3f163f860f..21164b493b 100644
--- a/src/Umbraco.Web/Models/ContentEditing/DocumentTypeSave.cs
+++ b/src/Umbraco.Web/Models/ContentEditing/DocumentTypeSave.cs
@@ -31,7 +31,7 @@ namespace Umbraco.Web.Models.ContentEditing
///
public override IEnumerable Validate(ValidationContext validationContext)
{
- if (AllowedTemplates.Any(x => StringExtensions.IsNullOrWhiteSpace(x)))
+ if (AllowedTemplates.Any(x => x.IsNullOrWhiteSpace()))
yield return new ValidationResult("Template value cannot be null", new[] { "AllowedTemplates" });
foreach (var v in base.Validate(validationContext))
diff --git a/src/Umbraco.Web/Models/Mapping/VariationResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs
similarity index 90%
rename from src/Umbraco.Web/Models/Mapping/VariationResolver.cs
rename to src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs
index 9d3de07d77..3d7890a152 100644
--- a/src/Umbraco.Web/Models/Mapping/VariationResolver.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs
@@ -10,11 +10,11 @@ using Language = Umbraco.Web.Models.ContentEditing.Language;
namespace Umbraco.Web.Models.Mapping
{
- internal class VariationResolver : IValueResolver>
+ internal class ContentItemDisplayVariationResolver : IValueResolver>
{
private readonly ILocalizationService _localizationService;
- public VariationResolver(ILocalizationService localizationService)
+ public ContentItemDisplayVariationResolver(ILocalizationService localizationService)
{
_localizationService = localizationService ?? throw new ArgumentNullException(nameof(localizationService));
}
diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
index 6791afb921..9aa6495492 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs
@@ -25,7 +25,7 @@ namespace Umbraco.Web.Models.Mapping
var contentTreeNodeUrlResolver = new ContentTreeNodeUrlResolver();
var defaultTemplateResolver = new DefaultTemplateResolver();
var contentUrlResolver = new ContentUrlResolver();
- var variantResolver = new VariationResolver(localizationService);
+ var variantResolver = new ContentItemDisplayVariationResolver(localizationService);
//FROM IContent TO ContentItemDisplay
CreateMap()
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
index c9e9554b93..bba27ce3f1 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapperProfile.cs
@@ -6,6 +6,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Core.Services;
+using ContentVariation = Umbraco.Core.Models.ContentVariation;
namespace Umbraco.Web.Models.Mapping
{
@@ -26,7 +27,7 @@ namespace Umbraco.Web.Models.Mapping
{
dest.AllowedTemplates = source.AllowedTemplates
.Where(x => x != null)
- .Select(s => fileService.GetTemplate(s))
+ .Select(fileService.GetTemplate)
.ToArray();
if (source.DefaultTemplate != null)
@@ -111,6 +112,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dto => dto.AllowedTemplates, opt => opt.Ignore())
.ForMember(dto => dto.DefaultTemplate, opt => opt.Ignore())
.ForMember(display => display.Notifications, opt => opt.Ignore())
+ .ForMember(display => display.AllowCultureVariant, opt => opt.MapFrom(type => type.Variations.HasFlag(ContentVariation.CultureNeutral)))
.AfterMap((source, dest) =>
{
//sync templates
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
index d67eaf8ea2..72842c5354 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeProfileExtensions.cs
@@ -181,7 +181,7 @@ namespace Umbraco.Web.Models.Mapping
// ignore, composition is managed in AfterMapContentTypeSaveToEntity
.ForMember(dest => dest.ContentTypeComposition, opt => opt.Ignore())
- .ForMember(dto => dto.Variations, opt => opt.Ignore()) // fixme - change when UI supports it!
+ .ForMember(dto => dto.Variations, opt => opt.ResolveUsing>())
.ForMember(
dest => dest.AllowedContentTypes,
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeVariationsResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeVariationsResolver.cs
new file mode 100644
index 0000000000..fcfe9a47cc
--- /dev/null
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeVariationsResolver.cs
@@ -0,0 +1,26 @@
+using AutoMapper;
+using Umbraco.Core.Models;
+using Umbraco.Web.Models.ContentEditing;
+using ContentVariation = Umbraco.Core.Models.ContentVariation;
+
+namespace Umbraco.Web.Models.Mapping
+{
+ internal class ContentTypeVariationsResolver : IValueResolver
+ where TSource : ContentTypeSave
+ where TDestination : IContentTypeComposition
+ where TSourcePropertyType : PropertyTypeBasic
+ {
+ public ContentVariation Resolve(TSource source, TDestination destination, ContentVariation destMember, ResolutionContext context)
+ {
+ //this will always be the case, a content type will always be allowed to be invariant
+ var result = ContentVariation.InvariantNeutral;
+
+ if (source.AllowCultureVariant)
+ {
+ result |= ContentVariation.CultureNeutral;
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 923078c0b7..160fc80751 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -238,6 +238,7 @@
+
@@ -259,7 +260,7 @@
-
+