// Copyright (c) Umbraco. // See LICENSE for more details. using System.ComponentModel.DataAnnotations; using Newtonsoft.Json.Linq; using Umbraco.Extensions; namespace Umbraco.Cms.Core.PropertyEditors; /// /// Represents a validator which ensures that all values in the list are unique. /// public class ValueListUniqueValueValidator : IValueValidator { public IEnumerable Validate(object? value, string? valueType, object? dataTypeConfiguration) { // the value we get should be a JArray // [ { "value": , "sortOrder": 1 }, { ... }, ... ] if (!(value is JArray json)) { yield break; } // we ensure that values are unique // (those are not empty - empty values are removed when persisting anyways) var groupedValues = json.OfType() .Where(x => x["value"] != null) .Select((x, index) => new { value = x["value"]?.ToString(), index }) .Where(x => x.value.IsNullOrWhiteSpace() == false) .GroupBy(x => x.value); foreach (var group in groupedValues.Where(x => x.Count() > 1)) { yield return new ValidationResult($"The value \"{group.Last().value}\" must be unique", new[] { // use the index number as server field so it can be wired up to the view "item_" + group.Last().index.ToInvariantString(), }); } } }