AbstractListCommand.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Quadarax.Foundation.Core.Data.Interface;
  6. using Quadarax.Foundation.Core.Data.Interface.Entity;
  7. using Quadarax.Foundation.Core.Object.Extensions;
  8. using Quadarax.Foundation.Core.QConsole;
  9. using Quadarax.Foundation.Core.QConsole.Argument;
  10. using Quadarax.Foundation.Core.QConsole.Value;
  11. using Quadarax.Foundation.Core.Value.Extensions;
  12. namespace BO.Console.Commands.Base
  13. {
  14. internal abstract class AbstractListCommand : BaseCommand
  15. {
  16. #region *** Constants ***
  17. private const string CS_ARG_NAME_NOPAGING = "nopg";
  18. private const string CS_ARG_HINT_NOPAGING = "<is_pg_disabled>";
  19. private const string CS_ARG_DESC_NOPAGING = "Flag if paging is disabled.";
  20. private const string CS_ARG_NAME_PAGE = "pg";
  21. private const string CS_ARG_HINT_PAGE = "<page>";
  22. private const string CS_ARG_DESC_PAGE = "Zero index page number.";
  23. private const string CS_ARG_NAME_PAGESIZE = "pgsize";
  24. private const string CS_ARG_HINT_PAGESIZE = "<page_size>";
  25. private const string CS_ARG_DESC_PAGESIZE = "Items count one per page. If not defined uses default from config.";
  26. #endregion
  27. #region *** Private Fields ***
  28. protected PagingDto Paging { get; private set; }
  29. #endregion
  30. #region *** Constructors ***
  31. protected AbstractListCommand(Engine engine) : base(engine)
  32. {
  33. }
  34. #endregion
  35. #region *** Protected Overrides ***
  36. protected override void BeginExecute()
  37. {
  38. base.BeginExecute();
  39. }
  40. protected override void OnValidateArguments()
  41. {
  42. // TODO :optimize
  43. base.OnValidateArguments();
  44. if (WasArgumentSpecified(CS_ARG_NAME_NOPAGING))
  45. {
  46. Paging = new PagingDto();
  47. WriteCaption("Paging: Disabled.");
  48. return;
  49. }
  50. var page = GetArgumentValueOrDefault<int>(CS_ARG_NAME_PAGE);
  51. var pageSize = GetArgumentValueOrDefault<int>(CS_ARG_NAME_PAGESIZE);
  52. pageSize = pageSize == 0 ? Configuration.DefaultPageSize : pageSize;
  53. Paging = new PagingDto(page, pageSize);
  54. WriteCaption(Paging.IsDisabled
  55. ? "Paging: Disabled."
  56. : $"Paging: {Paging.Page} - {Paging.PageSize} items per page.");
  57. }
  58. protected override IEnumerable<AbstractArgument> OnSetupArguments()
  59. {
  60. var args = new List<AbstractArgument>(base.OnSetupArguments());
  61. args.Add(new FlagArgument(CS_ARG_NAME_NOPAGING, CS_ARG_DESC_NOPAGING, CS_ARG_HINT_NOPAGING, false));
  62. args.Add(new NamedArgument(CS_ARG_NAME_PAGE, CS_ARG_DESC_PAGE, CS_ARG_HINT_PAGE,TypeValuesEnum.Integer,"0",false));
  63. args.Add(new NamedArgument(CS_ARG_NAME_PAGESIZE, CS_ARG_DESC_PAGESIZE, CS_ARG_HINT_PAGESIZE,TypeValuesEnum.Integer,string.Empty,false));
  64. return args;
  65. }
  66. protected void WriteDtoToConsole(IEnumerable<IDto> dtos, params string[] propertiesToShow)
  67. {
  68. // TODO : optimize
  69. if (dtos == null || !dtos.Any())
  70. {
  71. WriteInfo("No data.");
  72. return;
  73. }
  74. var propLengths = new Dictionary<string, int>();
  75. if (!(propertiesToShow == null || propertiesToShow.Length > 0))
  76. {
  77. propertiesToShow = dtos.First().GetAllPropertyValues().Select(x => x.Key).ToArray();
  78. }
  79. foreach (var propertyName in propertiesToShow)
  80. propLengths.Add(propertyName, propertyName.Length + 1);
  81. var dtosProps = new List<IDictionary<string, object>>();
  82. // gather data and column lengths
  83. foreach (var dto in dtos)
  84. {
  85. var props = dto.GetAllPropertyValues();
  86. dtosProps.Add(props);
  87. foreach (var prop in props)
  88. {
  89. if (!propertiesToShow.Contains(prop.Key))
  90. continue;
  91. if (!propLengths.ContainsKey(prop.Key))
  92. propLengths.Add(prop.Key,0);
  93. var curLen = prop.Value == null ? 0 : prop.ToString().Length + 1;
  94. if (curLen > propLengths[prop.Key]) propLengths[prop.Key] = curLen;
  95. }
  96. }
  97. // printout columns
  98. WriteInfo(string.Empty);
  99. var sb = new StringBuilder();
  100. foreach (var prop in propLengths)
  101. sb.Append(prop.Key.Align(prop.Value));
  102. WriteCaption(sb.ToString());
  103. WriteInfo(new string('-', propLengths.Sum(x=>x.Value)));
  104. // iterate columns values
  105. foreach (var dto in dtosProps)
  106. {
  107. sb = new StringBuilder();
  108. foreach (var prop in propLengths)
  109. {
  110. var val = string.Empty;
  111. val = dto[prop.Key]?.ToString();
  112. sb.Append(val.Align(prop.Value));
  113. }
  114. WriteInfo(sb.ToString());
  115. }
  116. WriteInfo(string.Empty);
  117. WriteCaption($"Total {dtosProps.Count} items.");
  118. }
  119. #endregion
  120. }
  121. }