Browse Source

:hammer: 列显示隐藏重构

jqh 4 years ago
parent
commit
e877ffcf39

+ 54 - 0
resources/views/grid/column-selector.blade.php

@@ -0,0 +1,54 @@
+<div class="dropdown pull-right column-selector" style="margin-right: 10px">
+    <button type="button" class="btn btn-sm btn-instagram dropdown-toggle" data-toggle="dropdown">
+        <i class="fa fa-table"></i>
+        &nbsp;
+        <span class="caret"></span>
+    </button>
+    <ul class="dropdown-menu" role="menu" style="padding: 10px;height: auto;max-height: 500px;overflow-x: hidden;">
+        <li>
+            <ul style='padding: 0;'>
+                {!! $checkbox !!}
+            </ul>
+        </li>
+        <li class="divider"></li>
+        <li class="text-right">
+            <button class="btn btn-sm btn-default column-select-all">{!! trans('admin.all') !!}</button>&nbsp;&nbsp;
+            <button class="btn btn-sm btn-primary column-select-submit">{!! trans('admin.submit') !!}</button>
+        </li>
+    </ul>
+</div>
+
+<script>
+    $('.column-select-submit').on('click', function () {
+
+        var defaults = {!! json_encode($defaults) !!};
+        var selected = [];
+
+        $('.column-select-item:checked').each(function () {
+            selected.push($(this).val());
+        });
+
+        if (selected.length == 0) {
+            return;
+        }
+
+        var url = new URL(location);
+
+        if (selected.sort().toString() == defaults.sort().toString()) {
+            url.searchParams.delete('_columns_');
+        } else {
+            url.searchParams.set('_columns_', selected.join());
+        }
+
+        $.pjax({container:'#pjax-container', url: url.toString()});
+    });
+
+    $('.column-select-all').on('click', function () {
+        $('.column-select-item').iCheck('check');
+        return false;
+    });
+
+    $('.column-select-item').iCheck({
+        checkboxClass:'icheckbox_minimal-blue'
+    });
+</script>

+ 1 - 0
src/Grid.php

@@ -31,6 +31,7 @@ class Grid
     use Concerns\HasQuickCreate;
     use Concerns\HasQuickSearch;
     use Concerns\CanFixColumns;
+    use Concerns\CanHidesColumns;
     use Macroable {
             __call as macroCall;
         }

+ 5 - 5
src/Grid/Column.php

@@ -56,11 +56,11 @@ use Illuminate\Support\Traits\Macroable;
  */
 class Column
 {
-    use HasBuilderEvents,
-        HasDefinitions,
-        Grid\Column\HasHeader,
-        Grid\Column\HasDisplayers,
-        Macroable {
+    use HasBuilderEvents;
+    use HasDefinitions;
+    use Grid\Column\HasHeader;
+    use Grid\Column\HasDisplayers;
+    use Macroable {
             __call as __macroCall;
         }
 

+ 142 - 0
src/Grid/Concerns/CanHidesColumns.php

@@ -0,0 +1,142 @@
+<?php
+
+namespace Dcat\Admin\Grid\Concerns;
+
+use Dcat\Admin\Grid;
+use Dcat\Admin\Grid\Tools\ColumnSelector;
+use Illuminate\Support\Collection;
+
+trait CanHidesColumns
+{
+    /**
+     * Default columns be hidden.
+     *
+     * @var array
+     */
+    public $hiddenColumns = [];
+
+    /**
+     * Remove column selector on grid.
+     *
+     * @param bool $disable
+     *
+     * @return $this|mixed
+     */
+    public function disableColumnSelector(bool $disable = true)
+    {
+        return $this->option('show_column_selector', !$disable);
+    }
+
+    /**
+     * @return bool
+     */
+    public function showColumnSelector(bool $show = true)
+    {
+        return $this->disableColumnSelector(! $show);
+    }
+
+    /**
+     * @return bool
+     */
+    public function allowColumnSelector()
+    {
+        return $this->option('show_column_selector');
+    }
+
+    /**
+     * @return string
+     */
+    public function renderColumnSelector()
+    {
+        return (new ColumnSelector($this))->render();
+    }
+
+    /**
+     * Setting default shown columns on grid.
+     *
+     * @param array|string $columns
+     *
+     * @return $this
+     */
+    public function hideColumns($columns)
+    {
+        if (func_num_args()) {
+            $columns = (array) $columns;
+        } else {
+            $columns = func_get_args();
+        }
+
+        $this->hiddenColumns = array_merge($this->hiddenColumns, $columns);
+
+        return $this;
+    }
+
+    /**
+     * Get visible columns from request query.
+     *
+     * @return array
+     */
+    protected function getVisibleColumnsFromQuery()
+    {
+        $columns = explode(',', request(ColumnSelector::SELECT_COLUMN_NAME));
+
+        return array_filter($columns) ?:
+            array_values(array_diff($this->columnNames, $this->hiddenColumns));
+    }
+
+    /**
+     * Get all visible column instances.
+     *
+     * @return Collection|static
+     */
+    public function getVisibleColumns()
+    {
+        $visible = $this->getVisibleColumnsFromQuery();
+
+        if (empty($visible)) {
+            return $this->columns;
+        }
+
+        array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
+
+        return $this->columns->filter(function (Grid\Column $column) use ($visible) {
+            return in_array($column->getName(), $visible);
+        });
+    }
+
+    /**
+     * Get all visible column names.
+     *
+     * @return array
+     */
+    public function getVisibleColumnNames()
+    {
+        $visible = $this->getVisibleColumnsFromQuery();
+
+        if (empty($visible)) {
+            return $this->columnNames;
+        }
+
+        array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
+
+        return collect($this->columnNames)->filter(function ($column) use ($visible) {
+            return in_array($column, $visible);
+        })->toArray();
+    }
+
+    /**
+     * Get default visible column names.
+     *
+     * @return array
+     */
+    public function getDefaultVisibleColumnNames()
+    {
+        return array_values(
+            array_diff(
+                $this->columnNames,
+                $this->hiddenColumns,
+                [Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME]
+            )
+        );
+    }
+}

+ 107 - 0
src/Grid/Tools/ColumnSelector.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace Dcat\Admin\Grid\Tools;
+
+use Dcat\Admin\Admin;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Widgets\Checkbox;
+use Illuminate\Support\Collection;
+
+class ColumnSelector extends AbstractTool
+{
+    const SELECT_COLUMN_NAME = '_columns_';
+
+    /**
+     * @var Grid
+     */
+    protected $grid;
+
+    /**
+     * @var array
+     */
+    protected static $ignoredColumns = [
+        Grid\Column::SELECT_COLUMN_NAME,
+        Grid\Column::ACTION_COLUMN_NAME,
+    ];
+
+    /**
+     * Create a new Export button instance.
+     *
+     * @param Grid $grid
+     */
+    public function __construct(Grid $grid)
+    {
+        $this->grid = $grid;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @return string
+     */
+    public function render()
+    {
+        if (! $this->grid->allowColumnSelector()) {
+            return '';
+        }
+
+        $show = $this->grid->getVisibleColumnNames();
+
+        $list = new Checkbox();
+
+        $list->class('column-select-item');
+        $list->options($this->getGridColumns());
+        $list->check(
+            $this->getGridColumns()->filter(function ($label, $key) use ($show) {
+                if (empty($show)) {
+                    return true;
+                }
+
+                return in_array($key, $show) ? true : false;
+            })->keys()
+        );
+
+        return Admin::view('admin::grid.column-selector', [
+            'checkbox' => $list,
+            'defaults' => $this->grid->getDefaultVisibleColumnNames(),
+        ]);
+    }
+
+    /**
+     * @return Collection
+     */
+    protected function getGridColumns()
+    {
+        return $this->grid->columns()->map(function (Grid\Column $column) {
+            $name = $column->getName();
+
+            if ($this->isColumnIgnored($name)) {
+                return;
+            }
+
+            return [$name => $column->getLabel()];
+        })->filter()->collapse();
+    }
+
+    /**
+     * Is column ignored in column selector.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    protected function isColumnIgnored($name)
+    {
+        return in_array($name, static::$ignoredColumns);
+    }
+
+    /**
+     * Ignore a column to display in column selector.
+     *
+     * @param string|array $name
+     */
+    public static function ignore($name)
+    {
+        static::$ignoredColumns = array_merge(static::$ignoredColumns, (array) $name);
+    }
+}