Quellcode durchsuchen

增加自定义表格列选择器持久化状态保存功能 #751

jqh vor 4 Jahren
Ursprung
Commit
949a4c8eaa

+ 7 - 0
config/admin.php

@@ -161,6 +161,13 @@ return [
         |--------------------------------------------------------------------------
         */
         'grid_action_class' => Dcat\Admin\Grid\Displayers\DropdownActions::class,
+
+        'column_selector' => [
+            'store' => Dcat\Admin\Grid\ColumnSelector\SessionStore::class,
+            'store_params' => [
+                'driver' => 'file',
+            ],
+        ],
     ],
 
     /*

+ 7 - 0
src/Console/stubs/config.stub

@@ -158,6 +158,13 @@ return [
         |--------------------------------------------------------------------------
         */
         'grid_action_class' => Dcat\Admin\Grid\Displayers\DropdownActions::class,
+
+        'column_selector' => [
+            'store' => Dcat\Admin\Grid\ColumnSelector\SessionStore::class,
+            'store_params' => [
+                'driver' => 'file',
+            ],
+        ],
     ],
 
     /*

+ 38 - 0
src/Contracts/Grid/ColumnSelectorStore.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace Dcat\Admin\Contracts\Grid;
+
+use Dcat\Admin\Grid;
+
+interface ColumnSelectorStore
+{
+    /**
+     * @param Grid $grid
+     *
+     * @return mixed
+     */
+    public function setGrid(Grid $grid);
+
+    /**
+     * 存储数据.
+     *
+     * @param array $input
+     *
+     * @return void
+     */
+    public function store(array $input);
+
+    /**
+     * 获取数据.
+     *
+     * @return array|null
+     */
+    public function get();
+
+    /**
+     * 移除.
+     *
+     * @return void
+     */
+    public function forget();
+}

+ 30 - 0
src/Grid/ColumnSelector/CacheStore.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Dcat\Admin\Grid\ColumnSelector;
+
+class CacheStore extends SessionStore
+{
+    protected $driver;
+    protected $ttl;
+
+    public function __construct($driver = 'file', $ttl = 25920000)
+    {
+        $this->driver = cache()->driver($driver);
+        $this->ttl = $ttl;
+    }
+
+    public function store(array $input)
+    {
+        $this->driver->put($this->getVisibleColumnsKey(), $input, $this->ttl);
+    }
+
+    public function get()
+    {
+        return $this->driver->get($this->getVisibleColumnsKey());
+    }
+
+    public function forget()
+    {
+        $this->driver->forget($this->getVisibleColumnsKey());
+    }
+}

+ 39 - 0
src/Grid/ColumnSelector/SessionStore.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace Dcat\Admin\Grid\ColumnSelector;
+
+use Dcat\Admin\Contracts\Grid\ColumnSelectorStore;
+use Dcat\Admin\Grid;
+
+class SessionStore implements ColumnSelectorStore
+{
+    /**
+     * @var Grid
+     */
+    protected $grid;
+
+    public function setGrid(Grid $grid)
+    {
+        $this->grid = $grid;
+    }
+
+    public function store(array $input)
+    {
+        session()->put($this->getVisibleColumnsKey(), $input);
+    }
+
+    public function get()
+    {
+        return session()->get($this->getVisibleColumnsKey());
+    }
+
+    public function forget()
+    {
+        session()->remove($this->getVisibleColumnsKey());
+    }
+
+    protected function getVisibleColumnsKey()
+    {
+        return $this->grid->getName().'/'.request()->path();
+    }
+}

+ 26 - 5
src/Grid/Concerns/CanHidesColumns.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Grid\Concerns;
 
+use Dcat\Admin\Contracts\Grid\ColumnSelectorStore;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Grid\Tools\ColumnSelector;
 use Dcat\Admin\Support\Helper;
@@ -16,6 +17,11 @@ trait CanHidesColumns
      */
     public $hiddenColumns = [];
 
+    /**
+     * @var ColumnSelectorStore
+     */
+    private $columnSelectorStorage;
+
     /**
      * Remove column selector on grid.
      *
@@ -205,7 +211,7 @@ trait CanHidesColumns
         })->toArray();
     }
 
-    protected function hasColumnSelectorRequestInput()
+    public function hasColumnSelectorRequestInput()
     {
         return $this->request->has($this->getColumnSelectorQueryName());
     }
@@ -216,16 +222,31 @@ trait CanHidesColumns
             return;
         }
 
-        session()->put($this->getVisibleColumnsKey(), $input);
+        $this->getColumnSelectorStorage()->store($input);
     }
 
     protected function getVisibleColumnsFromStorage()
     {
-        return session()->get($this->getVisibleColumnsKey());
+        return $this->getColumnSelectorStorage()->get();
     }
 
-    protected function getVisibleColumnsKey()
+    /**
+     * @return ColumnSelectorStore
+     */
+    public function getColumnSelectorStorage()
     {
-        return $this->getName().'/'.$this->request->path();
+        return $this->columnSelectorStorage ?: ($this->columnSelectorStorage = $this->makeColumnSelectorStorage());
+    }
+
+    protected function makeColumnSelectorStorage()
+    {
+        $store = config('admin.grid.column_selector.store') ?: Grid\ColumnSelector\SessionStore::class;
+        $params = (array) config('admin.grid.column_selector.store_params') ?: [];
+
+        $storage = app($store, $params);
+
+        $storage->setGrid($this);
+
+        return $storage;
     }
 }

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

@@ -52,6 +52,14 @@ trait HasQuickSearch
         });
     }
 
+    /**
+     * @return bool
+     */
+    public function allowQuickSearch()
+    {
+        return $this->quickSearch ? true : false;
+    }
+
     /**
      * @return Tools\QuickSearch
      */