using System; using System.Linq; using InABox.Clients; using InABox.Core; using InABox.Mobile; using Xamarin.Forms; namespace PRS.Mobile { public abstract class DigitalFormLookupView : ContentView, IDigitalFormField { private DFLayoutLookupField? _definition; public DFLayoutLookupField? Definition { get => _definition; set { _definition = value; Initialize(value ?? new DFLayoutLookupField()); } } protected DFLayoutLookupValue _value; public Guid Value { get => _value.ID; set =>_value.ID = value; } public void Deserialize(DFLoadStorageEntry entry) { _value = Definition?.Properties.DeserializeValue(entry) ?? new DFLayoutLookupValue(); UpdateUI(); } public void Serialize(DFSaveStorageEntry entry) => Definition?.Properties.SerializeValue(entry, _value); public bool IsEmpty => Value == Guid.Empty; protected abstract void UpdateUI(); private bool _readOnly; public bool ReadOnly { get => _readOnly; set { _readOnly = value; UpdateStatus(); } } public object? OtherValue(String property) { if (_value.Values.TryGetValue(property, out object? result)) return result; return null; } public event DigitalFormViewChangedHandler? ValueChanged; protected DigitalFormLookupView() { _value = new DFLayoutLookupValue(); } public void DoLookup(Guid id) { if (Definition == null) return; var lookupType = CoreUtils.GetEntity(Definition.Properties.LookupType); var filter = Filter.Create(lookupType, "ID").IsEqualTo(id); var columns = Columns.Create(lookupType, ColumnTypeFlags.None) .Add("ID") .Add(Definition.Properties.Property) .Add(Definition.Properties.AdditionalPropertiesList) .Add(LookupFactory.DefineColumns(lookupType).ColumnNames()); var row = Client.Create(lookupType).Query(filter, columns).Rows.FirstOrDefault(); if (row == null) return; _value.ID = row.Get("ID"); _value.Text = LookupFactory.FormatLookup(lookupType, row.ToDictionary(), new[] { "ID" }); _value.Values = row.ToDictionary(); UpdateUI(); } protected void DoLookup(object sender, MobileButtonClickEventArgs args) { if (Definition == null) return; var entityType = CoreUtils.GetEntity(Definition.Properties.LookupType); var modeltype = typeof(SelectionViewModel<>).MakeGenericType(entityType); var model = (ISelectionViewModel)Activator.CreateInstance(modeltype); if (!String.IsNullOrWhiteSpace(Definition.Properties.Filter)) { var filtertype = typeof(Filter<>).MakeGenericType(entityType); model.Filter = Serialization.Deserialize(filtertype, Definition.Properties.Filter) as IFilter; } foreach (var additionalcolumn in Definition.Properties.AdditionalPropertiesList) model.VisibleColumns.Add(additionalcolumn); model.VisibleColumns.Add(Definition.Properties.Property); GenericSelectionPage _selector = new GenericSelectionPage("Select Value", model); _selector.OnItemSelected += (o,e) => { _value.ID = e.Row.Get("ID"); _value.Text = e.Formatted; _value.Values = e.Row.ToDictionary(); UpdateUI(); var field = Definition.Properties.Property.Split('.').Last(); var value = e.Row[field]; ValueChanged?.Invoke(this, new DigitalFormViewChangedArgs(Definition,value)); }; Navigation.PushAsync(_selector); } private void Initialize(DFLayoutLookupField definition) { UpdateStatus(); } protected abstract void UpdateStatus(); } }