// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { public sealed class ArrayField : RootField, IArrayField { public IReadOnlyList Fields { get => FieldCollection.Ordered; } public IReadOnlyDictionary FieldsById { get => FieldCollection.ById; } public IReadOnlyDictionary FieldsByName { get => FieldCollection.ByName; } public FieldCollection FieldCollection { get; private set; } = FieldCollection.Empty; public ArrayField(long id, string name, Partitioning partitioning, ArrayFieldProperties? properties = null, IFieldSettings? settings = null) : base(id, name, partitioning, properties, settings) { } public ArrayField(long id, string name, Partitioning partitioning, NestedField[] fields, ArrayFieldProperties? properties = null, IFieldSettings? settings = null) : this(id, name, partitioning, properties, settings) { FieldCollection = new FieldCollection(fields); } [Pure] public ArrayField DeleteField(long fieldId) { return Updatefields(f => f.Remove(fieldId)); } [Pure] public ArrayField ReorderFields(List ids) { return Updatefields(f => f.Reorder(ids)); } [Pure] public ArrayField AddField(NestedField field) { return Updatefields(f => f.Add(field)); } [Pure] public ArrayField UpdateField(long fieldId, Func updater) { return Updatefields(f => f.Update(fieldId, updater)); } private ArrayField Updatefields(Func, FieldCollection> updater) { var newFields = updater(FieldCollection); if (ReferenceEquals(newFields, FieldCollection)) { return this; } return (ArrayField)Clone(clone => { ((ArrayField)clone).FieldCollection = newFields; }); } } }