Kaynağa Gözat

:hammer: 列显示隐藏重构以及表格名称设置功能重构

jqh 5 yıl önce
ebeveyn
işleme
92546755de

+ 1 - 1
config/admin.php

@@ -313,7 +313,7 @@ return [
     |--------------------------------------------------------------------------
     */
     'extension' => [
-        // When you use command `php artisan admin:extend` to generate extensions,
+        // When you use command `php artisan admin:ext-make` to generate extensions,
         // the extension files will be generated in this directory.
         'dir' => base_path('dcat-admin-extensions'),
     ],

+ 3 - 1
resources/assets/dcat/js/extensions/SweetAlert2.js

@@ -1,6 +1,8 @@
 
 import Swal from '../sweetalert/sweetalert2'
 
+let w = window;
+
 export default class SweetAlert2 {
     constructor(Dcat) {
         let _this = this;
@@ -11,7 +13,7 @@ export default class SweetAlert2 {
         Swal.warning = _this.warning.bind(_this);
         Swal.confirm = _this.confirm.bind(_this);
 
-        _this.swal = Dcat.swal = Swal;
+        w.swal = w.Swal = _this.swal = Dcat.swal = Swal;
         
         Dcat.confirm = Swal.confirm;
     }

+ 14 - 1
resources/assets/dcat/sass/components/_table.scss

@@ -288,4 +288,17 @@ body.dark-mode {
   //.table-fixed-right .table.custom-data-table {
   //  padding: 5px 10px 0 0;
   //}
-}
+}
+
+.column-selector {
+  margin: 0 8px;
+
+  .selectors {
+    padding: 0 1rem;
+    height: auto;
+    max-height: 500px;
+    overflow-x: hidden;
+  }
+}
+
+@include scrollbar('.column-selector .selectors')

+ 14 - 1
resources/views/filter/between-datetime.blade.php

@@ -11,4 +11,17 @@
             <input autocomplete="off" type="text" class="form-control" id="{{$id['end']}}" placeholder="{{$label}}" name="{{$name['end']}}" value="{{ request($name['end'], \Illuminate\Support\Arr::get($value, 'end')) }}">
         </div>
     </div>
-</div>
+</div>
+
+<script require="@moment,@bootstrap-datetimepicker">
+    var options = {!! json_encode($dateOptions) !!};
+
+    $('#{{ $id['start'] }}').datetimepicker(options);
+    $('#{{ $id['end'] }}').datetimepicker($.extend(options, {useCurrent: false}));
+    $("#{{ $id['start'] }}").on("dp.change", function (e) {
+        $('#{{ $id['end'] }}').data("DateTimePicker").minDate(e.date);
+    });
+    $("#{{ $id['end'] }}").on("dp.change", function (e) {
+        $('#{{ $id['start'] }}').data("DateTimePicker").maxDate(e.date);
+    });
+</script>

+ 1 - 1
resources/views/filter/gt.blade.php

@@ -1,3 +1,3 @@
 <div class="filter-input col-sm-{{ $width }} " >
-    <div class="form-group">{!! $presenter !!}</div>
+    <div class="form-group">{!! $presenter() !!}</div>
 </div>

+ 1 - 1
resources/views/filter/lt.blade.php

@@ -1,3 +1,3 @@
 <div class="filter-input col-sm-{{ $width }} " >
-    <div class="form-group">{!! $presenter !!}</div>
+    <div class="form-group">{!! $presenter() !!}</div>
 </div>

+ 1 - 1
resources/views/filter/where.blade.php

@@ -1,3 +1,3 @@
 <div class="filter-input col-sm-{{ $width }} " style="{!! $style !!}">
-    <div class="form-group">{!! $presenter !!}</div>
+    <div class="form-group">{!! $presenter() !!}</div>
 </div>

+ 15 - 1
resources/views/grid/batch-actions.blade.php

@@ -13,4 +13,18 @@
         @endforeach
     </ul>
 </div>
-@endif
+@endif
+
+<script>
+$('.{{ $parent->getRowName() }}-checkbox').on('change', function () {
+    var btn = $('.{{ $selectAllName }}-btn'), selected = Dcat.grid.selectedRows('{{ $parent->getName() }}').length;
+    if (selected) {
+        btn.show()
+    } else {
+        btn.hide()
+    }
+    setTimeout(function () {
+        btn.find('.selected').html("{!! trans('admin.grid_items_selected') !!}".replace('{n}', selected));
+    }, 50)
+});
+</script>

+ 26 - 26
resources/views/grid/column-selector.blade.php

@@ -1,30 +1,35 @@
-<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">
+<span class="dropdown column-selector" >
+    <button class="btn btn-primary btn-outline 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 class="dropdown-menu" role="menu">
+        <li class="dropdown-item">
+            <ul class="selectors">
+                {!! $selectAll !!}
             </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 class="dropdown-divider"></li>
+        <li class="dropdown-item">
+            <ul class="selectors">
+                {!! $checkbox !!}
+            </ul>
         </li>
     </ul>
-</div>
+</span>
 
-<script>
-    $('.column-select-submit').on('click', function () {
+<script once>
+    $('.column-selector input[name="_all_"]').on('change', function () {
+        $(this).parents('.column-selector').find('.column-select-item').prop('checked', this.checked).change()
+    });
 
+    var submit = Dcat.helpers.debounce(function ($this) {
         var defaults = {!! json_encode($defaults) !!};
         var selected = [];
+        var $parent = $this.parents('.column-selector');
+        var column = '{{ $columnName }}'
 
-        $('.column-select-item:checked').each(function () {
+        $parent.find('.column-select-item:checked').each(function () {
             selected.push($(this).val());
         });
 
@@ -35,20 +40,15 @@
         var url = new URL(location);
 
         if (selected.sort().toString() == defaults.sort().toString()) {
-            url.searchParams.delete('_columns_');
+            url.searchParams.set(column, '');
         } else {
-            url.searchParams.set('_columns_', selected.join());
+            url.searchParams.set(column, selected.join());
         }
 
-        $.pjax({container:'#pjax-container', url: url.toString()});
-    });
-
-    $('.column-select-all').on('click', function () {
-        $('.column-select-item').iCheck('check');
-        return false;
-    });
+        Dcat.reload(url.toString());
+    }, 1400);
 
-    $('.column-select-item').iCheck({
-        checkboxClass:'icheckbox_minimal-blue'
+    $('.column-selector .column-select-item').on('change', function () {
+        submit($(this));
     });
 </script>

+ 11 - 6
resources/views/grid/displayer/extensions/description.blade.php

@@ -1,15 +1,20 @@
 <div style="margin-bottom: 10px">{{ $value }}</div>
 
-@if($row->version)
+@if($row->version && empty($row->new_version))
     {{ trans('admin.version').' '.$row->version }}
+
+    @if($settingAction)
+        &nbsp;|&nbsp;
+        {!! $settingAction !!}
+    @endif
 @else
     {!! $updateAction !!}
-@endif
- &nbsp;|&nbsp;
 
-@if($settingAction)
-    {!! $settingAction !!}
-    &nbsp;|&nbsp;
+    @if($settingAction && $row->new_version)
+        &nbsp;|&nbsp;
+        {!! $settingAction !!}
+    @endif
 @endif
+&nbsp;|&nbsp;
 
 <a href="javascript:void(0)">{{ trans('admin.view') }}</a>

+ 14 - 2
resources/views/grid/displayer/extensions/name.blade.php

@@ -1,13 +1,25 @@
+@if($row->homepage)
+    <a href='{!! $row->homepage !!}' target='_blank' class="feather icon-chrome"></a>
+@endif
 <span class="ext-name">
     {{ $value }}
 </span>
-@if($row->homepage)
-    <a href='{!! $row->homepage !!}' target='_blank' class="feather icon-chrome"></a>
+
+@if($row->new_version || ! $row->version)
+    &nbsp;
+    <span class="badge bg-primary">New</span>
 @endif
 
 <div style="height: 10px"></div>
 
+@if($row->type === Dcat\Admin\Extend\ServiceProvider::TYPE_THEME)
+    <span class="text-uppercase">{{ trans('admin.theme') }}</span>
+@endif
+
 @if($row->version)
+    @if($row->type === Dcat\Admin\Extend\ServiceProvider::TYPE_THEME)
+        &nbsp;|&nbsp;
+    @endif
 
     @if($row->enabled)
         {!! $disableAction !!}

+ 8 - 2
resources/views/grid/table-toolbar.blade.php

@@ -10,13 +10,19 @@
                         @endif
                     </h4>
                     <div class="pull-right" data-responsive-table-toolbar="{{$tableId}}">
-                        {!! $grid->renderTools() !!} {!! $grid->renderCreateButton() !!} {!! $grid->renderExportButton() !!}  {!! $grid->renderQuickSearch() !!}
+                        {!! $grid->renderTools() !!}
+                        {!! $grid->renderColumnSelector() !!}
+                        {!! $grid->renderCreateButton() !!}
+                        {!! $grid->renderExportButton() !!}
+                        {!! $grid->renderQuickSearch() !!}
                     </div>
                 @else
                     {!! $grid->renderTools() !!}  {!! $grid->renderQuickSearch() !!}
 
                     <div class="pull-right" data-responsive-table-toolbar="{{$tableId}}">
-                        {!! $grid->renderCreateButton() !!} {!! $grid->renderExportButton() !!}
+                        {!! $grid->renderColumnSelector() !!}
+                        {!! $grid->renderCreateButton() !!}
+                        {!! $grid->renderExportButton() !!}
                     </div>
                 @endif
             </div>

+ 3 - 3
resources/views/grid/table.blade.php

@@ -20,7 +20,7 @@
                 </tr>
             @endif
             <tr>
-                @foreach($grid->columns() as $column)
+                @foreach($grid->getVisibleColumns() as $column)
                     <th {!! $column->formatTitleAttributes() !!}>{!! $column->getLabel() !!}{!! $column->renderHeader() !!}</th>
                 @endforeach
             </tr>
@@ -33,7 +33,7 @@
             <tbody>
             @foreach($grid->rows() as $row)
                 <tr {!! $row->rowAttributes() !!}>
-                    @foreach($grid->getColumnNames() as $name)
+                    @foreach($grid->getVisibleColumnNames() as $name)
                         <td {!! $row->columnAttributes($name) !!}>
                             {!! $row->column($name) !!}
                         </td>
@@ -42,7 +42,7 @@
             @endforeach
             @if ($grid->rows()->isEmpty())
                 <tr>
-                    <td colspan="{!! count($grid->getColumnNames()) !!}">
+                    <td colspan="{!! count($grid->getVisibleColumnNames()) !!}">
                         <div style="margin:5px 0 0 10px;"><span class="help-block" style="margin-bottom:0"><i class="feather icon-alert-circle"></i>&nbsp;{{ trans('admin.no_data') }}</span></div>
                     </td>
                 </tr>

+ 7 - 1
src/Grid.php

@@ -183,6 +183,11 @@ class Grid
         'table_class'            => ['table', 'custom-data-table', 'data-table'],
     ];
 
+    /**
+     * @var \Illuminate\Http\Request
+     */
+    protected $request;
+
     /**
      * Create a new grid instance.
      *
@@ -191,13 +196,14 @@ class Grid
      * @param Repository|\Illuminate\Database\Eloquent\Model|Builder|null $repository
      * @param null|\Closure                                       $builder
      */
-    public function __construct($repository = null, ?\Closure $builder = null)
+    public function __construct($repository = null, ?\Closure $builder = null, $request = null)
     {
         $this->model = new Model(request(), $repository);
         $this->columns = new Collection();
         $this->allColumns = new Collection();
         $this->rows = new Collection();
         $this->builder = $builder;
+        $this->request = $request ?: request();
 
         if ($repository = $this->model->repository()) {
             $this->setKeyName($repository->getKeyName());

+ 3 - 3
src/Grid/Column/Filter.php

@@ -109,9 +109,9 @@ abstract class Filter implements Renderable
      */
     public function getQueryName()
     {
-        return $this->parent->grid()->getName().
-            '_filter_'.
-            $this->getColumnName();
+        return $this->parent->grid()->makeName(
+            'filter-'.$this->getColumnName()
+        );
     }
 
     /**

+ 14 - 2
src/Grid/Concerns/CanHidesColumns.php

@@ -24,7 +24,7 @@ trait CanHidesColumns
      */
     public function disableColumnSelector(bool $disable = true)
     {
-        return $this->option('show_column_selector', !$disable);
+        return $this->option('show_column_selector', ! $disable);
     }
 
     /**
@@ -48,6 +48,10 @@ trait CanHidesColumns
      */
     public function renderColumnSelector()
     {
+        if (! $this->allowColumnSelector()) {
+            return '';
+        }
+
         return (new ColumnSelector($this))->render();
     }
 
@@ -71,6 +75,14 @@ trait CanHidesColumns
         return $this;
     }
 
+    /**
+     * @return string
+     */
+    public function getColumnSelectorQueryName()
+    {
+        return $this->makeName(ColumnSelector::SELECT_COLUMN_NAME);
+    }
+
     /**
      * Get visible columns from request query.
      *
@@ -78,7 +90,7 @@ trait CanHidesColumns
      */
     protected function getVisibleColumnsFromQuery()
     {
-        $columns = explode(',', request(ColumnSelector::SELECT_COLUMN_NAME));
+        $columns = explode(',', request($this->getColumnSelectorQueryName()));
 
         return array_filter($columns) ?:
             array_values(array_diff($this->columnNames, $this->hiddenColumns));

+ 1 - 15
src/Grid/Concerns/HasExporter.php

@@ -64,7 +64,7 @@ trait HasExporter
             $this->exported
             || (
                 (! $this->allowExporter()
-                    || ! $scope = request($this->exporter()->queryName()))
+                    || ! $scope = request($this->exporter()->getQueryName()))
                 && ! $forceExport
             )
         ) {
@@ -93,20 +93,6 @@ trait HasExporter
         return $this->exporter ?: ($this->exporter = new Exporter($this));
     }
 
-    /**
-     * @param string $name
-     *
-     * @return void
-     */
-    protected function setExporterQueryName(string $name = null)
-    {
-        if (! $this->exporter) {
-            return;
-        }
-
-        $this->exporter->setQueryName(($name ?: $this->getName()).'_export_');
-    }
-
     /**
      * @param string $scope
      *

+ 35 - 11
src/Grid/Concerns/HasNames.php

@@ -38,17 +38,7 @@ trait HasNames
     public function setName($name)
     {
         $this->_name = $name;
-        $this->tableId = $this->tableId.'-'.$name;
-
-        $model = $this->model();
-
-        $model->setPerPageName("{$name}_{$model->getPerPageName()}")
-            ->setPageName("{$name}_{$model->getPageName()}")
-            ->setSortName("{$name}_{$model->getSortName()}");
-
-        $this->filter()->setName($name);
-        $this->setExporterQueryName();
-        $this->setQuickSearchQueryName();
+        $this->tableId = $this->makeName($this->tableId);
 
         return $this;
     }
@@ -63,6 +53,40 @@ trait HasNames
         return $this->_name;
     }
 
+    /**
+     * Retrieve an input item from the request.
+     *
+     * @param string $key
+     *
+     * @return mixed
+     */
+    public function getRequestInput($key)
+    {
+        return $this->request->get($this->makeName($key));
+    }
+
+    /**
+     * @param string $key
+     *
+     * @return string
+     */
+    public function makeName($key)
+    {
+        return $this->getNamePrefix().$key;
+    }
+
+    /**
+     * @return string
+     */
+    public function getNamePrefix()
+    {
+        if (! $name = $this->getName()) {
+            return;
+        }
+
+        return $name.'-';
+    }
+
     /**
      * @return string
      */

+ 0 - 14
src/Grid/Concerns/HasQuickSearch.php

@@ -47,24 +47,10 @@ trait HasQuickSearch
         return tap(new Tools\QuickSearch(), function ($search) {
             $this->quickSearch = $search;
 
-            $this->setQuickSearchQueryName();
-
             $search->setGrid($this);
         });
     }
 
-    /**
-     * @param string $gridName
-     */
-    public function setQuickSearchQueryName()
-    {
-        if ($this->quickSearch) {
-            $this->quickSearch->setQueryName(
-                $this->getName().$this->quickSearch->getQueryName()
-            );
-        }
-    }
-
     /**
      * @return Tools\QuickSearch
      */

+ 1 - 1
src/Grid/Displayers/Expand.php

@@ -64,6 +64,6 @@ class Expand extends AbstractDisplayer
 
         static::$counter++;
 
-        return $this->grid->getName().$key.'-'.static::$counter;
+        return $this->grid->makeName($key.'-'.static::$counter);
     }
 }

+ 3 - 19
src/Grid/Exporter.php

@@ -60,22 +60,6 @@ class Exporter
     public function __construct(Grid $grid)
     {
         $this->grid = $grid;
-
-        $this->setQueryName($grid->getName().$this->queryName);
-    }
-
-    /**
-     * Set export query name.
-     *
-     * @param $name
-     *
-     * @return $this
-     */
-    public function setQueryName($name)
-    {
-        $this->queryName = $name;
-
-        return $this;
     }
 
     /**
@@ -148,9 +132,9 @@ class Exporter
      *
      * @return string
      */
-    public function queryName(): string
+    public function getQueryName(): string
     {
-        return $this->queryName;
+        return $this->grid->makeName($this->queryName);
     }
 
     /**
@@ -252,7 +236,7 @@ class Exporter
             $query = "$scope:$args";
         }
 
-        return [$this->queryName => $query];
+        return [$this->getQueryName() => $query];
     }
 
     /**

+ 6 - 26
src/Grid/Filter.php

@@ -372,26 +372,6 @@ class Filter implements Renderable
         return $this->filterID;
     }
 
-    /**
-     * @param string $name
-     *
-     * @return $this
-     */
-    public function setName($name)
-    {
-        $this->name = $name;
-
-        return $this;
-    }
-
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
     /**
      * @return $this
      */
@@ -493,14 +473,14 @@ class Filter implements Renderable
      */
     protected function sanitizeInputs(&$inputs)
     {
-        if (! $this->name) {
+        if (! $prefix = $this->grid()->getNamePrefix()) {
             return $inputs;
         }
 
-        $inputs = collect($inputs)->filter(function ($input, $key) {
-            return Str::startsWith($key, "{$this->name}_");
-        })->mapWithKeys(function ($val, $key) {
-            $key = str_replace("{$this->name}_", '', $key);
+        $inputs = collect($inputs)->filter(function ($input, $key) use ($prefix) {
+            return Str::startsWith($key, $prefix);
+        })->mapWithKeys(function ($val, $key) use ($prefix) {
+            $key = str_replace($prefix, '', $key);
 
             return [$key => $val];
         })->toArray();
@@ -564,7 +544,7 @@ class Filter implements Renderable
      */
     public function getScopeQueryName()
     {
-        return $this->grid()->getName().'_scope_';
+        return $this->grid()->makeName('_scope_');
     }
 
     /**

+ 24 - 9
src/Grid/Filter/AbstractFilter.php

@@ -107,6 +107,11 @@ abstract class AbstractFilter
      */
     protected $ignore = false;
 
+    /**
+     * @var array
+     */
+    protected $variables = [];
+
     /**
      * AbstractFilter constructor.
      *
@@ -182,9 +187,7 @@ abstract class AbstractFilter
             }
         }
 
-        $parenName = $this->parent->getName();
-
-        return $parenName ? "{$parenName}_{$name}" : $name;
+        return $this->parent->grid()->makeName($name);
     }
 
     /**
@@ -196,7 +199,7 @@ abstract class AbstractFilter
      */
     protected function formatId($columns)
     {
-        return 'filter_column_'.$this->parent->grid()->getName().'_'.str_replace('.', '_', $columns);
+        return $this->parent->grid()->makeName('filter-column-'.str_replace('.', '-', $columns));
     }
 
     /**
@@ -513,9 +516,7 @@ abstract class AbstractFilter
      */
     public function formatColumnClass($column)
     {
-        $parenName = $this->parent->getName();
-
-        return $parenName ? "{$parenName}_{$column}" : $column;
+        return $this->parent->grid()->makeName(str_replace('.', '-', $column));
     }
 
     /**
@@ -583,6 +584,18 @@ abstract class AbstractFilter
         }]];
     }
 
+    /**
+     * @param array $variables
+     *
+     * @return $this
+     */
+    public function addVariables(array $variables)
+    {
+        $this->variables = array_merge($this->variables, $variables);
+
+        return $this;
+    }
+
     /**
      * Variables for filter view.
      *
@@ -597,7 +610,7 @@ abstract class AbstractFilter
             'value'     => $this->value(),
             'width'     => $this->width,
             'style'     => $this->style,
-        ], $this->presenter()->variables());
+        ], $this->presenter()->variables(), $this->variables);
     }
 
     public function value()
@@ -628,7 +641,9 @@ abstract class AbstractFilter
      */
     protected function renderPresenter()
     {
-        return Admin::view($this->presenter->view(), $this->variables());
+        return function () {
+            return Admin::view($this->presenter->view(), $this->variables());
+        };
     }
 
     /**

+ 7 - 31
src/Grid/Filter/Between.php

@@ -45,9 +45,9 @@ class Between extends AbstractFilter
     public function formatId($column)
     {
         $id = str_replace('.', '_', $column);
-        $prefix = 'filter_column_'.$this->parent->grid()->getName().'_';
+        $prefix = $this->parent->grid()->makeName('filter-column-');
 
-        return ['start' => "{$prefix}{$id}_start", 'end' => "{$prefix}{$id}_end"];
+        return ['start' => "{$prefix}{$id}-start", 'end' => "{$prefix}{$id}-end"];
     }
 
     /**
@@ -59,14 +59,12 @@ class Between extends AbstractFilter
      */
     protected function formatName($column)
     {
-        $gridName = $this->parent->grid()->getName();
-        $prefix = $gridName ? $gridName.'_' : '';
         $columns = explode('.', $column);
 
         if (count($columns) == 1) {
-            $name = $prefix.$columns[0];
+            $name = $this->parent->grid()->makeName($columns[0]);
         } else {
-            $name = $prefix.array_shift($columns);
+            $name = $this->parent->grid()->makeName(array_shift($columns));
 
             foreach ($columns as $column) {
                 $name .= "[$column]";
@@ -131,33 +129,11 @@ class Between extends AbstractFilter
 
         DateTime::requireAssets();
 
-        $this->setupDatetime($options);
-
-        return $this;
-    }
-
-    /**
-     * @param array $options
-     */
-    protected function setupDatetime($options = [])
-    {
         $options['format'] = Arr::get($options, 'format', 'YYYY-MM-DD HH:mm:ss');
         $options['locale'] = Arr::get($options, 'locale', config('app.locale'));
 
-        $startOptions = json_encode($options);
-        $endOptions = json_encode($options + ['useCurrent' => false]);
-
-        $script = <<<JS
-            $('#{$this->id['start']}').datetimepicker($startOptions);
-            $('#{$this->id['end']}').datetimepicker($endOptions);
-            $("#{$this->id['start']}").on("dp.change", function (e) {
-                $('#{$this->id['end']}').data("DateTimePicker").minDate(e.date);
-            });
-            $("#{$this->id['end']}").on("dp.change", function (e) {
-                $('#{$this->id['start']}').data("DateTimePicker").maxDate(e.date);
-            });
-JS;
-
-        Admin::script($script);
+        return $this->addVariables([
+            'dateOptions' => $options,
+        ]);
     }
 }

+ 6 - 44
src/Grid/Model.php

@@ -244,21 +244,7 @@ class Model
      */
     public function getPerPageName()
     {
-        return $this->perPageName;
-    }
-
-    /**
-     * Set the query string variable used to store the per-page.
-     *
-     * @param string $name
-     *
-     * @return $this
-     */
-    public function setPerPageName($name)
-    {
-        $this->perPageName = $name;
-
-        return $this;
+        return $this->grid->makeName($this->perPageName);
     }
 
     /**
@@ -271,22 +257,12 @@ class Model
         return $this;
     }
 
-    /**
-     * @param string $pageName
-     */
-    public function setPageName(string $pageName)
-    {
-        $this->pageName = $pageName;
-
-        return $this;
-    }
-
     /**
      * @return string
      */
     public function getPageName()
     {
-        return $this->pageName;
+        return $this->grid->makeName($this->pageName);
     }
 
     /**
@@ -296,21 +272,7 @@ class Model
      */
     public function getSortName()
     {
-        return $this->sortName;
-    }
-
-    /**
-     * Set the query string variable used to store the sort.
-     *
-     * @param string $name
-     *
-     * @return $this
-     */
-    public function setSortName($name)
-    {
-        $this->sortName = $name;
-
-        return $this;
+        return $this->grid->makeName($this->sortName);
     }
 
     /**
@@ -498,7 +460,7 @@ class Model
     {
         $this->paginator = $paginator;
 
-        $paginator->setPageName($this->pageName);
+        $paginator->setPageName($this->getPageName());
     }
 
     /**
@@ -550,7 +512,7 @@ class Model
             return;
         }
 
-        return $this->currentPage ?: ($this->currentPage = ($this->request->get($this->pageName) ?: 1));
+        return $this->currentPage ?: ($this->currentPage = ($this->request->get($this->getPageName()) ?: 1));
     }
 
     /**
@@ -574,7 +536,7 @@ class Model
             return;
         }
 
-        return $this->request->get($this->perPageName) ?: $this->perPage;
+        return $this->request->get($this->getPerPageName()) ?: $this->perPage;
     }
 
     /**

+ 2 - 30
src/Grid/Tools/BatchActions.php

@@ -97,34 +97,6 @@ class BatchActions extends AbstractTool
         }
     }
 
-    /**
-     * Scripts of BatchActions button groups.
-     */
-    protected function setupScript()
-    {
-        $name = $this->parent->getName();
-        $allName = $this->parent->getSelectAllName();
-        $rowName = $this->parent->getRowName();
-
-        $selected = trans('admin.grid_items_selected');
-
-        $script = <<<JS
-$('.{$rowName}-checkbox').on('change', function () {
-    var btn = $('.{$allName}-btn'), selected = Dcat.grid.selectedRows('$name').length;
-    if (selected) {
-        btn.show()
-    } else {
-        btn.hide()
-    }
-    setTimeout(function () {
-         btn.find('.selected').html("{$selected}".replace('{n}', selected));
-    }, 50)
-});
-JS;
-
-        Admin::script($script);
-    }
-
     /**
      * Render BatchActions button groups.
      *
@@ -140,15 +112,15 @@ JS;
             return '';
         }
 
-        $this->setupScript();
         $this->prepareActions();
 
         $data = [
             'actions'                 => $this->actions,
             'selectAllName'           => $this->parent->getSelectAllName(),
             'isHoldSelectAllCheckbox' => $this->isHoldSelectAllCheckbox,
+            'parent'                  => $this->parent,
         ];
 
-        return view('admin::grid.batch-actions', $data)->render();
+        return Admin::view('admin::grid.batch-actions', $data);
     }
 }

+ 40 - 22
src/Grid/Tools/ColumnSelector.php

@@ -19,7 +19,7 @@ class ColumnSelector extends AbstractTool
     /**
      * @var array
      */
-    protected static $ignoredColumns = [
+    protected $ignoredColumns = [
         Grid\Column::SELECT_COLUMN_NAME,
         Grid\Column::ACTION_COLUMN_NAME,
     ];
@@ -41,32 +41,46 @@ class ColumnSelector extends AbstractTool
      */
     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;
+        $show = $this->getVisibleColumnNames();
+        $all = $this->getGridColumns();
+
+        $list = Checkbox::make()
+            ->class('column-select-item')
+            ->options($all)
+            ->check(
+                $this->getGridColumns()->filter(function ($label, $key) use ($show) {
+                    if (empty($show)) {
+                        return true;
+                    }
+
+                    return in_array($key, $show) ? true : false;
                 }
+            )
+            ->keys()
+        );
 
-                return in_array($key, $show) ? true : false;
-            })->keys()
+        $selectAll = Checkbox::make('_all_', [1 => trans('admin.all')])->check(
+            $all->count() === count($show) ? 1 : null
         );
 
         return Admin::view('admin::grid.column-selector', [
-            'checkbox' => $list,
-            'defaults' => $this->grid->getDefaultVisibleColumnNames(),
+            'checkbox'   => $list,
+            'defaults'   => $this->grid->getDefaultVisibleColumnNames(),
+            'selectAll'  => $selectAll,
+            'columnName' => $this->grid->getColumnSelectorQueryName(),
         ]);
     }
 
+    /**
+     * @return array
+     */
+    protected function getVisibleColumnNames()
+    {
+        return array_filter($this->grid->getVisibleColumnNames(), function ($v) {
+            return ! in_array($v, [Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME]);
+        });
+    }
+
     /**
      * @return Collection
      */
@@ -92,16 +106,20 @@ class ColumnSelector extends AbstractTool
      */
     protected function isColumnIgnored($name)
     {
-        return in_array($name, static::$ignoredColumns);
+        return in_array($name, $this->ignoredColumns);
     }
 
     /**
      * Ignore a column to display in column selector.
      *
      * @param string|array $name
+     *
+     * @return $this
      */
-    public static function ignore($name)
+    public function ignore($name)
     {
-        static::$ignoredColumns = array_merge(static::$ignoredColumns, (array) $name);
+        $this->ignoredColumns = array_merge($this->ignoredColumns, (array) $name);
+
+        return $this;
     }
 }

+ 1 - 2
src/Grid/Tools/CreateButton.php

@@ -29,8 +29,7 @@ class CreateButton implements Renderable
 
         $new = trans('admin.new');
         $url = $this->grid->getCreateUrl();
-        $gridName = $this->grid->getName();
-        $class = 'dialog-create'.($gridName ? "-{$gridName}" : $gridName);
+        $class = $this->grid->makeName('dialog-create');
 
         [$width, $height] = $this->grid->option('dialog_form_area');
 

+ 1 - 3
src/Grid/Tools/QuickCreate.php

@@ -309,9 +309,7 @@ class QuickCreate implements Renderable
 
     public function getElementClass()
     {
-        $name = $this->parent->getName();
-
-        return 'quick-create'.($name ? "-{$name}" : '');
+        return $this->parent->makeName('quick-create');
     }
 
     /**

+ 4 - 16
src/Grid/Tools/QuickSearch.php

@@ -32,24 +32,12 @@ class QuickSearch extends AbstractTool
      */
     protected $autoSubmit = true;
 
-    /**
-     * @param string|null $name
-     *
-     * @return $this
-     */
-    public function setQueryName(?string $name)
-    {
-        $this->queryName = $name;
-
-        return $this;
-    }
-
     /**
      * @return string
      */
     public function getQueryName()
     {
-        return $this->queryName;
+        return $this->parent->makeName($this->queryName);
     }
 
     /**
@@ -83,7 +71,7 @@ class QuickSearch extends AbstractTool
      */
     public function value()
     {
-        return trim(request($this->queryName));
+        return trim(request($this->getQueryName()));
     }
 
     /**
@@ -92,7 +80,7 @@ class QuickSearch extends AbstractTool
     public function formAction()
     {
         return Helper::fullUrlWithoutQuery([
-            $this->queryName,
+            $this->getQueryName(),
             $this->parent->model()->getPageName(),
             '_pjax',
         ]);
@@ -119,7 +107,7 @@ class QuickSearch extends AbstractTool
 
         $data = [
             'action'      => $this->formAction(),
-            'key'         => $this->queryName,
+            'key'         => $this->getQueryName(),
             'value'       => $this->value(),
             'placeholder' => $this->placeholder ?: trans('admin.search'),
             'width'       => $this->width,

+ 1 - 1
src/Grid/Tools/Selector.php

@@ -106,7 +106,7 @@ class Selector
      */
     public function getQueryName()
     {
-        return $this->grid->getName().$this->queryNameSuffix;
+        return $this->grid->makeName($this->queryNameSuffix);
     }
 
     /**

+ 2 - 2
src/Show/Field.php

@@ -528,11 +528,11 @@ HTML;
     }
 
     /**
-     * @param Fluent $model
+     * @param Fluent|\Illuminate\Database\Eloquent\Model $model
      *
      * @return void
      */
-    public function fill(Fluent $model)
+    public function fill($model)
     {
         $this->value(Arr::get($model->toArray(), $this->name));
     }

+ 1 - 1
src/Traits/HasHtml.php

@@ -120,7 +120,7 @@ trait HasHtml
                 static::asset()->require(explode(',', $require));
             }
 
-            $script = '(function () {'.$script.'})();';
+            $script = "(function () {{$script}\n})();";
 
             if ($element->hasAttribute('once')) {
                 return static::script($script);