Add default filtering for non DBO grid views
authorMarcel Werk <burntime@woltlab.com>
Wed, 6 Nov 2024 12:00:51 +0000 (13:00 +0100)
committerMarcel Werk <burntime@woltlab.com>
Wed, 6 Nov 2024 12:00:51 +0000 (13:00 +0100)
wcfsetup/install/files/lib/system/view/grid/ArrayGridView.class.php
wcfsetup/install/files/lib/system/view/grid/DatabaseObjectListGridView.class.php
wcfsetup/install/files/lib/system/view/grid/ExceptionLogGridView.class.php
wcfsetup/install/files/lib/system/view/grid/filter/IGridViewFilter.class.php
wcfsetup/install/files/lib/system/view/grid/filter/SelectFilter.class.php
wcfsetup/install/files/lib/system/view/grid/filter/TextFilter.class.php

index b3c648069e33ef4b53c44460ca84a3414d76b994..2c588b40e028fde4edac583d572ecbd48e9a6706 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace wcf\system\view\grid;
 
+use LogicException;
+
 abstract class ArrayGridView extends AbstractGridView
 {
     protected array $dataArray;
@@ -40,10 +42,25 @@ abstract class ArrayGridView extends AbstractGridView
     {
         if (!isset($this->dataArray)) {
             $this->dataArray = $this->loadDataArray();
+            $this->applyFilters();
         }
 
         return $this->dataArray;
     }
 
+    protected function applyFilters(): void
+    {
+        foreach ($this->getActiveFilters() as $key => $value) {
+            $column = $this->getColumn($key);
+            if (!$column) {
+                throw new LogicException("Unknown column '" . $key . "'");
+            }
+
+            $this->dataArray = \array_filter($this->dataArray, function (array $row) use ($column, $value) {
+                return $column->getFilter()->matches($value, $row[$column->getID()]);
+            });
+        }
+    }
+
     protected abstract function loadDataArray(): array;
 }
index 486477c18dffbfd33e02c8a5eab146fa2de9c438..f12ed786f051f990fa92fa4ca1b0e4dfb617968d 100644 (file)
@@ -59,7 +59,7 @@ abstract class DatabaseObjectListGridView extends AbstractGridView
         return $this->objectList;
     }
 
-    private function applyFilters(): void
+    protected function applyFilters(): void
     {
         foreach ($this->getActiveFilters() as $key => $value) {
             $column = $this->getColumn($key);
index 10b041d4c533f81528513e18d9514aabe4f8ed62..4929d185bf073b18c4148d6e9e2c91e0fafa3f47 100644 (file)
@@ -65,6 +65,7 @@ final class ExceptionLogGridView extends ArrayGridView
         return $row['exceptionID'];
     }
 
+    #[\Override]
     protected function loadDataArray(): array
     {
         if (!empty($this->getActiveFilters()['exceptionID'])) {
@@ -125,6 +126,12 @@ final class ExceptionLogGridView extends ArrayGridView
         return [];
     }
 
+    #[\Override]
+    protected function applyFilters(): void
+    {
+        // Overwrite the default filtering, as this is already applied when the data is loaded.
+    }
+
     private function getAvailableLogFiles(): array
     {
         if (!isset($this->availableLogFiles)) {
index aecf4cd9ccd376481260c3248c83226ad86a9bfd..4862acbb5202cae263abc56248919718725e46b0 100644 (file)
@@ -11,5 +11,7 @@ interface IGridViewFilter
 
     public function applyFilter(DatabaseObjectList $list, string $id, string $value): void;
 
+    public function matches(string $filterValue, string $rowValue): bool;
+
     public function renderValue(string $value): string;
 }
index 643ab8c9c7387f45770ace08fd713afdc6c687cd..f2000710f69f1cfe93c37132656a638010ab63ab 100644 (file)
@@ -25,6 +25,12 @@ class SelectFilter implements IGridViewFilter
         $list->getConditionBuilder()->add("$id = ?", [$value]);
     }
 
+    #[\Override]
+    public function matches(string $filterValue, string $rowValue): bool
+    {
+        return $filterValue === $rowValue;
+    }
+
     #[\Override]
     public function renderValue(string $value): string
     {
index 0f4b5aed69c6f87118f6e5740c34618473713ae2..52605e79457149a502539eef96189ca5783c962e 100644 (file)
@@ -21,6 +21,12 @@ class TextFilter implements IGridViewFilter
         $list->getConditionBuilder()->add("$id LIKE ?", ['%' . $value . '%']);
     }
 
+    #[\Override]
+    public function matches(string $filterValue, string $rowValue): bool
+    {
+        return \str_contains(\mb_strtolower($rowValue), \mb_strtolower($filterValue));
+    }
+
     #[\Override]
     public function renderValue(string $value): string
     {