Jelajahi Sumber

update selector

jqh 5 tahun lalu
induk
melakukan
476cf903a0

+ 7 - 9
resources/views/grid/selector.blade.php

@@ -54,30 +54,28 @@
 </style>
 
 <div class="grid-selector">
-    @foreach($selectors as $column => $selector)
+    @foreach($values as $column => $value)
         <div class="wrap">
-            <div class="select-label">{{ $selector['label'] }}</div>
+            <div class="select-label">{{ $value['label'] }}</div>
             <div class="select-options">
                 <ul>
-                    @foreach($selector['options'] as $value => $option)
+                    @foreach($value['options'] as $value => $option)
                         @php
                             $active = in_array($value, \Illuminate\Support\Arr::get($selected, $column, []));
                         @endphp
                         <li>
-                            <a href="{{ \Dcat\Admin\Grid\Tools\Selector::url($column, $value, true) }}"
+                            <a href="{{ $selector->url($column, $value, true) }}"
                                class="{{$active ? 'active' : ''}}">{{ $option }}</a>
-                            @if(!$active && $selector['type'] == 'many')
+                            @if(!$active && $value['type'] == 'many')
                                 &nbsp;
-                                <a href="{{ \Dcat\Admin\Grid\Tools\Selector::url($column, $value) }}" class="add"><i
-                                            class="fa fa-plus-square-o"></i></a>
+                                <a href="{{ $selector->url($column, $value) }}" class="add"><i class="fa fa-plus-square-o"></i></a>
                             @else
                                 <a style="visibility: hidden;"><i class="fa fa-plus-square-o"></i></a>
                             @endif
                         </li>
                     @endforeach
                     <li>
-                        <a href="{{ \Dcat\Admin\Grid\Tools\Selector::url($column) }}" class="clear"><i
-                                    class="fa fa-trash"></i></a>
+                        <a href="{{ $selector->url($column) }}" class="clear"><i class="fa fa-trash"></i></a>
                     </li>
                 </ul>
             </div>

+ 2 - 2
src/Grid/Concerns/HasSelector.php

@@ -22,7 +22,7 @@ trait HasSelector
      */
     public function selector(\Closure $closure)
     {
-        $this->_selector = new Selector();
+        $this->_selector = new Selector($this);
 
         call_user_func($closure, $this->_selector);
 
@@ -44,7 +44,7 @@ trait HasSelector
             return $this;
         }
 
-        $active = Selector::parseSelected();
+        $active = $this->_selector->parseSelected();
 
         $this->_selector->getSelectors()->each(function ($selector, $column) use ($active) {
             if (!array_key_exists($column, $active)) {

+ 43 - 22
src/Grid/Tools/Selector.php

@@ -2,12 +2,23 @@
 
 namespace Dcat\Admin\Grid\Tools;
 
-use Illuminate\Contracts\Support\Renderable;
+use Dcat\Admin\Grid;
+use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Collection;
 
-class Selector implements Renderable
+class Selector
 {
+    /**
+     * @var Grid
+     */
+    protected $grid;
+
+    /**
+     * @var Request
+     */
+    protected $request;
+
     /**
      * @var array|Collection
      */
@@ -16,14 +27,23 @@ class Selector implements Renderable
     /**
      * @var array
      */
-    protected static $selected;
+    protected $selected;
+
+    /**
+     * @var string
+     */
+    protected $queryKey;
 
     /**
      * Selector constructor.
      */
-    public function __construct()
+    public function __construct(Grid $grid)
     {
+        $this->grid      = $grid;
+        $this->request   = request();
         $this->selectors = new Collection();
+
+        $this->queryKey = $grid->getName().'_selector';
     }
 
     /**
@@ -34,7 +54,7 @@ class Selector implements Renderable
      *
      * @return $this
      */
-    public function select($column, $label, $options = [], $query = null)
+    public function select(string $column, $label, $options = [], ?\Closure $query = null)
     {
         return $this->addSelector($column, $label, $options, $query);
     }
@@ -47,7 +67,7 @@ class Selector implements Renderable
      *
      * @return $this
      */
-    public function selectOne($column, $label, $options = [], $query = null)
+    public function selectOne(string $column, $label, $options = [], ?\Closure $query = null)
     {
         return $this->addSelector($column, $label, $options, $query, 'one');
     }
@@ -61,7 +81,7 @@ class Selector implements Renderable
      *
      * @return $this
      */
-    protected function addSelector($column, $label, $options = [], $query = null, $type = 'many')
+    protected function addSelector(string $column, $label, $options = [], ?\Closure $query = null, $type = 'many')
     {
         if (is_array($label)) {
             if ($options instanceof \Closure) {
@@ -92,13 +112,13 @@ class Selector implements Renderable
     /**
      * @return array
      */
-    public static function parseSelected()
+    public function parseSelected()
     {
-        if (! is_null(static::$selected)) {
-            return static::$selected;
+        if (! is_null($this->selected)) {
+            return $this->selected;
         }
 
-        $selected = request('_selector', []);
+        $selected = $this->request->input($this->queryKey, []);
         if (! is_array($selected)) {
             return [];
         }
@@ -111,7 +131,7 @@ class Selector implements Renderable
             $value = explode(',', $value);
         }
 
-        return static::$selected = $selected;
+        return $this->selected = $selected;
     }
 
     /**
@@ -121,18 +141,18 @@ class Selector implements Renderable
      *
      * @return string
      */
-    public static function url($column, $value = null, $add = false)
+    public function url($column, $value = null, $add = false)
     {
-        $query = request()->query();
+        $query = $this->request->query();
 
-        $selected = static::parseSelected();
+        $selected = $this->parseSelected();
 
         $options = Arr::get($selected, $column, []);
 
         if (is_null($value)) {
-            Arr::forget($query, "_selector.{$column}");
+            Arr::forget($query, "{$this->queryKey}.{$column}");
 
-            return request()->fullUrlWithQuery($query);
+            return $this->request->fullUrlWithQuery($query);
         }
 
         if (in_array($value, $options)) {
@@ -145,12 +165,12 @@ class Selector implements Renderable
         }
 
         if (! empty($options)) {
-            Arr::set($query, "_selector.{$column}", implode(',', $options));
+            Arr::set($query, "{$this->queryKey}.{$column}", implode(',', $options));
         } else {
-            Arr::forget($query, "_selector.{$column}");
+            Arr::forget($query, "{$this->queryKey}.{$column}");
         }
 
-        return request()->fullUrlWithQuery($query);
+        return $this->request->fullUrlWithQuery($query);
     }
 
     /**
@@ -159,8 +179,9 @@ class Selector implements Renderable
     public function render()
     {
         return view('admin::grid.selector', [
-            'selectors' => $this->selectors,
-            'selected'  => static::parseSelected(),
+            'selector' => $this,
+            'values'   => $this->selectors,
+            'selected' => $this->parseSelected(),
         ]);
     }