DynamicDashboardDataComponent.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using InABox.Clients;
  2. using InABox.Core;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics.CodeAnalysis;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace InABox.Wpf.Dashboard;
  10. public interface IDynamicDashboardDataQuery
  11. {
  12. Type Type { get; }
  13. string Key { get; set; }
  14. IFilter? Filter { get; set; }
  15. IColumns Columns { get; set; }
  16. ISortOrder? SortOrder { get; set; }
  17. }
  18. public class DynamicDashboardDataQuery<T> : IDynamicDashboardDataQuery
  19. where T : Entity, IRemotable, new()
  20. {
  21. public string Key { get; set; } = typeof(T).Name;
  22. public Filter<T>? Filter { get; set; }
  23. public Columns<T> Columns { get; set; } = Core.Columns.None<T>();
  24. public SortOrder<T>? SortOrder { get; set; } = null;
  25. #region IDynamicDashboardDataQuery
  26. Type IDynamicDashboardDataQuery.Type => typeof(T);
  27. IFilter? IDynamicDashboardDataQuery.Filter
  28. {
  29. get => Filter;
  30. set => Filter = value as Filter<T>;
  31. }
  32. IColumns IDynamicDashboardDataQuery.Columns
  33. {
  34. get => Columns;
  35. set => Columns = (value as Columns<T>) ?? Core.Columns.None<T>();
  36. }
  37. ISortOrder? IDynamicDashboardDataQuery.SortOrder
  38. {
  39. get => SortOrder;
  40. set => SortOrder = value as SortOrder<T>;
  41. }
  42. #endregion
  43. }
  44. public class DynamicDashboardDataComponent
  45. {
  46. public List<IDynamicDashboardDataQuery> Queries { get; set; } = new();
  47. public IDynamicDashboardDataQuery GetQuery(string key)
  48. {
  49. return Queries.FirstOrDefault(x => x.Key == key)
  50. ?? throw new KeyNotFoundException($"Data query '{key}' does not exist.");
  51. }
  52. public bool TryGetQuery(string key, [NotNullWhen(true)] out IDynamicDashboardDataQuery? query)
  53. {
  54. query = Queries.FirstOrDefault(x => x.Key == key);
  55. return query != null;
  56. }
  57. public DynamicDashboardData RunQuery(int? maxRecords = null)
  58. {
  59. var range = maxRecords.HasValue ? CoreRange.Database(maxRecords.Value) : null;
  60. var queryDefs = Queries.Select(x => new KeyedQueryDef(x.Key, x.Type, x.Filter, x.Columns, x.SortOrder, range));
  61. var results = Client.QueryMultiple(queryDefs);
  62. return new DynamicDashboardData(results.Results);
  63. }
  64. public async Task<DynamicDashboardData> RunQueryAsync(int? maxRecords = null)
  65. {
  66. var range = maxRecords.HasValue ? CoreRange.Database(maxRecords.Value) : null;
  67. var queryDefs = Queries.Select(x => new KeyedQueryDef(x.Key, x.Type, x.Filter, x.Columns, x.SortOrder, range));
  68. var results = await Client.QueryMultipleAsync(queryDefs);
  69. return new DynamicDashboardData(results.Results);
  70. }
  71. }
  72. public class DynamicDashboardData(Dictionary<string, CoreTable> data)
  73. {
  74. public Dictionary<string, CoreTable> Data { get; set; } = data;
  75. public bool TryGetData(string key, [NotNullWhen(true)] out CoreTable? query)
  76. {
  77. return Data.TryGetValue(key, out query);
  78. }
  79. }