diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umb-block-list-property-editor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umb-block-list-property-editor.html index fb94a00631..aa16e6e9a8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umb-block-list-property-editor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umb-block-list-property-editor.html @@ -8,13 +8,11 @@
- @@ -26,28 +24,29 @@
- - - + + +
Minimum %0% entries, needs %1% more.
+ >
-
-
+
+
Maximum %0% entries, %1% too many.
+
diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs index 9536d08439..a9dcd6b68b 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs @@ -2,7 +2,9 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Web.Razor.Parser.SyntaxTree; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -59,6 +61,7 @@ namespace Umbraco.Web.PropertyEditors _logger = logger; _blockEditorValues = new BlockEditorValues(new BlockListEditorDataConverter(), contentTypeService, _logger); Validators.Add(new BlockEditorValidator(_blockEditorValues, propertyEditors, dataTypeService, textService)); + Validators.Add(new MinMaxValidator(_blockEditorValues, textService)); } public IEnumerable GetReferences(object value) @@ -221,6 +224,41 @@ namespace Umbraco.Web.PropertyEditors #endregion } + /// + /// Validates the min/max of the block editor + /// + private class MinMaxValidator : IValueValidator + { + private readonly BlockEditorValues _blockEditorValues; + private readonly ILocalizedTextService _textService; + + public MinMaxValidator(BlockEditorValues blockEditorValues, ILocalizedTextService textService) + { + _blockEditorValues = blockEditorValues; + _textService = textService; + } + + public IEnumerable Validate(object value, string valueType, object dataTypeConfiguration) + { + var blockConfig = (BlockListConfiguration)dataTypeConfiguration; + var blockEditorData = _blockEditorValues.DeserializeAndClean(value); + if ((blockEditorData == null && blockConfig?.ValidationLimit?.Min > 0) + || (blockEditorData != null && blockEditorData.Layout.Count() < blockConfig?.ValidationLimit?.Min)) + { + yield return new ValidationResult( + _textService.Localize("validation/entriesShort", new[] { blockConfig.ValidationLimit.Min.ToString(), (blockConfig.ValidationLimit.Min - blockEditorData.Layout.Count()).ToString() }), + new[] { "minCount" }); + } + + if (blockEditorData != null && blockEditorData.Layout.Count() > blockConfig?.ValidationLimit?.Max) + { + yield return new ValidationResult( + _textService.Localize("validation/entriesExceed", new[] { blockConfig.ValidationLimit.Max.ToString(), (blockEditorData.Layout.Count() - blockConfig.ValidationLimit.Max).ToString() }), + new[] { "maxCount" }); + } + } + } + internal class BlockEditorValidator : ComplexEditorValidator { private readonly BlockEditorValues _blockEditorValues;