DynamicManyToManyDataGrid.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Threading;
  6. using InABox.Clients;
  7. using InABox.Core;
  8. namespace InABox.DynamicGrid
  9. {
  10. public class DynamicManyToManyDataGrid<TManyToMany, TThis> : DynamicManyToManyGrid<TManyToMany, TThis>
  11. where TManyToMany : Entity, IPersistent, IRemotable, new() where TThis : Entity, IRemotable, IPersistent, new()
  12. {
  13. private readonly PropertyInfo prop;
  14. public DynamicManyToManyDataGrid()
  15. {
  16. prop = CoreUtils.PropertyList(typeof(TManyToMany), p => p.PropertyType.IsSubclassOf(typeof(EntityLink<TThis>))).FirstOrDefault()
  17. ?? throw new Exception($"No EntityLink property to link entities for DynamicManyToManyGrid<{typeof(TManyToMany)},{typeof(TThis)}>");
  18. }
  19. public Guid ID { get; set; }
  20. protected override Guid[] CurrentGuids()
  21. {
  22. var result = new List<Guid>();
  23. foreach (var row in Data.Rows)
  24. {
  25. var guid = row.Get<Guid>(otherproperty.Name + ".ID");
  26. result.Add(guid);
  27. }
  28. return result.ToArray();
  29. }
  30. public override TManyToMany CreateItem()
  31. {
  32. var result = base.CreateItem();
  33. var link = prop.GetValue(result) as IEntityLink;
  34. if (link is null)
  35. throw new Exception($"Property {prop.Name} of {typeof(TManyToMany)} is null");
  36. link.ID = ID;
  37. return result;
  38. }
  39. protected override void Reload(
  40. Filters<TManyToMany> criteria, Columns<TManyToMany> columns, ref SortOrder<TManyToMany>? sort,
  41. CancellationToken token, Action<CoreTable?, Exception?> action)
  42. {
  43. var expr = CoreUtils.CreateLambdaExpression<TManyToMany>(prop.Name + ".ID");
  44. criteria.Add(new Filter<TManyToMany>(expr).IsEqualTo(ID));
  45. Client.Query(criteria.Combine(), columns, sort, null, action);
  46. }
  47. public override TManyToMany LoadItem(CoreRow row)
  48. {
  49. var id = row.Get<TManyToMany, Guid>(x => x.ID);
  50. return Client
  51. .Query(
  52. new Filter<TManyToMany>(x => x.ID).IsEqualTo(id),
  53. DynamicGridUtils.LoadEditorColumns(DataColumns()))
  54. .ToObjects<TManyToMany>().FirstOrDefault() ?? throw new Exception($"{typeof(TManyToMany)} with ID {id} does not exist!");
  55. }
  56. public override void DeleteItems(params CoreRow[] rows)
  57. {
  58. var items = LoadItems(rows);
  59. foreach (var item in items)
  60. Client.Delete(item, "");
  61. }
  62. public override void SaveItem(TManyToMany item)
  63. {
  64. Client.Save(item, "");
  65. }
  66. }
  67. }