ColumnSelector.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace Dcat\Admin\Grid\Tools;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Grid;
  5. use Dcat\Admin\Widgets\Checkbox;
  6. use Illuminate\Support\Collection;
  7. class ColumnSelector extends AbstractTool
  8. {
  9. const SELECT_COLUMN_NAME = '_columns_';
  10. /**
  11. * @var Grid
  12. */
  13. protected $grid;
  14. /**
  15. * @var array
  16. */
  17. protected $ignoredColumns = [
  18. Grid\Column::SELECT_COLUMN_NAME,
  19. Grid\Column::ACTION_COLUMN_NAME,
  20. ];
  21. /**
  22. * Create a new Export button instance.
  23. *
  24. * @param Grid $grid
  25. */
  26. public function __construct(Grid $grid)
  27. {
  28. $this->grid = $grid;
  29. }
  30. /**
  31. * {@inheritdoc}
  32. *
  33. * @return string
  34. */
  35. public function render()
  36. {
  37. $show = $this->getVisibleColumnNames();
  38. $all = $this->getGridColumns();
  39. $list = Checkbox::make()
  40. ->class('column-select-item')
  41. ->options($all)
  42. ->check(
  43. $this->getGridColumns()->filter(function ($label, $key) use ($show) {
  44. if (empty($show)) {
  45. return true;
  46. }
  47. return in_array($key, $show) ? true : false;
  48. }
  49. )
  50. ->keys()
  51. );
  52. $selectAll = Checkbox::make('_all_', [1 => trans('admin.all')])->check(
  53. $all->count() === count($show) ? 1 : null
  54. );
  55. return Admin::view('admin::grid.column-selector', [
  56. 'checkbox' => $list,
  57. 'defaults' => $this->grid->getDefaultVisibleColumnNames(),
  58. 'selectAll' => $selectAll,
  59. 'columnName' => $this->grid->getColumnSelectorQueryName(),
  60. ]);
  61. }
  62. /**
  63. * @return array
  64. */
  65. protected function getVisibleColumnNames()
  66. {
  67. $visible = $this->grid->getVisibleColumnsFromQuery();
  68. $columns = $this->grid->getComplexHeaderNames() ?: $this->grid->getColumnNames();
  69. if (! empty($visible)) {
  70. array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
  71. $columns = collect($columns)->filter(function ($column) use ($visible) {
  72. return in_array($column, $visible);
  73. })->toArray();
  74. }
  75. return array_filter($columns, function ($v) {
  76. return ! in_array($v, [Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME]);
  77. });
  78. }
  79. /**
  80. * @return Collection
  81. */
  82. protected function getGridColumns()
  83. {
  84. $columns = $this->grid->getComplexHeaders() ?: $this->grid->columns();
  85. return $columns->map(function ($column) {
  86. $name = $column->getName();
  87. if ($this->isColumnIgnored($name)) {
  88. return;
  89. }
  90. return [$name => $column->getLabel()];
  91. })->filter()->collapse();
  92. }
  93. /**
  94. * Is column ignored in column selector.
  95. *
  96. * @param string $name
  97. *
  98. * @return bool
  99. */
  100. protected function isColumnIgnored($name)
  101. {
  102. return in_array($name, $this->ignoredColumns);
  103. }
  104. /**
  105. * Ignore a column to display in column selector.
  106. *
  107. * @param string|array $name
  108. *
  109. * @return $this
  110. */
  111. public function ignore($name)
  112. {
  113. $this->ignoredColumns = array_merge($this->ignoredColumns, (array) $name);
  114. return $this;
  115. }
  116. }