EquipmentListDataModel.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using Comal.Classes;
  6. using InABox.Core;
  7. using Xamarin.Forms;
  8. namespace comal.timesheets
  9. {
  10. public class EquipmentListDataModel : ListDataModel<Equipment, EquipmentListDataModelItem>
  11. {
  12. public override Columns<Equipment> Columns => new Columns<Equipment>(x => x.ID)
  13. .Add(x => x.Code)
  14. .Add(x => x.Description)
  15. .Add(x => x.GroupLink.ID)
  16. .Add(x => x.GroupLink.Description)
  17. .Add(x=>x.TrackerLink.BatteryLevel)
  18. .Add(x => x.GroupLink.Thumbnail.ID)
  19. .Add(x=>x.TrackerLink.Location.Timestamp);
  20. public EquipmentListDataModel() : base()
  21. {
  22. Images = new Dictionary<Guid, ImageSource>() { { Guid.Empty, null } };
  23. }
  24. public override void BeforeLoad(MultiQuery query, Filter<Equipment> filter)
  25. {
  26. base.BeforeLoad(query, filter);
  27. query.Add<Document>(
  28. //new Filter<Document>(x => x.ID).InQuery<Equipment>(filter, x => x.GroupLink.Thumbnail.ID),
  29. new Filter<Document>(x => x.ID).InQuery<Equipment>(filter, x => x.GroupLink.ID),
  30. new Columns<Document>(x => x.ID, x => x.Data)
  31. );
  32. }
  33. public String[] GroupNames => Items.Select(x => x.GroupName).Distinct().OrderBy(x => x).Prepend("All").ToArray();
  34. public Dictionary<Guid, ImageSource> Images { get; private set; }
  35. public override void AfterLoad(MultiQuery query, Filter<Equipment> filter)
  36. {
  37. base.AfterLoad(query, filter);
  38. Images.Clear();
  39. CoreTable docs = query.Get<Document>();
  40. foreach (var row in docs.Rows)
  41. {
  42. Guid imgid = row.Get<Document, Guid>(c => c.ID);
  43. byte[] imgdata = row.Get<Document, byte[]>(c => c.Data);
  44. ImageSource imgsource = ImageSource.FromStream(() => new MemoryStream(imgdata));
  45. Images[imgid] = imgsource;
  46. }
  47. }
  48. }
  49. public class EquipmentListDataModelItem : CoreDataModelItem
  50. {
  51. public Guid ID => Row.Get<Equipment, Guid>(x => x.ID);
  52. public string Code => Row.Get<Equipment, String>(x => x.Code);
  53. public string Description => Row.Get<Equipment, String>(x => x.Description);
  54. public Guid GroupID => Row.Get<Equipment, Guid>(x => x.GroupLink.ID);
  55. public string GroupName => Row.Get<Equipment, String>(x => x.GroupLink.Description);
  56. public double BatteryDouble => Row.Get<Equipment, double>(x => x.TrackerLink.BatteryLevel);
  57. public DateTime LastUpdate => Row.Get<Equipment, DateTime>(x => x.TrackerLink.Location.Timestamp);
  58. public ImageSource ImageSource
  59. {
  60. get
  61. {
  62. (Parent as EquipmentListDataModel).Images.TryGetValue(GroupID, out ImageSource img);
  63. return img;
  64. }
  65. }
  66. public double ColumnWidth => (Parent as EquipmentListDataModel).Images.Any() ? 55 : 0;
  67. public string Battery => $"Battery {BatteryDouble:F2}";
  68. public string BatteryLastUpdate => $"Last Update: {LastUpdate:dd MMM yy}";
  69. public Color LastUpdateColour => LastUpdate < DateTime.Today.AddMonths(-1)
  70. ? Color.FromHex("#f08080")
  71. : LastUpdate < DateTime.Today.AddDays(-14)
  72. ? Color.FromHex("#ffef00")
  73. : Color.LightGreen;
  74. public double BatteryRowHeight => BatteryDouble > 0 ? 25 : 0;
  75. public Color BatteryColour => BatteryDouble <= 40D
  76. ? Color.FromHex("#f08080")
  77. : BatteryDouble > 40D && BatteryDouble <= 70D
  78. ? Color.FromHex("#ffef00")
  79. : Color.LightGreen;
  80. }
  81. }