Explorar el Código

重构valueFilter功能

jqh hace 5 años
padre
commit
cb2934d29e

+ 3 - 5
src/Controllers/LogController.php

@@ -45,13 +45,13 @@ class LogController extends Controller
             $color = Arr::get(OperationLogModel::$methodColors, $method, 'default');
 
             return "<span class=\"label label-$color\">$method</span>";
-        })->valueAsFilter();
+        })->onlyValueFilter();
 
         $grid->path(trans('admin.uri'))->responsive()->display(function ($v) {
             return "<code>$v</code>";
-        })->valueAsFilter();
+        })->onlyValueFilter();
 
-        $grid->ip('IP')->valueAsFilter()->responsive();
+        $grid->ip('IP')->onlyValueFilter()->responsive();
 
         $grid->input->responsive()->display(function ($input) {
             $input = json_decode($input, true);
@@ -90,9 +90,7 @@ class LogController extends Controller
                 );
 
             $filter->like('path', trans('admin.uri'));
-
             $filter->equal('ip', 'IP');
-
             $filter->between('created_at')->datetime();
         });
 

+ 34 - 2
src/Grid/Column.php

@@ -468,6 +468,14 @@ class Column
      * Set column filter.
      *
      * @example
+     *      $grid->username()->filter();
+     *
+     *      $grid->user()->filter('user.id');
+     *
+     *      $grid->user()->filter(function () {
+     *          return $this->user['id'];
+     *      });
+     *
      *      $grid->username()->filter(
      *          Grid\Column\Filter\StartWith::make(__('admin.username'))
      *      );
@@ -476,15 +484,39 @@ class Column
      *          Grid\Column\Filter\Equal::make(__('admin.created_at'))->date()
      *      );
      *
-     * @param Grid\Column\Filter $builder
+     * @param Grid\Column\Filter|string $filter
      *
      * @return $this
      */
-    public function filter(Grid\Column\Filter $filter)
+    public function filter($filter = null)
     {
+        $valueKey = is_string($filter) || $filter instanceof \Closure ? $filter : null;
+
+        if (! $filter || $valueKey) {
+            $filter = Grid\Column\Filter\Equal::make()->valueAsFilter($valueKey);
+        }
+
+        if (! $filter instanceof Grid\Column\Filter) {
+            throw new \InvalidArgumentException('The "$filter" must be a type of '.Grid\Column\Filter::class.'.');
+        }
+
         return $this->addHeader($filter);
     }
 
+    /**
+     * @param string|\Closure $valueKey
+     *
+     * @return Column
+     */
+    public function onlyValueFilter($valueKey = null)
+    {
+        return $this->filter(
+            Grid\Column\Filter\Equal::make()
+                ->valueAsFilter($valueKey)
+                ->hide()
+        );
+    }
+
     /**
      * Add a display callback.
      *

+ 100 - 1
src/Grid/Column/Filter.php

@@ -20,12 +20,65 @@ abstract class Filter implements Renderable
      */
     protected $parent;
 
+    /**
+     * @var string
+     */
+    protected $columnName;
+
+    /**
+     * @var \Closure[]
+     */
+    protected $resolvings = [];
+
+    /**
+     * @var bool
+     */
+    protected $display = true;
+
     /**
      * @param Column $column
      */
     public function setParent(Column $column)
     {
         $this->parent = $column;
+
+        $this->addResetButton();
+
+        foreach ($this->resolvings as $closure) {
+            $closure($this);
+        }
+    }
+
+    /**
+     * @return Column
+     */
+    public function parent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * @param \Closure $callback
+     *
+     * @return $this
+     */
+    public function resolving(\Closure $callback)
+    {
+        $this->resolvings[] = $callback;
+
+        return $this;
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return $this
+     */
+    public function setColumnName(string $name)
+    {
+        $this->columnName = $name;
+
+        return $this;
     }
 
     /**
@@ -35,7 +88,7 @@ abstract class Filter implements Renderable
      */
     public function columnName()
     {
-        return $this->parent->getName();
+        return $this->columnName ?: $this->parent->getName();
     }
 
     /**
@@ -60,6 +113,24 @@ abstract class Filter implements Renderable
         return request($this->queryName(), $default);
     }
 
+    /**
+     * Add reset button.
+     */
+    protected function addResetButton()
+    {
+        $this->parent->grid()->filtering(function () {
+            if (! $this->value()) {
+                return;
+            }
+
+            $style = $this->shouldDisplay() ? 'style=\'margin:3px 12px\'' : '';
+
+            return $this->parent->addHeader(
+                "&nbsp;<a class='fa fa-undo' href='{$this->urlWithoutFilter()}' {$style}></a>"
+            );
+        });
+    }
+
     /**
      * Get form action url.
      *
@@ -104,6 +175,34 @@ abstract class Filter implements Renderable
         return __("admin.{$key}");
     }
 
+    /**
+     * @param bool $value
+     *
+     * @return $this
+     */
+    public function display(bool $value)
+    {
+        $this->display = $value;
+
+        return $this;
+    }
+
+    /**
+     * @return $this
+     */
+    public function hide()
+    {
+        return $this->display(false);
+    }
+
+    /**
+     * @return bool
+     */
+    public function shouldDisplay()
+    {
+        return $this->display;
+    }
+
     /**
      * Add a query binding.
      *

+ 4 - 1
src/Grid/Column/Filter/Between.php

@@ -136,6 +136,10 @@ class Between extends Filter
      */
     public function render()
     {
+        if (! $this->shouldDisplay()) {
+            return;
+        }
+
         $script = <<<'JS'
 $('.dropdown-menu input').click(function(e) {
     e.stopPropagation();
@@ -176,7 +180,6 @@ JS;
         <li class="divider"></li>
         <li class="">
             <button class="btn btn-sm btn-primary column-filter-submit "><i class="fa fa-search"></i></button>
-            <span onclick="LA.reload('{$this->urlWithoutFilter()}')" class="btn btn-sm btn-default column-filter-all"><i class="fa fa-undo"></i></span>
         </li>
     </ul>
     </form>

+ 4 - 1
src/Grid/Column/Filter/Checkbox.php

@@ -30,6 +30,10 @@ JS;
 
     protected function renderCheckbox()
     {
+        if (! $this->shouldDisplay()) {
+            return;
+        }
+
         $value = $this->value([]);
 
         $this->addScript();
@@ -62,7 +66,6 @@ JS;
         <li class="divider"></li>
        <li class="">
             <button class="btn btn-sm btn-primary column-filter-submit "><i class="fa fa-search"></i></button>
-            <span onclick="LA.reload('{$this->urlWithoutFilter()}')" class="btn btn-sm btn-default column-filter-all"><i class="fa fa-undo"></i></span>
         </li>
     </ul>
 </form>

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

@@ -3,6 +3,7 @@
 namespace Dcat\Admin\Grid\Column\Filter;
 
 use Dcat\Admin\Admin;
+use Dcat\Admin\Grid\Column\ValueFilter;
 
 trait Input
 {
@@ -39,6 +40,10 @@ JS;
 
     protected function renderInput()
     {
+        if (! $this->shouldDisplay()) {
+            return;
+        }
+
         $this->addScript();
 
         $value = $this->value();
@@ -48,8 +53,7 @@ JS;
         return <<<HTML
 &nbsp;<span class="dropdown" style="position: absolute">
     <form action="{$this->formAction()}" pjax-container style="display: inline-block;">
-    <a href="javascript:void(0);" class="dropdown-toggle {$active}" data-toggle="dropdown">
-        <i class="fa fa-filter"></i>
+    <a href="javascript:void(0);" class="dropdown-toggle fa fa-filter {$active}" data-toggle="dropdown">
     </a>
     <ul class="dropdown-menu" role="menu" style="padding: 10px;box-shadow: 0 2px 3px 0 rgba(0,0,0,.2);left: -70px;border-radius: 0;font-weight:normal;background:#fff;">
         <li>
@@ -58,11 +62,27 @@ JS;
         <li class="divider"></li>
         <li class="">
             <button class="btn btn-sm btn-primary column-filter-submit "><i class="fa fa-search"></i></button>
-            <span onclick="LA.reload('{$this->urlWithoutFilter()}')" class="btn btn-sm btn-default column-filter-all"><i class="fa fa-undo"></i></span>
         </li>
     </ul>
     </form>
 </span>
 HTML;
     }
+
+
+    /**
+     * @param string|\Closure $valueKey
+     *
+     * @return $this
+     */
+    public function valueAsFilter($valueKey = null)
+    {
+        return $this->resolving(function () use ($valueKey) {
+            $valueFilter = new ValueFilter($this, $valueKey);
+
+            return $this->parent()->display(function ($value) use ($valueFilter) {
+                return $valueFilter->render($value);
+            });
+        });
+    }
 }

+ 0 - 34
src/Grid/Column/HasDisplayers.php

@@ -10,11 +10,6 @@ use Illuminate\Support\Collection;
 
 trait HasDisplayers
 {
-    /**
-     * @var ValueFilter
-     */
-    protected $valueFilter;
-
     /**
      * Display using display abstract.
      *
@@ -212,33 +207,4 @@ trait HasDisplayers
     {
         return $this->display('');
     }
-
-    /**
-     * @param string|\Closure $valueKey
-     * @param string|\Closure $operator
-     *
-     * @return $this
-     */
-    public function valueAsFilter($valueKey = null, $operator = '=')
-    {
-        $valueFilter = $this->getValueFilter();
-
-        $valueFilter->setup($valueKey, $operator);
-
-        return $this->display(function ($value) use ($valueFilter) {
-            return $valueFilter->render($value);
-        });
-    }
-
-    /**
-     * @return ValueFilter
-     */
-    public function getValueFilter()
-    {
-        if (! $this->valueFilter) {
-            $this->valueFilter = new ValueFilter($this);
-        }
-
-        return $this->valueFilter;
-    }
 }

+ 13 - 59
src/Grid/Column/ValueFilter.php

@@ -3,40 +3,26 @@
 namespace Dcat\Admin\Grid\Column;
 
 use Dcat\Admin\Admin;
-use Dcat\Admin\Grid\Column;
-use Dcat\Admin\Support\Helper;
 use Illuminate\Support\Arr;
 
 class ValueFilter
 {
     /**
-     * @var Column
+     * @var Filter
      */
-    protected $column;
+    protected $filter;
 
     /**
      * @var string|\Closure
      */
     protected $valueKey;
 
-    /**
-     * @var string|\Closure
-     */
-    protected $operator;
-
-    public function __construct(Column $column)
-    {
-        $this->column = $column;
-    }
-
-    public function setup($valueKey, $operator)
+    public function __construct(Filter $filter, $valueKey)
     {
+        $this->filter = $filter;
         $this->valueKey = $valueKey;
-        $this->operator = $operator;
 
         $this->addStyle();
-        $this->addResetButton();
-        $this->addApplyFilterCallback();
     }
 
     protected function addStyle()
@@ -44,72 +30,40 @@ class ValueFilter
         Admin::style('.value-filter .dashed{border-bottom:1px dashed}.value-filter:hover+a{opacity:1!important}');
     }
 
-    protected function addResetButton()
+    protected function column()
     {
-        $this->column->grid()->filtering(function () {
-            if (! $this->value()) {
-                return;
-            }
-
-            return $this->column->addHeader("&nbsp;<a class='fa fa-undo' href='{$this->resetUrl()}'></a>");
-        });
-    }
-
-    protected function addApplyFilterCallback()
-    {
-        $this->column->grid()->filtering(function () {
-            if (! ($value = $this->value())) {
-                return;
-            }
-            $operator = $this->operator;
-            $columnName = $this->column->getName();
-            $model = $this->column->grid()->model();
-
-            if (is_string($operator)) {
-                $model->where($columnName, $operator, $value);
-            } elseif ($operator instanceof \Closure) {
-                $operator($model, $value, $columnName);
-            }
-        });
+        return $this->filter->parent();
     }
 
     public function queryName()
     {
-        $name = $this->column->grid()->getName();
-        $column = $this->column->getName();
-
-        return 'value-filter'.($name ? "-{$name}" : '')."-{$column}";
-    }
-
-    public function resetUrl()
-    {
-        return Helper::fullUrlWithoutQuery($this->queryName());
+        return $this->filter->queryName();
     }
 
     public function value()
     {
-        return request($this->queryName());
+        return $this->filter->value();
     }
 
     protected function originalValue()
     {
         if (! $this->valueKey) {
-            return $this->column->getOriginal();
+            return $this->column()->getOriginal();
         }
 
-        $row = $this->column->getOriginalModel();
+        $row = $this->column()->getOriginalModel();
 
         if ($this->valueKey instanceof \Closure) {
             return $this->valueKey->call(
                 $row,
-                $this->column->getName()
+                $this->column()->getName()
             );
         }
 
         return Arr::get(
             $row->toArray(),
             $this->valueKey,
-            $this->column->getOriginal()
+            $this->column()->getOriginal()
         );
     }
 
@@ -124,7 +78,7 @@ class ValueFilter
 
     public function render($value)
     {
-        $pageName = $this->column->grid()->model()->getPageName();
+        $pageName = $this->column()->grid()->model()->getPageName();
 
         $url = request()->fullUrlWithQuery([
             $this->queryName() => $this->originalValue(),