using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace InABox.Core { public enum DFLayoutLookupDisplayType { Button = 0, Combo = 1, } public class DFLayoutLookupFieldProperties : DFLayoutFieldProperties { [DoNotSerialize] [NullEditor] public List AdditionalPropertiesList = new List(); [ComboLookupEditor(typeof(PropertyClassLookups))] [EditorSequence(100)] public string LookupType { get; set; } = ""; // A JSON-serialized Filter for filtering entries in the lookup editor [FilterEditor] [EditorSequence(101)] public string Filter { get; set; } = ""; /// /// A list of comma-separated property names to also pull with the lookup. /// //[TextBoxEditor(ToolTip = "A comma-separated list of property names.")] [MultiLookupEditor(typeof(AdditionalPropertyLookupGenerator))] [EditorSequence(102)] public string AdditionalProperties { get => string.Join(',', AdditionalPropertiesList); set { AdditionalPropertiesList = value.Split(',').ToList(); } } [EnumLookupEditor(typeof(DFLayoutLookupDisplayType))] [EditorSequence(103)] public DFLayoutLookupDisplayType DisplayType { get; set; } public DFLayoutLookupFieldProperties() { DisplayType = DFLayoutLookupDisplayType.Button; } public override string FormatValue(object? value) { return value?.ToString() ?? ""; } public override object? ParseValue(object? value) { return value?.ToString(); } public override IEnumerable GetAdditionalColumns() { if(!CoreUtils.TryGetEntity(LookupType, out var entity)) return Enumerable.Empty(); return AdditionalPropertiesList.Select(x => { if (CoreUtils.TryGetProperty(entity, x, out var property)) return new CoreColumn { ColumnName = $"{Code}.{x}", DataType = property.PropertyType }; return null; }).Where(x => x != null).Cast(); } protected override void LoadProperties() { base.LoadProperties(); LookupType = GetProperty(nameof(LookupType), ""); Filter = GetProperty(nameof(Filter), ""); AdditionalProperties = GetProperty(nameof(AdditionalProperties), ""); DisplayType = GetProperty(nameof(DisplayType), DFLayoutLookupDisplayType.Button); } protected override void SaveProperties() { base.SaveProperties(); SetProperty(nameof(LookupType), LookupType); SetProperty(nameof(Filter), Filter); SetProperty(nameof(AdditionalProperties), AdditionalProperties); SetProperty(nameof(DisplayType),DisplayType); } private class AdditionalPropertyLookupGenerator : LookupGenerator { public AdditionalPropertyLookupGenerator(object[] items) : base(items) { } protected override void DoGenerateLookups() { if (!(Items?.FirstOrDefault() is DFLayoutLookupFieldProperties properties)) return; if (!CoreUtils.TryGetEntity(properties.LookupType, out var type)) return; var props = CoreUtils.PropertyList(type, x => x.GetCustomAttribute() == null, true).Keys.ToList(); props.Sort(); foreach (var prop in props) { AddValue(prop, prop); } } } } }