using System; using System.ComponentModel; using System.Linq; using Comal.Classes; using InABox.Clients; using InABox.Core; namespace comal.timesheets { public abstract class SingleDataModel : CoreDataModel, ISingleDataModel where TEntity : Entity, IRemotable, IPersistent, new() where TItem : SingleDataModelItem, new() { private TItem _item; public TItem Item { get => _item; set => SetProperty(ref _item, value); } public virtual void BeforeLoad(MultiQuery query, Guid id) { } public virtual void AfterLoad(MultiQuery query, Guid id) { } private TItem CreateItem(TEntity entity) { CoreTable table = new CoreTable(); table.LoadColumns(Columns); CoreRow row = table.NewRow(); if (entity != null) table.LoadRow(row, entity); return new TItem() { Row = row, Parent = this }; } public void Load(TEntity entity, Action loaded = null) { MultiQuery query = new MultiQuery(); BeforeLoad(query, entity.ID); Item = CreateItem(entity); Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args); if (query.Count > 0) { query.Query( (q) => { AfterLoad(q, entity.ID); loaded?.Invoke(); }); } else { AfterLoad(query, entity.ID); loaded?.Invoke(); } } public void Load(Guid id, Action loaded = null) { MultiQuery query = new MultiQuery(); query.Add( new Filter(x=>x.ID).IsEqualTo(id), Columns ); BeforeLoad(query, id); query.Query( (q) => { var row = q.Get().Rows.FirstOrDefault(); Item = (row != null) ? new TItem() { Row = row, Parent = this } : CreateItem(null); Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args); AfterLoad(q, id); loaded?.Invoke(); }); } protected virtual void BeforeSave(TItem item) { } protected virtual void AfterSave(TItem item) { } public void Save(String auditmessage) { BeforeSave(Item); new Client().Save(Item.Entity,auditmessage); AfterSave(Item); } } }