ColumnSelector.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. $visibleColumnNames = $this->grid->getVisibleColumnsFromQuery();
  40. $list = Checkbox::make()
  41. ->class('column-select-item')
  42. ->options($all)
  43. ->check($visibleColumnNames);
  44. $selectAll = Checkbox::make('_all_', [1 => trans('admin.all')])->check(
  45. $all->count() === count($show) ? 1 : null
  46. );
  47. return Admin::view('admin::grid.column-selector', [
  48. 'checkbox' => $list,
  49. 'defaults' => $visibleColumnNames,
  50. 'selectAll' => $selectAll,
  51. 'columnName' => $this->grid->getColumnSelectorQueryName(),
  52. ]);
  53. }
  54. /**
  55. * @return array
  56. */
  57. protected function getVisibleColumnNames()
  58. {
  59. $visible = $this->grid->getVisibleColumnsFromQuery();
  60. $columns = $this->grid->getComplexHeaderNames() ?: $this->grid->getColumnNames();
  61. if (! empty($visible)) {
  62. array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
  63. $columns = collect($columns)->filter(function ($column) use ($visible) {
  64. return in_array($column, $visible);
  65. })->toArray();
  66. }
  67. return array_filter($columns, function ($v) {
  68. return ! in_array($v, [Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME]);
  69. });
  70. }
  71. /**
  72. * @return Collection
  73. */
  74. protected function getGridColumns()
  75. {
  76. $columns = $this->grid->getComplexHeaders() ?: $this->grid->columns();
  77. return $columns->map(function ($column) {
  78. $name = $column->getName();
  79. if ($this->isColumnIgnored($name)) {
  80. return;
  81. }
  82. return [$name => $column->getLabel()];
  83. })->filter()->collapse();
  84. }
  85. /**
  86. * Is column ignored in column selector.
  87. *
  88. * @param string $name
  89. *
  90. * @return bool
  91. */
  92. protected function isColumnIgnored($name)
  93. {
  94. return in_array($name, $this->ignoredColumns);
  95. }
  96. /**
  97. * Ignore a column to display in column selector.
  98. *
  99. * @param string|array $name
  100. *
  101. * @return $this
  102. */
  103. public function ignore($name)
  104. {
  105. $this->ignoredColumns = array_merge($this->ignoredColumns, (array) $name);
  106. return $this;
  107. }
  108. }