Explorar o código

:hammer: 列隐藏功能兼容组合表头功能

jqh %!s(int64=5) %!d(string=hai) anos
pai
achega
5c7d25d23f

+ 1 - 0
resources/assets/dcat/sass/components/_button.scss

@@ -193,6 +193,7 @@ a.btn-sm, .btn-group-sm > a.btn {
 .btn-primary.btn-outline:hover,
 .btn-primary.btn-outline.active {
   background: rgba($primary, .05);
+  color: $primary;
 }
 
 .number-group {

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

@@ -12,7 +12,7 @@
     <div class="table-responsive {{ $grid->option('table_collapse') ? 'table-collapse' : '' }} table-wrapper complex-container table-middle mt-1">
         <table class="{{ $grid->formatTableClass() }}" id="{{ $tableId }}" >
             <thead>
-            @if ($headers = $grid->getComplexHeaders())
+            @if ($headers = $grid->getVisibleComplexHeaders())
                 <tr>
                     @foreach($headers as $header)
                         {!! $header->render() !!}

+ 0 - 3
src/Grid.php

@@ -405,9 +405,6 @@ class Grid
         if ($this->options['show_bordered']) {
             $this->addTableClass(['table-bordered', 'complex-headers', 'data-table']);
         }
-        if ($this->getComplexHeaders()) {
-            $this->addTableClass('table-text-center');
-        }
 
         return implode(' ', array_unique((array) $this->options['table_class']));
     }

+ 2 - 27
src/Grid/Column.php

@@ -341,34 +341,9 @@ class Column
      */
     public function hide()
     {
-        return $this->responsive(0);
-    }
-
-    /**
-     * data-priority=”1″ 保持可见,但可以在下拉列表筛选隐藏。
-     * data-priority=”2″ 480px 分辨率以下可见
-     * data-priority=”3″ 640px 以下可见
-     * data-priority=”4″ 800px 以下可见
-     * data-priority=”5″ 960px 以下可见
-     * data-priority=”6″ 1120px 以下可见
-     *
-     * @param int $priority
-     *
-     * @return $this
-     */
-    public function responsive(?int $priority = 1)
-    {
-        $this->grid->responsive();
-
-        return $this->setHeaderAttributes(['data-priority' => $priority]);
-    }
+        $this->grid->hideColumns($this->getName());
 
-    /**
-     * @return int|null
-     */
-    public function getDataPriority()
-    {
-        return isset($this->titleHtmlAttributes['data-priority']) ? $this->titleHtmlAttributes['data-priority'] : null;
+        return $this;
     }
 
     /**

+ 15 - 25
src/Grid/ComplexHeader.php

@@ -14,6 +14,11 @@ class ComplexHeader extends Widget
      */
     protected $grid;
 
+    /**
+     * @var string
+     */
+    protected $column;
+
     /**
      * @var string
      */
@@ -29,10 +34,11 @@ class ComplexHeader extends Widget
      */
     protected $html = [];
 
-    public function __construct(Grid $grid, string $label, array $columnNames)
+    public function __construct(Grid $grid, ?string $column, array $columnNames, ?string $label = null)
     {
         $this->grid = $grid;
-        $this->label = admin_trans_field($label);
+        $this->column = $column;
+        $this->label = $label ?: admin_trans_field($column);
         $this->columnNames = collect($columnNames);
 
         $this->addDefaultAttributes();
@@ -58,40 +64,24 @@ class ComplexHeader extends Widget
 
     /**
      * 默认隐藏字段
-     * 开启responsive模式有效.
      *
      * @return $this
      */
     public function hide()
     {
-        return $this->responsive(0);
+        $this->grid->hideColumns($this->column);
+
+        return $this;
     }
 
-    public function getLabel()
+    public function getName()
     {
-        return $this->label;
+        return $this->column;
     }
 
-    /**
-     * 允许使用responsive
-     * 开启responsive模式有效.
-     *
-     * data-priority=”1″ 保持可见,但可以在下拉列表筛选隐藏。
-     * data-priority=”2″ 480px 分辨率以下可见
-     * data-priority=”3″ 640px 以下可见
-     * data-priority=”4″ 800px 以下可见
-     * data-priority=”5″ 960px 以下可见
-     * data-priority=”6″ 1120px 以下可见
-     *
-     * @param int $priority
-     *
-     * @return $this
-     */
-    public function responsive(int $priority = 1)
+    public function getLabel()
     {
-        $this->setHtmlAttribute('data-priority', $priority);
-
-        return $this;
+        return $this->label;
     }
 
     /**

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

@@ -88,12 +88,55 @@ trait CanHidesColumns
      *
      * @return array
      */
-    protected function getVisibleColumnsFromQuery()
+    public function getVisibleColumnsFromQuery()
     {
+        if (isset($this->visibleColumnsFromQuery)) {
+            return $this->visibleColumnsFromQuery;
+        }
+
         $columns = explode(',', request($this->getColumnSelectorQueryName()));
 
-        return array_filter($columns) ?:
-            array_values(array_diff($this->columnNames, $this->hiddenColumns));
+        return $this->visibleColumnsFromQuery = array_filter($columns) ?:
+            array_values(array_diff(
+                $this->getComplexHeaderNames() ?: $this->columnNames, $this->hiddenColumns
+            ));
+    }
+
+    protected function formatWithComplexHeaders(array $columns)
+    {
+        if (empty($this->getComplexHeaderNames())) {
+            return $columns;
+        }
+
+        return $this->getComplexHeaders()
+            ->map(function (Grid\ComplexHeader $header) use ($columns) {
+                if (! in_array($header->getName(), $columns, true)) {
+                    return;
+                }
+
+                return $header->getColumnNames() ?: $this->getName();
+            })
+            ->filter()
+            ->flatten()
+            ->toArray();
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getVisibleComplexHeaders()
+    {
+        $visible = $this->getVisibleColumnsFromQuery();
+
+        if (empty($visible)) {
+            return $this->getComplexHeaders();
+        }
+
+        array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
+
+        return $this->getComplexHeaders()->filter(function ($column) use ($visible) {
+            return in_array($column->getName(), $visible);
+        });
     }
 
     /**
@@ -103,7 +146,9 @@ trait CanHidesColumns
      */
     public function getVisibleColumns()
     {
-        $visible = $this->getVisibleColumnsFromQuery();
+        $visible = $this->formatWithComplexHeaders(
+            $this->getVisibleColumnsFromQuery()
+        );
 
         if (empty($visible)) {
             return $this->columns;
@@ -123,7 +168,9 @@ trait CanHidesColumns
      */
     public function getVisibleColumnNames()
     {
-        $visible = $this->getVisibleColumnsFromQuery();
+        $visible = $this->formatWithComplexHeaders(
+            $this->getVisibleColumnsFromQuery()
+        );
 
         if (empty($visible)) {
             return $this->columnNames;

+ 20 - 10
src/Grid/Concerns/HasComplexHeaders.php

@@ -17,12 +17,13 @@ trait HasComplexHeaders
     /**
      * Merge cells.
      *
-     * @param string $label
+     * @param string $column
      * @param array  $columnNames
+     * @param string $label
      *
      * @return ComplexHeader
      */
-    public function combine(string $label, array $columnNames)
+    public function combine(string $column, array $columnNames, string $label = null)
     {
         if (count($columnNames) < 2) {
             throw new InvalidArgumentException('Invalid column names.');
@@ -34,11 +35,25 @@ trait HasComplexHeaders
 
         $this->withBorder();
 
-        return $this->complexHeaders[$label] = new ComplexHeader($this, $label, $columnNames);
+        return $this->complexHeaders[$column] = new ComplexHeader($this, $column, $columnNames, $label);
+    }
+
+    /**
+     * @return ComplexHeader[]
+     */
+    public function getComplexHeaderNames()
+    {
+        if (! $this->complexHeaders) {
+            return [];
+        }
+
+        return $this->complexHeaders->map(function ($header) {
+            return $header->getName();
+        })->toArray();
     }
 
     /**
-     * @return ComplexHeader[]|Collection
+     * @return ComplexHeader[]|Collection|null
      */
     public function getComplexHeaders()
     {
@@ -109,12 +124,7 @@ trait HasComplexHeaders
 
         /* @var Column $column */
         foreach ($columns as $name => $column) {
-            $header = new ComplexHeader($this, $column->getLabel(), [$name]);
-            $prio = $column->getDataPriority();
-
-            if (is_int($prio)) {
-                $header->responsive($prio);
-            }
+            $header = new ComplexHeader($this, $column->getName(), [$name], $column->getLabel());
 
             if ($html = $column->renderHeader()) {
                 $header->append($html);

+ 16 - 2
src/Grid/Tools/ColumnSelector.php

@@ -76,7 +76,19 @@ class ColumnSelector extends AbstractTool
      */
     protected function getVisibleColumnNames()
     {
-        return array_filter($this->grid->getVisibleColumnNames(), function ($v) {
+        $visible = $this->grid->getVisibleColumnsFromQuery();
+
+        $columns = $this->grid->getComplexHeaderNames() ?: $this->grid->getColumnNames();
+
+        if (! empty($visible)) {
+            array_push($visible, Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME);
+
+            $columns = collect($columns)->filter(function ($column) use ($visible) {
+                return in_array($column, $visible);
+            })->toArray();
+        }
+
+        return array_filter($columns, function ($v) {
             return ! in_array($v, [Grid\Column::SELECT_COLUMN_NAME, Grid\Column::ACTION_COLUMN_NAME]);
         });
     }
@@ -86,7 +98,9 @@ class ColumnSelector extends AbstractTool
      */
     protected function getGridColumns()
     {
-        return $this->grid->columns()->map(function (Grid\Column $column) {
+        $columns = $this->grid->getComplexHeaders() ?: $this->grid->columns();
+
+        return $columns->map(function ($column) {
             $name = $column->getName();
 
             if ($this->isColumnIgnored($name)) {