HasMultipleHeader.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace Dcat\Admin\Grid\Concerns;
  3. use Dcat\Admin\Grid\Column;
  4. use Dcat\Admin\Grid\Header;
  5. trait HasMultipleHeader
  6. {
  7. /**
  8. * Table multiple headers.
  9. *
  10. * @var Header[]
  11. */
  12. protected $mutipleHeaders = [];
  13. /**
  14. * Merge cells.
  15. *
  16. * @param string $label
  17. * @param array $columnNames
  18. *
  19. * @return Header
  20. */
  21. public function combine(string $label, array $columnNames)
  22. {
  23. if (count($columnNames) < 2) {
  24. throw new \InvalidArgumentException('The number of "$columnNames" must be greater than 2');
  25. }
  26. $this->withBorder();
  27. return $this->mutipleHeaders[$label] = new Header($this, $label, $columnNames);
  28. }
  29. /**
  30. * @return Header[]
  31. */
  32. public function getMutipleHeaders()
  33. {
  34. return $this->mutipleHeaders;
  35. }
  36. /**
  37. * Reorder the headers.
  38. */
  39. protected function sortHeaders()
  40. {
  41. if (!$this->mutipleHeaders) {
  42. return;
  43. }
  44. $originalHeaders = $this->mutipleHeaders;
  45. $originalColumns = $this->columns;
  46. $headersColumns = $this->mutipleHeaders = $this->columns = [];
  47. foreach ($originalHeaders as $header) {
  48. $headersColumns = array_merge(
  49. $headersColumns,
  50. $tmp = $header->getColumnNames()
  51. );
  52. foreach ($tmp as &$name) {
  53. if ($column = $originalColumns->get($name)) {
  54. $this->columns[$name] = $column;
  55. }
  56. }
  57. }
  58. $before = $after = [];
  59. $isBefore = true;
  60. foreach ($originalColumns as $name => $column) {
  61. if ($isBefore && !isset($this->columns[$name])) {
  62. $before[$name] = $column;
  63. continue;
  64. }
  65. $isBefore = false;
  66. if (!isset($this->columns[$name])) {
  67. $after[$name] = $column;
  68. }
  69. }
  70. $beforeHeaders = $this->createHeaderWithColumns($before);
  71. $afterHeaders = $this->createHeaderWithColumns($after);
  72. $this->columnNames = array_merge(
  73. array_keys($before),
  74. array_keys($this->columns),
  75. array_keys($after)
  76. );
  77. $this->columns = collect($this->columns);
  78. $this->mutipleHeaders = array_merge(
  79. $beforeHeaders,
  80. array_values($originalHeaders),
  81. $afterHeaders
  82. );
  83. }
  84. protected function createHeaderWithColumns(array $columns)
  85. {
  86. $headers = [];
  87. /* @var Column $column */
  88. foreach ($columns as $name => $column) {
  89. $header = new Header($this, $column->getLabel(), [$name]);
  90. $prio = $column->getDataPriority();
  91. if (is_int($prio)) {
  92. $header->responsive($prio);
  93. }
  94. if ($html = $column->renderHeader()) {
  95. $header->append($html);
  96. }
  97. $headers[] = $header;
  98. }
  99. return $headers;
  100. }
  101. }