From 86d1f2ca2eda32d577e156d41a2ef8b99c1d116a Mon Sep 17 00:00:00 2001 From: Marcel Werk Date: Sun, 21 Sep 2025 15:58:57 +0200 Subject: [PATCH 1/7] Move view filters to unified namespace --- .../lib/system/listView/AbstractListView.class.php | 12 ++++++------ .../system/listView/user/ArticleListView.class.php | 6 +++--- .../system/listView/user/MembersListView.class.php | 6 +++--- .../filter/AbstractFilter.class.php | 6 +++--- .../filter/BooleanFilter.class.php | 2 +- .../filter/CategoryFilter.class.php | 4 ++-- .../{listView => view}/filter/DateFilter.class.php | 4 ++-- .../filter/FormOptionFilter.class.php | 4 +--- .../filter/IViewFilter.class.php} | 6 +++--- .../{listView => view}/filter/LabelFilter.class.php | 4 ++-- .../filter/NumericFilter.class.php | 4 ++-- .../{listView => view}/filter/SelectFilter.class.php | 4 ++-- .../{listView => view}/filter/TextFilter.class.php | 2 +- .../{listView => view}/filter/TimeFilter.class.php | 4 ++-- .../{listView => view}/filter/UserFilter.class.php | 4 ++-- .../filter/exception/InvalidFilterValue.class.php | 4 ++-- 16 files changed, 37 insertions(+), 39 deletions(-) rename wcfsetup/install/files/lib/system/{listView => view}/filter/AbstractFilter.class.php (87%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/BooleanFilter.class.php (96%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/CategoryFilter.class.php (94%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/DateFilter.class.php (97%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/FormOptionFilter.class.php (92%) rename wcfsetup/install/files/lib/system/{listView/filter/IListViewFilter.class.php => view/filter/IViewFilter.class.php} (90%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/LabelFilter.class.php (95%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/NumericFilter.class.php (96%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/SelectFilter.class.php (94%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/TextFilter.class.php (96%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/TimeFilter.class.php (97%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/UserFilter.class.php (93%) rename wcfsetup/install/files/lib/system/{listView => view}/filter/exception/InvalidFilterValue.class.php (65%) diff --git a/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php b/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php index c3d142124b9..6abc67bea49 100644 --- a/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php +++ b/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php @@ -13,8 +13,8 @@ use wcf\system\interaction\IInteractionProvider; use wcf\system\interaction\InteractionContextMenuComponent; use wcf\system\interaction\InteractionContextMenuComponentConfiguration; -use wcf\system\listView\filter\IListViewFilter; -use wcf\system\listView\filter\exception\InvalidFilterValue; +use wcf\system\view\filter\IViewFilter; +use wcf\system\view\filter\exception\InvalidFilterValue; use wcf\system\request\LinkHandler; use wcf\system\WCF; use wcf\util\StringUtil; @@ -65,7 +65,7 @@ abstract class AbstractListView private array $availableSortFields = []; /** - * @var array + * @var array */ private array $availableFilters = []; @@ -470,13 +470,13 @@ public function getAvailableSortFields(): array return $this->availableSortFields; } - public function addAvailableFilter(IListViewFilter $filter): void + public function addAvailableFilter(IViewFilter $filter): void { $this->availableFilters[$filter->getId()] = $filter; } /** - * @param IListViewFilter[] $filters + * @param IViewFilter[] $filters */ public function addAvailableFilters(array $filters): void { @@ -491,7 +491,7 @@ public function setAllowFiltering(bool $allowFiltering): void } /** - * @return array + * @return array */ public function getAvailableFilters(): array { diff --git a/wcfsetup/install/files/lib/system/listView/user/ArticleListView.class.php b/wcfsetup/install/files/lib/system/listView/user/ArticleListView.class.php index 536c25b39d1..6ba056d36c3 100644 --- a/wcfsetup/install/files/lib/system/listView/user/ArticleListView.class.php +++ b/wcfsetup/install/files/lib/system/listView/user/ArticleListView.class.php @@ -13,9 +13,9 @@ use wcf\system\interaction\user\ArticleInteractions; use wcf\system\label\LabelHandler; use wcf\system\listView\AbstractListView; -use wcf\system\listView\filter\BooleanFilter; -use wcf\system\listView\filter\LabelFilter; -use wcf\system\listView\filter\TextFilter; +use wcf\system\view\filter\BooleanFilter; +use wcf\system\view\filter\LabelFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\listView\ListViewSortField; use wcf\system\visitTracker\VisitTracker; use wcf\system\WCF; diff --git a/wcfsetup/install/files/lib/system/listView/user/MembersListView.class.php b/wcfsetup/install/files/lib/system/listView/user/MembersListView.class.php index f42b9ce855e..17d7ff5539c 100644 --- a/wcfsetup/install/files/lib/system/listView/user/MembersListView.class.php +++ b/wcfsetup/install/files/lib/system/listView/user/MembersListView.class.php @@ -8,9 +8,9 @@ use wcf\event\listView\user\MembersListViewInitialized; use wcf\system\interaction\user\UserProfileInteractions; use wcf\system\listView\AbstractListView; -use wcf\system\listView\filter\exception\InvalidFilterValue; -use wcf\system\listView\filter\SelectFilter; -use wcf\system\listView\filter\TextFilter; +use wcf\system\view\filter\exception\InvalidFilterValue; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\listView\ListViewSortField; use wcf\system\user\storage\UserStorageHandler; use wcf\system\WCF; diff --git a/wcfsetup/install/files/lib/system/listView/filter/AbstractFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/AbstractFilter.class.php similarity index 87% rename from wcfsetup/install/files/lib/system/listView/filter/AbstractFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/AbstractFilter.class.php index 4a9dbd82fda..74335698bb7 100644 --- a/wcfsetup/install/files/lib/system/listView/filter/AbstractFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/AbstractFilter.class.php @@ -1,20 +1,20 @@ * @since 6.2 */ -abstract class AbstractFilter implements IListViewFilter +abstract class AbstractFilter implements IViewFilter { public function __construct( protected readonly string $id, diff --git a/wcfsetup/install/files/lib/system/listView/filter/BooleanFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php similarity index 96% rename from wcfsetup/install/files/lib/system/listView/filter/BooleanFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php index 652ebdb1d31..dc2e0966b23 100644 --- a/wcfsetup/install/files/lib/system/listView/filter/BooleanFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php @@ -1,6 +1,6 @@ * @since 6.2 */ -interface IListViewFilter +interface IViewFilter { /** * Returns the form field for the input of this filter. diff --git a/wcfsetup/install/files/lib/system/listView/filter/LabelFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/LabelFilter.class.php similarity index 95% rename from wcfsetup/install/files/lib/system/listView/filter/LabelFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/LabelFilter.class.php index 1276d9352a9..b7451a2e90f 100644 --- a/wcfsetup/install/files/lib/system/listView/filter/LabelFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/LabelFilter.class.php @@ -1,12 +1,12 @@ Date: Tue, 23 Sep 2025 15:31:46 +0200 Subject: [PATCH 2/7] Migrate grid view filters to list view filters Closes #6459 --- .../lib/action/GridViewFilterAction.class.php | 8 +- .../core/gridViews/GetRows.class.php | 21 ++- .../core/listViews/GetItems.class.php | 21 ++- .../gridView/AbstractGridView.class.php | 98 ++++++++---- .../system/gridView/GridViewColumn.class.php | 39 ++++- .../admin/ACPSessionGridView.class.php | 31 ++-- .../admin/ACPSessionLogGridView.class.php | 18 +-- .../gridView/admin/AdGridView.class.php | 12 +- .../gridView/admin/ArticleGridView.class.php | 99 ++++++------ .../admin/AttachmentGridView.class.php | 38 ++--- .../gridView/admin/BBCodeGridView.class.php | 6 +- .../BBCodeMediaProviderGridView.class.php | 8 +- .../gridView/admin/BoxGridView.class.php | 91 ++++++----- .../admin/CaptchaQuestionGridView.class.php | 12 +- .../admin/ContactOptionGridView.class.php | 20 ++- .../admin/ContactRecipientGridView.class.php | 12 +- .../gridView/admin/CronjobGridView.class.php | 16 +- .../admin/CronjobLogGridView.class.php | 24 ++- .../gridView/admin/EmailLogGridView.class.php | 31 ++-- .../admin/ExceptionLogGridView.class.php | 18 +-- .../gridView/admin/LabelGridView.class.php | 16 +- .../admin/LabelGroupGridView.class.php | 18 ++- .../gridView/admin/LanguageGridView.class.php | 18 +-- .../admin/LanguageItemGridView.class.php | 106 +++++-------- .../gridView/admin/MenuGridView.class.php | 20 +-- .../admin/ModificationLogGridView.class.php | 29 ++-- .../gridView/admin/NoticeGridView.class.php | 8 +- .../gridView/admin/PackageGridView.class.php | 12 +- .../PackageUpdateServerGridView.class.php | 32 ++-- .../gridView/admin/PageGridView.class.php | 142 ++++++++--------- .../admin/PaidSubscriptionGridView.class.php | 30 ++-- ...bscriptionTransactionLogGridView.class.php | 34 +++-- .../PaidSubscriptionUserGridView.class.php | 23 +-- .../admin/ReactionTypeGridView.class.php | 12 +- .../gridView/admin/SmileyGridView.class.php | 20 +-- .../gridView/admin/StyleGridView.class.php | 6 +- .../gridView/admin/TagGridView.class.php | 19 ++- .../gridView/admin/TemplateGridView.class.php | 30 ++-- .../admin/TemplateGroupGridView.class.php | 22 ++- .../gridView/admin/TrophyGridView.class.php | 12 +- ...serAuthenticationFailureGridView.class.php | 41 +++-- .../UserGroupAssignmentGridView.class.php | 16 +- .../admin/UserGroupGridView.class.php | 10 +- .../gridView/admin/UserRankGridView.class.php | 16 +- .../admin/UserTrophyGridView.class.php | 23 ++- .../gridView/filter/AbstractFilter.class.php | 33 ---- .../gridView/filter/BooleanFilter.class.php | 47 ------ .../gridView/filter/CategoryFilter.class.php | 55 ------- .../gridView/filter/DateFilter.class.php | 136 ----------------- .../gridView/filter/IGridViewFilter.class.php | 35 ----- .../gridView/filter/NumericFilter.class.php | 92 ----------- .../gridView/filter/SelectFilter.class.php | 57 ------- .../gridView/filter/TextFilter.class.php | 37 ----- .../gridView/filter/TimeFilter.class.php | 137 ----------------- .../gridView/filter/UserFilter.class.php | 49 ------ .../exception/InvalidFilterValue.class.php | 13 -- .../user/ModerationQueueGridView.class.php | 144 +++++++++--------- .../listView/AbstractListView.class.php | 17 ++- .../view/filter/BooleanFilter.class.php | 9 ++ .../system/view/filter/FloatFilter.class.php | 37 +++++ .../filter/I18nTextFilter.class.php | 8 +- .../view/filter/IntegerFilter.class.php | 38 +++++ .../filter/IpAddressFilter.class.php | 14 +- .../view/filter/NumericFilter.class.php | 26 +--- .../filter/ObjectIdFilter.class.php | 14 +- 65 files changed, 919 insertions(+), 1417 deletions(-) delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/AbstractFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/BooleanFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/CategoryFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/DateFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/IGridViewFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/NumericFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/SelectFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/TextFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/TimeFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/UserFilter.class.php delete mode 100644 wcfsetup/install/files/lib/system/gridView/filter/exception/InvalidFilterValue.class.php create mode 100644 wcfsetup/install/files/lib/system/view/filter/FloatFilter.class.php rename wcfsetup/install/files/lib/system/{gridView => view}/filter/I18nTextFilter.class.php (82%) create mode 100644 wcfsetup/install/files/lib/system/view/filter/IntegerFilter.class.php rename wcfsetup/install/files/lib/system/{gridView => view}/filter/IpAddressFilter.class.php (74%) rename wcfsetup/install/files/lib/system/{gridView => view}/filter/ObjectIdFilter.class.php (67%) diff --git a/wcfsetup/install/files/lib/action/GridViewFilterAction.class.php b/wcfsetup/install/files/lib/action/GridViewFilterAction.class.php index 36212464be4..154fd7e8473 100644 --- a/wcfsetup/install/files/lib/action/GridViewFilterAction.class.php +++ b/wcfsetup/install/files/lib/action/GridViewFilterAction.class.php @@ -91,11 +91,11 @@ private function getForm(AbstractGridView $gridView, array $values): Psr15Dialog WCF::getLanguage()->get('wcf.global.filter') ); - foreach ($gridView->getFilterableColumns() as $column) { - $formField = $column->getFilterFormField(); + foreach ($gridView->getAvailableFilters() as $filter) { + $formField = $filter->getFormField(); - if (isset($values[$column->getID()])) { - $formField->value($values[$column->getID()]); + if (isset($values[$filter->getID()])) { + $formField->value($values[$filter->getID()]); } $form->appendChild($formField); diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRows.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRows.class.php index 71d54a1ffec..ea21cefce02 100644 --- a/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRows.class.php +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRows.class.php @@ -52,18 +52,27 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res $view->setActiveFilters($parameters->filters); } - $filterLabels = []; - foreach (\array_keys($parameters->filters) as $key) { - $filterLabels[$key] = $view->getFilterLabel($key); - } - return new JsonResponse([ 'template' => $view->renderRows(), 'pages' => $view->countPages(), 'totalRows' => $view->countRows(), - 'filterLabels' => $filterLabels, + 'filterLabels' => $this->getFilterLabels($view, \array_keys($parameters->filters)), ]); } + + /** + * @param list $ids + * @return array + */ + private function getFilterLabels(AbstractGridView $view, array $ids): array + { + $filterLabels = []; + foreach ($ids as $id) { + $filterLabels[$id] = $view->getFilterLabel($id); + } + + return $filterLabels; + } } /** @internal */ diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItems.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItems.class.php index 4ba7156f3f1..3d12c63c68c 100644 --- a/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItems.class.php +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItems.class.php @@ -52,18 +52,27 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res $view->setActiveFilters($parameters->filters); } - $filterLabels = []; - foreach (\array_keys($parameters->filters) as $key) { - $filterLabels[$key] = $view->getFilterLabel($key); - } - return new JsonResponse([ 'template' => $view->renderItems(), 'pages' => $view->countPages(), 'totalItems' => $view->countItems(), - 'filterLabels' => $filterLabels, + 'filterLabels' => $this->getFilterLabels($view, \array_keys($parameters->filters)), ]); } + + /** + * @param list $ids + * @return array + */ + private function getFilterLabels(AbstractListView $view, array $ids): array + { + $filterLabels = []; + foreach ($ids as $id) { + $filterLabels[$id] = $view->getFilterLabel($id); + } + + return $filterLabels; + } } /** @internal */ diff --git a/wcfsetup/install/files/lib/system/gridView/AbstractGridView.class.php b/wcfsetup/install/files/lib/system/gridView/AbstractGridView.class.php index f69d2bff5fa..f5553650422 100644 --- a/wcfsetup/install/files/lib/system/gridView/AbstractGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/AbstractGridView.class.php @@ -7,12 +7,13 @@ use wcf\data\DatabaseObjectList; use wcf\event\IPsr14Event; use wcf\system\event\EventHandler; -use wcf\system\gridView\filter\exception\InvalidFilterValue; +use wcf\system\view\filter\exception\InvalidFilterValue; use wcf\system\interaction\bulk\IBulkInteractionProvider; use wcf\system\interaction\IInteraction; use wcf\system\interaction\IInteractionProvider; use wcf\system\interaction\InteractionContextMenuComponent; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\IViewFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -59,15 +60,21 @@ abstract class AbstractGridView private string $sortField = ''; private string $sortOrder = 'ASC'; private int $pageNo = 1; - /** - * @var array - */ - private array $activeFilters = []; private string|int|null $objectIDFilter = null; private ?IInteractionProvider $interactionProvider = null; private ?IBulkInteractionProvider $bulkInteractionProvider = null; private InteractionContextMenuComponent $interactionContextMenuComponent; + /** + * @var array + */ + private array $activeFilters = []; + + /** + * @var array + */ + private array $availableFilters = []; + /** * Adds a new column to the grid view. */ @@ -178,16 +185,6 @@ public function getSortableColumns(): array return \array_filter($this->getColumns(), fn($column) => $column->isSortable()); } - /** - * Returns all columns that are filterable. - * - * @return GridViewColumn[] - */ - public function getFilterableColumns(): array - { - return \array_filter($this->getColumns(), fn($column) => $column->getFilter() !== null); - } - /** * Sets the interaction provider that is used to render the interaction context menu. */ @@ -269,6 +266,8 @@ public function getQuickInteractions(): array */ public function render(): string { + $this->init(); + return WCF::getTPL()->render('wcf', 'shared_gridView', ['view' => $this]); } @@ -277,6 +276,7 @@ public function render(): string */ public function renderRows(): string { + $this->init(); $this->prepareRenderers(); return WCF::getTPL()->render('wcf', 'shared_gridViewRows', ['view' => $this]); @@ -569,7 +569,7 @@ public function setRowsPerPage(int $rowsPerPage): void */ public function isFilterable(): bool { - return $this->getFilterableColumns() !== []; + return $this->getAvailableFilters() !== []; } /** @@ -608,22 +608,17 @@ public function getActiveFilters(): array */ public function getFilterLabel(string $id): string { - $column = $this->getColumn($id); - if (!$column) { - throw new \LogicException("Unknown column '" . $id . "'."); - } - - if (!$column->getFilter()) { - throw new \LogicException("Column '" . $id . "' has no filter."); + if (!isset($this->availableFilters[$id])) { + throw new \LogicException("Unknown filter '" . $id . "'."); } if (!isset($this->activeFilters[$id])) { throw new \LogicException("No value for filter '" . $id . "' found."); } - $value = $column->getFilter()->renderValue($this->activeFilters[$id]); + $value = $this->availableFilters[$id]->renderValue($this->activeFilters[$id]); - return $column->getLabel() . ($value !== '' ? ': ' . $value : ''); + return $this->availableFilters[$id]->getLabel() . ($value !== '' ? ': ' . $value : ''); } /** @@ -688,6 +683,18 @@ protected function fireInitializedEvent(): void */ protected function validate(): void { + $columnFilters = []; + foreach ($this->getColumns() as $column) { + if ($column->getFilter() !== null) { + $columnFilters[$column->getID()] = $column->getFilter(); + } + } + + $this->availableFilters = [ + ...$columnFilters, + ...$this->availableFilters, + ]; + if ($this->getDefaultSortField() === '') { throw new \InvalidArgumentException("Undefined default sort field."); } @@ -775,9 +782,7 @@ public function countRows(): int */ public function getObjectList(): DatabaseObjectList { - if (!isset($this->objectList)) { - $this->initObjectList(); - } + $this->init(); return $this->objectList; } @@ -829,8 +834,7 @@ protected function initObjectList(): void protected function applyFilters(): void { $this->activeFilters = \array_filter($this->activeFilters, function ($value, $key) { - $column = $this->getColumn($key); - if (!$column) { + if (!isset($this->availableFilters[$key])) { if (\ENABLE_DEBUG_MODE) { throw new \LogicException("Filter applied for unknown column '{$key}'."); } else { @@ -839,7 +843,7 @@ protected function applyFilters(): void } try { - $column->getFilter()->applyFilter($this->getObjectList(), $column->getID(), $value); + $this->availableFilters[$key]->applyFilter($this->getObjectList(), $value); } catch (InvalidFilterValue $e) { if (\ENABLE_DEBUG_MODE) { throw $e; @@ -852,6 +856,38 @@ protected function applyFilters(): void }, \ARRAY_FILTER_USE_BOTH); } + public function addAvailableFilter(IViewFilter $filter): void + { + $this->availableFilters[$filter->getId()] = $filter; + } + + /** + * @param IViewFilter[] $filters + */ + public function addAvailableFilters(array $filters): void + { + foreach ($filters as $filter) { + $this->addAvailableFilter($filter); + } + } + + /** + * @return array + */ + public function getAvailableFilters(): array + { + $this->init(); + + return $this->availableFilters; + } + + private function init(): void + { + if (!isset($this->objectList)) { + $this->initObjectList(); + } + } + /** * Creates the database object list of this grid view. * diff --git a/wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php b/wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php index 420df94be82..846fe604b55 100644 --- a/wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php +++ b/wcfsetup/install/files/lib/system/gridView/GridViewColumn.class.php @@ -3,8 +3,9 @@ namespace wcf\system\gridView; use wcf\data\DatabaseObject; +use wcf\system\exception\ParentClassException; use wcf\system\form\builder\field\AbstractFormField; -use wcf\system\gridView\filter\IGridViewFilter; +use wcf\system\view\filter\IViewFilter; use wcf\system\gridView\renderer\DefaultColumnRenderer; use wcf\system\gridView\renderer\IColumnRenderer; use wcf\system\gridView\renderer\ILinkColumnRenderer; @@ -30,7 +31,7 @@ final class GridViewColumn private bool $sortable = false; private string $sortByDatabaseColumn = ''; - private ?IGridViewFilter $filter = null; + private ?IViewFilter $filter = null; private bool $hidden = false; private bool $valueEncoding = true; private bool $titleColumn = false; @@ -169,10 +170,38 @@ public function getSortByDatabaseColumn(): string /** * Sets a filter for this column. + * + * @param IViewFilter|class-string|null $filter */ - public function filter(?IGridViewFilter $filter): static + public function filter(IViewFilter|string|null $filter): static { - $this->filter = $filter; + if (\is_string($filter)) { + if (!\is_subclass_of($filter, IViewFilter::class)) { + throw new ParentClassException($filter, IViewFilter::class); + } + + $possibleValues = [ + 'id' => $this->getID(), + 'languageItem' => $this->getLabel(), + ]; + + $class = new \ReflectionClass($filter); + $constructor = $class->getMethod('__construct'); + $values = []; + foreach ($constructor->getParameters() as $parameter) { + $name = $parameter->getName(); + + if (\array_key_exists($name, $possibleValues)) { + $values[$name] = $possibleValues[$name]; + } elseif (!$parameter->isOptional()) { + throw new \InvalidArgumentException("Cannot instantiate {$class->getName()}. The parameter {$name} is not optional but cannot be provided automatically. Please instantiate the filter yourself."); + } + } + + $this->filter = $class->newInstanceArgs($values); + } else { + $this->filter = $filter; + } return $this; } @@ -180,7 +209,7 @@ public function filter(?IGridViewFilter $filter): static /** * Returns the filter of this column. */ - public function getFilter(): ?IGridViewFilter + public function getFilter(): ?IViewFilter { return $this->filter; } diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionGridView.class.php index 26bdad15666..9ab616fd3d9 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionGridView.class.php @@ -6,15 +6,15 @@ use wcf\data\acp\session\access\log\ACPSessionAccessLogList; use wcf\event\gridView\admin\ACPSessionGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\IpAddressFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\IpAddressColumnRenderer; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; use wcf\system\gridView\renderer\TimeColumnRenderer; use wcf\system\gridView\renderer\TruncatedTextColumnRenderer; +use wcf\system\view\filter\IpAddressFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; /** @@ -40,31 +40,36 @@ public function __construct(private readonly int $sessionLogID) ->label('wcf.user.ipAddress') ->sortable() ->renderer(new IpAddressColumnRenderer()) - ->filter(new IpAddressFilter()), + ->filter(IpAddressFilter::class), GridViewColumn::for('time') ->label('wcf.acp.sessionLog.time') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), + ->filter(TimeFilter::class), GridViewColumn::for('className') ->label('wcf.acp.sessionLog.className') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('requestURI') ->label('wcf.acp.sessionLog.requestURI') ->titleColumn() - ->filter(new TextFilter()) + ->valueEncoding(false) + ->filter(TextFilter::class) ->renderer(new TruncatedTextColumnRenderer()) ->sortable(), GridViewColumn::for('requestMethod') ->label('wcf.acp.sessionLog.requestMethod') ->sortable() ->filter( - new SelectFilter([ - 'GET' => 'GET', - 'POST' => 'POST', - 'DELETE' => 'DELETE', - ]) + new SelectFilter( + [ + 'GET' => 'GET', + 'POST' => 'POST', + 'DELETE' => 'DELETE', + ], + 'requestMethod', + 'wcf.acp.sessionLog.requestMethod' + ) ), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionLogGridView.class.php index a1e77fbfa2a..29914057b0b 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ACPSessionLogGridView.class.php @@ -8,10 +8,6 @@ use wcf\data\acp\session\log\ACPSessionLogList; use wcf\event\gridView\admin\ACPSessionLogGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\IpAddressFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\IpAddressColumnRenderer; @@ -20,6 +16,10 @@ use wcf\system\gridView\renderer\TimeColumnRenderer; use wcf\system\gridView\renderer\TruncatedTextColumnRenderer; use wcf\system\gridView\renderer\UserLinkColumnRenderer; +use wcf\system\view\filter\IpAddressFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; /** @@ -46,28 +46,28 @@ public function __construct() ->sortable(true, 'user_table.username') ->titleColumn() ->renderer(new UserLinkColumnRenderer(UserEditForm::class)) - ->filter(new UserFilter()), + ->filter(UserFilter::class), GridViewColumn::for('ipAddress') ->label('wcf.user.ipAddress') ->sortable() ->renderer(new IpAddressColumnRenderer()) - ->filter(new IpAddressFilter()), + ->filter(IpAddressFilter::class), GridViewColumn::for('userAgent') ->label('wcf.user.userAgent') ->sortable() ->valueEncoding(false) ->renderer(new TruncatedTextColumnRenderer(50)) - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for('time') ->label('wcf.acp.sessionLog.time') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), + ->filter(TimeFilter::class), GridViewColumn::for('lastActivityTime') ->label('wcf.acp.sessionLog.lastActivityTime') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), + ->filter(TimeFilter::class), GridViewColumn::for('accesses') ->label('wcf.acp.sessionLog.actions') ->sortable(true, 'accesses') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php index 7616115f6af..7dda0eb1567 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php @@ -7,9 +7,6 @@ use wcf\data\ad\AdList; use wcf\event\gridView\admin\AdGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -20,6 +17,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -40,19 +40,19 @@ public function __construct() GridViewColumn::for('adID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('adName') ->label('wcf.global.name') ->titleColumn() ->renderer(new DefaultColumnRenderer()) - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('showOrder') ->label('wcf.global.showOrder') ->sortable() ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ]); $provider = new AdInteractions(); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ArticleGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ArticleGridView.class.php index 9c8740a745f..cfc2fd4756d 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ArticleGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ArticleGridView.class.php @@ -12,12 +12,6 @@ use wcf\data\DatabaseObjectList; use wcf\event\gridView\admin\ArticleGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\BooleanFilter; -use wcf\system\gridView\filter\CategoryFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\CategoryColumnRenderer; @@ -30,6 +24,12 @@ use wcf\system\interaction\bulk\admin\ArticleBulkInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\BooleanFilter; +use wcf\system\view\filter\CategoryFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -80,7 +80,20 @@ public function getClasses(): string GridViewColumn::for('title') ->label('wcf.global.title') ->sortable(sortByDatabaseColumn: 'articleContent.title') - ->filter($this->getArticleContentFilter()) + ->filter(new class('title', 'wcf.global.title') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "article.articleID IN ( + SELECT articleID + FROM wcf1_article_content + WHERE title LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }) ->renderer([ new class extends DefaultColumnRenderer { public function render(mixed $value, DatabaseObject $row): string @@ -139,30 +152,20 @@ public function render(mixed $value, DatabaseObject $row): string }, ]) ->titleColumn(), - GridViewColumn::for('content') - ->label('wcf.acp.article.content') - ->filter($this->getArticleContentFilter()) - ->hidden(), GridViewColumn::for('userID') ->label('wcf.user.username') ->renderer(new UserLinkColumnRenderer(UserEditForm::class)) ->sortable(sortByDatabaseColumn: 'username') - ->filter(new UserFilter()), + ->filter(UserFilter::class), GridViewColumn::for('categoryID') ->label('wcf.global.category') ->sortable() ->renderer(new CategoryColumnRenderer()) - ->filter(new CategoryFilter((new CategoryNodeTree('com.woltlab.wcf.article.category'))->getIterator())), - GridViewColumn::for('publicationStatus') - ->label('wcf.acp.article.publicationStatus') - ->filter( - new SelectFilter([ - 0 => 'wcf.acp.article.publicationStatus.unpublished', - 1 => 'wcf.acp.article.publicationStatus.published', - 2 => 'wcf.acp.article.publicationStatus.delayed', - ]) - ) - ->hidden(), + ->filter(new CategoryFilter( + (new CategoryNodeTree('com.woltlab.wcf.article.category'))->getIterator(), + 'categoryID', + 'wcf.global.category' + )), GridViewColumn::for('views') ->label('wcf.acp.article.views') ->renderer(new NumberColumnRenderer()) @@ -171,13 +174,35 @@ public function render(mixed $value, DatabaseObject $row): string ->label('wcf.acp.sessionLog.time') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), - GridViewColumn::for('isDeleted') - ->label('wcf.acp.article.isDeleted') - ->filter(new BooleanFilter()) - ->hidden(), + ->filter(TimeFilter::class), ]); + $this->addAvailableFilters([ + new class('content', 'wcf.acp.article.content') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "article.articleID IN ( + SELECT articleID + FROM wcf1_article_content + WHERE content LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }, + new SelectFilter( + [ + 0 => 'wcf.acp.article.publicationStatus.unpublished', + 1 => 'wcf.acp.article.publicationStatus.published', + 2 => 'wcf.acp.article.publicationStatus.delayed', + ], + 'publicationStatus', + 'wcf.acp.article.publicationStatus' + ), + new BooleanFilter('isDeleted', 'wcf.acp.article.isDeleted') + ]); $provider = new ArticleInteractions(); $provider->addInteractions([ new Divider(), @@ -191,24 +216,6 @@ public function render(mixed $value, DatabaseObject $row): string $this->addRowLink(new GridViewRowLink(ArticleEditForm::class)); } - private function getArticleContentFilter(): TextFilter - { - return new class() extends TextFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add( - "article.articleID IN ( - SELECT articleID - FROM wcf1_article_content - WHERE {$id} LIKE ? - )", - ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] - ); - } - }; - } - #[\Override] public function isAccessible(): bool { diff --git a/wcfsetup/install/files/lib/system/gridView/admin/AttachmentGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/AttachmentGridView.class.php index e079d30d442..b837074d40f 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/AttachmentGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/AttachmentGridView.class.php @@ -8,12 +8,6 @@ use wcf\data\DatabaseObject; use wcf\event\gridView\admin\AttachmentGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -27,6 +21,12 @@ use wcf\system\interaction\bulk\admin\AttachmentBulkInteractions; use wcf\system\request\LinkHandler; use wcf\system\style\FontAwesomeIcon; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -48,9 +48,8 @@ public function __construct() GridViewColumn::for('fileID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), - GridViewColumn::for('preview') ->label('wcf.attachment.preview') ->renderer( @@ -89,16 +88,13 @@ public function getClasses(): string GridViewColumn::for('filename') ->label('wcf.attachment.filename') ->titleColumn() - ->filter(new TextFilter('file_table.filename')) + ->filter(new TextFilter('filename', 'wcf.attachment.filename', 'file_table.filename')) ->renderer(new TruncatedTextColumnRenderer()) + ->valueEncoding(false) ->sortable(sortByDatabaseColumn: 'file_table.filename'), - GridViewColumn::for('fileType') - ->label('wcf.attachment.fileType') - ->filter(new SelectFilter($this->getAvailableFileTypes(), 'file_table.mimeType')) - ->hidden(), GridViewColumn::for('username') ->label('wcf.user.username') - ->filter(new UserFilter('user_table.username')) + ->filter(new UserFilter('usernane', 'wcf.user.username', 'user_table.username')) ->renderer( new class extends AbstractColumnRenderer { #[\Override] @@ -128,11 +124,11 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('uploadTime') ->label('wcf.attachment.uploadTime') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), GridViewColumn::for('downloads') ->label('wcf.attachment.downloads') - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->renderer(new NumberColumnRenderer()) ->sortable(), GridViewColumn::for('filesize') @@ -142,10 +138,18 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('lastDownloadTime') ->label('wcf.attachment.lastDownloadTime') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), ]); + $this->addAvailableFilters([ + new SelectFilter( + $this->getAvailableFileTypes(), + 'fileType', + 'wcf.attachment.fileType', + 'file_table.mimeType' + ) + ]); $interaction = new AttachmentInteractions(); $this->setInteractionProvider($interaction); $this->setBulkInteractionProvider(new AttachmentBulkInteractions()); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeGridView.class.php index 86012a47f46..9d8a74be541 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeGridView.class.php @@ -8,7 +8,6 @@ use wcf\data\DatabaseObject; use wcf\event\gridView\admin\BBCodeGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -16,6 +15,7 @@ use wcf\system\interaction\admin\BBCodeInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -39,7 +39,7 @@ public function __construct() ->sortable(), GridViewColumn::for('bbcodeTag') ->label('wcf.acp.bbcode.bbcodeTag') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->titleColumn() ->renderer( new class extends AbstractColumnRenderer { @@ -53,7 +53,7 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(), GridViewColumn::for('className') ->label('wcf.acp.bbcode.className') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php index c8dad65e855..9aaa37296dd 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php @@ -7,8 +7,6 @@ use wcf\data\bbcode\media\provider\BBCodeMediaProviderList; use wcf\event\gridView\admin\BBCodeMediaProviderGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -17,6 +15,8 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -37,13 +37,13 @@ public function __construct() GridViewColumn::for('providerID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('title') ->label('wcf.acp.bbcode.mediaProvider.title') ->renderer(new DefaultColumnRenderer()) ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/BoxGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/BoxGridView.class.php index d9454671da0..ed3ed6db373 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/BoxGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/BoxGridView.class.php @@ -8,10 +8,6 @@ use wcf\data\DatabaseObjectList; use wcf\event\gridView\admin\BoxGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\BooleanFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; @@ -19,6 +15,10 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\BooleanFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -43,16 +43,8 @@ public function __construct() GridViewColumn::for('name') ->label('wcf.global.name') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), - GridViewColumn::for('title') - ->label('wcf.global.title') - ->filter($this->getBoxContentFilter('title')) - ->hidden(), - GridViewColumn::for('content') - ->label('wcf.acp.box.content') - ->filter($this->getBoxContentFilter('content')) - ->hidden(), GridViewColumn::for('boxType') ->label('wcf.acp.box.type') ->filter( @@ -63,7 +55,9 @@ public function __construct() static fn(string $type) => 'wcf.acp.box.type.' . $type, Box::$availableBoxTypes ) - ) + ), + 'boxType', + 'wcf.acp.box.type' ) ) ->sortable(), @@ -77,30 +71,49 @@ public function __construct() static fn(string $position) => 'wcf.acp.box.position.' . $position, Box::$availablePositions ) - ) + ), + 'position', + 'wcf.acp.box.position' ) ) ->sortable(), GridViewColumn::for('showOrder') ->label('wcf.global.showOrder') - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), - GridViewColumn::for('originIsSystem') - ->label('wcf.acp.box.originIsNotSystem') - ->filter( - new class extends BooleanFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add("{$columnName} = ?", [0]); - } - } - ) - ->hidden(), ]); + $this->addAvailableFilters([ + new class('title', 'wcf.global.title') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "box.boxID IN ( + SELECT boxID + FROM wcf1_box_content + WHERE title LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }, + new class('content', 'wcf.acp.box.content') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "box.boxID IN ( + SELECT boxID + FROM wcf1_box_content + WHERE content LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }, + new BooleanFilter('originIsNotSystem', 'wcf.acp.box.originIsNotSystem', 'originIsSystem', true), + ]); $provider = new BoxInteractions(); $provider->addInteractions([ new Divider(), @@ -114,24 +127,6 @@ public function applyFilter(DatabaseObjectList $list, string $id, string $value) $this->addRowLink(new GridViewRowLink(BoxEditForm::class)); } - private function getBoxContentFilter(string $databaseColumn): TextFilter - { - return new class($databaseColumn) extends TextFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add( - "box.boxID IN ( - SELECT boxID - FROM wcf1_box_content - WHERE {$this->databaseColumn} LIKE ? - )", - ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] - ); - } - }; - } - #[\Override] public function isAccessible(): bool { diff --git a/wcfsetup/install/files/lib/system/gridView/admin/CaptchaQuestionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/CaptchaQuestionGridView.class.php index 73fb2820b1b..5775a80d5c0 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/CaptchaQuestionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/CaptchaQuestionGridView.class.php @@ -7,8 +7,6 @@ use wcf\data\captcha\question\I18nCaptchaQuestionList; use wcf\event\gridView\admin\CaptchaQuestionGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; @@ -17,6 +15,8 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; use wcf\system\WCF; /** @@ -41,20 +41,20 @@ public function __construct() GridViewColumn::for('question') ->label('wcf.acp.captcha.question.question') ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: 'questionI18n'), GridViewColumn::for('views') ->label('wcf.acp.captcha.question.views') ->sortable() - ->filter(new NumericFilter()), + ->filter(IntegerFilter::class), GridViewColumn::for('correctSubmissions') ->label('wcf.acp.captcha.question.correctSubmissions') ->sortable() - ->filter(new NumericFilter()), + ->filter(IntegerFilter::class), GridViewColumn::for('incorrectSubmissions') ->label('wcf.acp.captcha.question.incorrectSubmissions') ->sortable() - ->filter(new NumericFilter()), + ->filter(IntegerFilter::class), ]); $provider = new CaptchaQuestionInteractions(); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php index f2d96080841..94cf4ec5817 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php @@ -8,10 +8,6 @@ use wcf\event\gridView\admin\ContactOptionGridViewInitialized; use wcf\system\form\option\FormOptionHandler; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\NumberColumnRenderer; @@ -21,6 +17,10 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; /** @@ -41,21 +41,25 @@ public function __construct() GridViewColumn::for("optionID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("optionTitle") ->label("wcf.global.name") ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->titleColumn() ->sortable(sortByDatabaseColumn: $this->subqueryOptionTitle()), GridViewColumn::for("optionType") ->label("wcf.acp.customOption.optionType") - ->filter(new SelectFilter(FormOptionHandler::getInstance()->getSortedOptionTypes())) + ->filter(new SelectFilter( + FormOptionHandler::getInstance()->getSortedOptionTypes(), + 'optionType', + 'wcf.acp.customOption.optionType' + )) ->sortable(), GridViewColumn::for("showOrder") ->label("wcf.acp.customOption.showOrder") - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->renderer(new NumberColumnRenderer()) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php index cafc06f61ad..932389a5219 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php @@ -7,9 +7,6 @@ use wcf\data\contact\recipient\ContactRecipientList; use wcf\event\gridView\admin\ContactRecipientGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\EmailColumnRenderer; @@ -20,6 +17,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -40,11 +40,11 @@ public function __construct() GridViewColumn::for("recipientID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("name") ->label("wcf.global.name") - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->titleColumn() ->renderer(new PhraseColumnRenderer()) ->sortable(sortByDatabaseColumn: $this->subqueryName()), @@ -54,7 +54,7 @@ public function __construct() ->sortable(), GridViewColumn::for("showOrder") ->label("wcf.acp.customOption.showOrder") - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->renderer(new NumberColumnRenderer()) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/CronjobGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/CronjobGridView.class.php index 59343ca0c0a..4c72841ea33 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/CronjobGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/CronjobGridView.class.php @@ -9,9 +9,6 @@ use wcf\data\package\PackageCache; use wcf\event\gridView\admin\CronjobGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -23,6 +20,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -61,12 +61,16 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('description') ->label('wcf.acp.cronjob.description') ->sortable(sortByDatabaseColumn: 'descriptionI18n') - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer(new PhraseColumnRenderer()) ->titleColumn(), GridViewColumn::for('packageID') ->label('wcf.acp.package.name') - ->filter(new SelectFilter(PackageCache::getInstance()->getPackages())) + ->filter(new SelectFilter( + PackageCache::getInstance()->getPackages(), + 'packageID', + 'wcf.acp.package.name' + )) ->renderer( new class extends AbstractColumnRenderer { #[\Override] @@ -96,7 +100,7 @@ public function render(mixed $value, DatabaseObject $row): string } } ) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/CronjobLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/CronjobLogGridView.class.php index b3ff0c611eb..e88a04e7ef4 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/CronjobLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/CronjobLogGridView.class.php @@ -9,14 +9,14 @@ use wcf\data\DatabaseObject; use wcf\event\gridView\admin\CronjobLogGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\DefaultColumnRenderer; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; use wcf\system\gridView\renderer\TimeColumnRenderer; use wcf\system\interaction\AbstractInteraction; use wcf\system\interaction\IInteraction; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -45,7 +45,11 @@ public function __construct() ->label('wcf.acp.cronjob') ->sortable() ->titleColumn() - ->filter(new SelectFilter($availableCronjobs)) + ->filter(new SelectFilter( + $availableCronjobs, + 'cronjobID', + 'wcf.acp.cronjob' + )) ->renderer([ new class($availableCronjobs) extends DefaultColumnRenderer { /** @@ -62,15 +66,19 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('execTime') ->label('wcf.acp.cronjob.log.execTime') ->sortable() - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->renderer(new TimeColumnRenderer()), GridViewColumn::for('success') ->label('wcf.acp.cronjob.log.status') ->sortable() - ->filter(new SelectFilter([ - 1 => 'wcf.acp.cronjob.log.success', - 0 => 'wcf.acp.cronjob.log.error', - ])) + ->filter(new SelectFilter( + [ + 1 => 'wcf.acp.cronjob.log.success', + 0 => 'wcf.acp.cronjob.log.error', + ], + 'success', + 'wcf.acp.cronjob.log.status' + )) ->renderer([ new class extends DefaultColumnRenderer { public function render(mixed $value, DatabaseObject $row): string diff --git a/wcfsetup/install/files/lib/system/gridView/admin/EmailLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/EmailLogGridView.class.php index d4355f1c685..ebfc3ad11f8 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/EmailLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/EmailLogGridView.class.php @@ -4,14 +4,9 @@ use wcf\acp\form\UserEditForm; use wcf\data\DatabaseObject; -use wcf\data\DatabaseObjectList; use wcf\data\email\log\entry\EmailLogEntry; use wcf\data\email\log\entry\EmailLogEntryList; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\AbstractColumnRenderer; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -21,6 +16,10 @@ use wcf\system\interaction\AbstractInteraction; use wcf\system\interaction\IInteraction; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -46,13 +45,15 @@ public function __construct() GridViewColumn::for('subject') ->label('wcf.acp.email.log.subject') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable() + ->valueEncoding(false) ->renderer(new TruncatedTextColumnRenderer()), GridViewColumn::for('messageID') ->label('wcf.acp.email.log.messageId') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable() + ->valueEncoding(false) ->renderer( new class(50) extends TruncatedTextColumnRenderer { #[\Override] @@ -66,7 +67,7 @@ public function render(mixed $value, DatabaseObject $row): string ), GridViewColumn::for('recipient') ->label('wcf.user.email') - ->filter(WCF::getSession()->getPermission("admin.user.canEditMailAddress") ? new TextFilter() : null) + ->filter(WCF::getSession()->getPermission("admin.user.canEditMailAddress") ? TextFilter::class : null) ->renderer( new class extends AbstractColumnRenderer { #[\Override] @@ -87,7 +88,7 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(), GridViewColumn::for('recipientID') ->label('wcf.user.username') - ->filter(new UserFilter()) + ->filter(UserFilter::class) ->sortable(sortByDatabaseColumn: 'user_table.username') ->renderer( new class extends AbstractColumnRenderer { @@ -119,19 +120,21 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('time') ->label('wcf.acp.email.log.time') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), GridViewColumn::for('status') ->label('wcf.acp.email.log.status') - ->filter( - new SelectFilter([ + ->filter(new SelectFilter( + [ EmailLogEntry::STATUS_NEW => 'wcf.acp.email.log.status.new', EmailLogEntry::STATUS_SUCCESS => 'wcf.acp.email.log.status.success', EmailLogEntry::STATUS_TRANSIENT_FAILURE => 'wcf.acp.email.log.status.transient_failure', EmailLogEntry::STATUS_PERMANENT_FAILURE => 'wcf.acp.email.log.status.permanent_failure', EmailLogEntry::STATUS_DISCARDED => 'wcf.acp.email.log.status.discarded', - ]) - ) + ], + 'status', + 'wcf.acp.email.log.status' + )) ->renderer( new class extends DefaultColumnRenderer { #[\Override] diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ExceptionLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ExceptionLogGridView.class.php index a38162b4b72..4a83ad70be5 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ExceptionLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ExceptionLogGridView.class.php @@ -7,11 +7,11 @@ use wcf\event\gridView\admin\ExceptionLogGridViewInitialized; use wcf\system\gridView\AbstractGridView; use wcf\system\Regex; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\TimeColumnRenderer; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\DirectoryUtil; use wcf\util\ExceptionLogUtil; @@ -42,18 +42,17 @@ public function __construct(bool $applyDefaultFilter = false) ->titleColumn(), GridViewColumn::for('exceptionID') ->label('wcf.acp.exceptionLog.search.exceptionID') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('date') ->label('wcf.acp.exceptionLog.exception.date') ->sortable() ->renderer(new TimeColumnRenderer()), - GridViewColumn::for('logFile') - ->label('wcf.acp.exceptionLog.search.logFile') - ->filter(new SelectFilter($this->getAvailableLogFiles())) - ->hidden(true), ]); + $this->addAvailableFilters([ + new SelectFilter($this->getAvailableLogFiles(), 'logFile', 'wcf.acp.exceptionLog.search.logFile'), + ]); $this->addRowLink(new GridViewRowLink(cssClass: 'jsExceptionLogEntry')); $this->setDefaultSortField('date'); $this->setDefaultSortOrder('DESC'); @@ -171,6 +170,8 @@ public function countRows(): int protected function initObjectList(): void { $this->objectList = $this->createObjectList(); + $this->fireInitializedEvent(); + $this->validate(); $objects = $this->loadDataSource(); $this->objectCount = \count($objects); @@ -182,9 +183,6 @@ protected function initObjectList(): void } }); $this->objects = \array_slice($objects, ($this->getPageNo() - 1) * $this->getRowsPerPage(), $this->getRowsPerPage()); - - $this->validate(); - $this->fireInitializedEvent(); } #[\Override] diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php index f857f67fd0c..d833c1e990b 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php @@ -10,10 +10,6 @@ use wcf\event\gridView\admin\LabelGridViewInitialized; use wcf\system\cache\builder\LabelCacheBuilder; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -23,6 +19,10 @@ use wcf\system\interaction\bulk\admin\LabelBulkInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -44,12 +44,12 @@ public function __construct() GridViewColumn::for("labelID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("label") ->label("wcf.acp.label.label") ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer( new class extends AbstractColumnRenderer { #[\Override] @@ -96,13 +96,15 @@ public function render(mixed $value, DatabaseObject $row): string static fn(ViewableLabelGroup $group) => $group->getTitle(), LabelCacheBuilder::getInstance()->getData(arrayIndex: "groups"), ), + 'groupID', + 'wcf.acp.label.group' ) ) ->sortable(), GridViewColumn::for("showOrder") ->label("wcf.global.showOrder") ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LabelGroupGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LabelGroupGridView.class.php index 1753ec00461..919ae659713 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LabelGroupGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LabelGroupGridView.class.php @@ -7,17 +7,18 @@ use wcf\data\label\group\LabelGroup; use wcf\event\gridView\admin\LabelGroupGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; +use wcf\system\gridView\renderer\NumberColumnRenderer; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; use wcf\system\gridView\renderer\PhraseColumnRenderer; use wcf\system\gridView\renderer\TruncatedTextColumnRenderer; use wcf\system\interaction\admin\LabelGroupInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -43,16 +44,18 @@ public function __construct() ->label('wcf.global.title') ->titleColumn() ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: 'groupNameI18n'), GridViewColumn::for('groupDescription') ->label('wcf.global.description') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->renderer(new TruncatedTextColumnRenderer()) + ->valueEncoding(false) ->sortable(), GridViewColumn::for('labels') ->label('wcf.acp.label.list') - ->filter(new NumericFilter()) + ->renderer(new NumberColumnRenderer()) + ->filter(IntegerFilter::class) ->sortable( sortByDatabaseColumn: '( SELECT COUNT(*) @@ -62,8 +65,9 @@ public function __construct() ), GridViewColumn::for('showOrder') ->label('wcf.global.showOrder') + ->renderer(new NumberColumnRenderer()) + ->filter(IntegerFilter::class) ->sortable() - ->filter(new NumericFilter()) ]); $provider = new LabelGroupInteractions(); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php index a7f92a5d1bb..88c8e7af1bd 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php @@ -9,9 +9,6 @@ use wcf\data\language\LanguageList; use wcf\event\gridView\admin\LanguageGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -23,6 +20,9 @@ use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -43,12 +43,12 @@ public function __construct() $this->addColumns([ GridViewColumn::for('languageID') ->label('wcf.global.objectID') - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->renderer(new ObjectIdColumnRenderer()) ->sortable(), GridViewColumn::for('languageName') ->label('wcf.global.name') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->titleColumn() ->sortable() ->renderer([ @@ -71,16 +71,16 @@ public function render(mixed $value, DatabaseObject $row): string ]), GridViewColumn::for('languageCode') ->label('wcf.acp.language.code') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('users') ->label('wcf.acp.language.users') - ->filter(new NumericFilter($this->subSelectUsers())) + ->filter(new IntegerFilter('users', 'wcf.acp.language.users', $this->subSelectUsers())) ->renderer(new NumberColumnRenderer()) ->sortable(sortByDatabaseColumn: $this->subSelectUsers()), GridViewColumn::for('variables') ->label('wcf.acp.language.variables') - ->filter(new NumericFilter($this->subSelectVariables())) + ->filter(new IntegerFilter('variables', 'wcf.acp.language.variables', $this->subSelectVariables())) ->renderer( new class extends NumberColumnRenderer implements ILinkColumnRenderer { #[\Override] @@ -102,7 +102,7 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(sortByDatabaseColumn: $this->subSelectVariables()), GridViewColumn::for('customVariables') ->label('wcf.acp.language.customVariables') - ->filter(new NumericFilter($this->subSelectCustomVariables())) + ->filter(new IntegerFilter('customVariables', 'wcf.acp.language.customVariables', $this->subSelectCustomVariables())) ->renderer( new class extends NumberColumnRenderer implements ILinkColumnRenderer { #[\Override] diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LanguageItemGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LanguageItemGridView.class.php index 37cc524a8f1..f21a84ebc90 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LanguageItemGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LanguageItemGridView.class.php @@ -12,9 +12,6 @@ use wcf\data\language\LanguageList; use wcf\event\gridView\admin\LanguageItemGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\BooleanFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\AbstractColumnRenderer; use wcf\system\gridView\renderer\TruncatedTextColumnRenderer; @@ -22,6 +19,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\FormBuilderDialogInteraction; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\BooleanFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -44,11 +44,11 @@ public function __construct(?Language $defaultLanguage = null) GridViewColumn::for('languageItem') ->label('wcf.global.name') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('languageID') ->label('wcf.user.language') - ->filter(new SelectFilter($this->getAvailableLanguages())) + ->filter(new SelectFilter($this->getAvailableLanguages(), 'languageID', 'wcf.user.language')) ->renderer( new class($availableLanguages) extends AbstractColumnRenderer { /** @@ -64,18 +64,11 @@ public function render(mixed $value, DatabaseObject $row): string } ) ->sortable(), - GridViewColumn::for('languageCategoryID') - ->label('wcf.global.category') - ->hidden() - ->filter(new SelectFilter( - $this->getAvailableCategories(), - labelLanguageItems: false - )), GridViewColumn::for('languageItemValue') ->label('wcf.acp.language.item.value') ->valueEncoding(false) ->renderer(new TruncatedTextColumnRenderer(255)) - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('languageCustomItemValue') ->label('wcf.acp.language.item.customValue') @@ -95,55 +88,45 @@ public function render(mixed $value, DatabaseObject $row): string } } ) - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), - GridViewColumn::for('languageUseCustomValue') - ->label('wcf.acp.language.item.customValues') - ->hidden() - ->filter( - new class extends BooleanFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); - } - } - ), - GridViewColumn::for('hasDisabledCustomValue') - ->label('wcf.acp.language.item.disabledCustomValues') - ->hidden() - ->filter( - new class extends BooleanFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); - $list->getConditionBuilder()->add("languageUseCustomValue = ?", [0]); - } - } - ), - GridViewColumn::for('hasRecentlyDisabledCustomValue') - ->label('wcf.acp.language.item.recentlyDisabledCustomValues') - ->hidden() - ->filter( - new class extends BooleanFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); - $list->getConditionBuilder()->add( - "languageCustomItemDisableTime >= ?", - [TIME_NOW - 86400 * 7] - ); - } - } - ), - GridViewColumn::for('isCustomLanguageItem') - ->label('wcf.acp.language.item.isCustomLanguageItem') - ->hidden() - ->filter(new BooleanFilter()), ]); + $this->addAvailableFilters([ + new SelectFilter( + $this->getAvailableCategories(), + 'languageCategoryID', + 'wcf.global.category', + labelLanguageItems: false + ), + new class('languageUseCustomValue', 'wcf.acp.language.item.customValues') extends BooleanFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); + } + }, + new class('hasDisabledCustomValue', 'wcf.acp.language.item.disabledCustomValues') extends BooleanFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); + $list->getConditionBuilder()->add("languageUseCustomValue = ?", [0]); + } + }, + new class('hasRecentlyDisabledCustomValue', 'wcf.acp.language.item.recentlyDisabledCustomValues') extends BooleanFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add("languageCustomItemValue IS NOT NULL"); + $list->getConditionBuilder()->add( + "languageCustomItemDisableTime >= ?", + [TIME_NOW - 86400 * 7] + ); + } + }, + new BooleanFilter('isCustomLanguageItem', 'wcf.acp.language.item.isCustomLanguageItem'), + ]); $provider = new LanguageItemInteractions(); $provider->addInteractions([ new Divider(), @@ -157,12 +140,7 @@ public function applyFilter(DatabaseObjectList $list, string $id, string $value) ) ]); $this->setInteractionProvider($provider); - $this->setDefaultSortField('languageItem'); - - if ($defaultLanguage !== null) { - $this->setActiveFilters(['languageID' => $defaultLanguage->languageID]); - } } #[\Override] diff --git a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php index b39b05d2bd5..26197c52ef0 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php @@ -9,10 +9,6 @@ use wcf\data\menu\Menu; use wcf\event\gridView\admin\MenuGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -22,6 +18,10 @@ use wcf\system\interaction\admin\MenuInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; /** @@ -42,17 +42,17 @@ public function __construct() GridViewColumn::for("menuID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("title") ->label("wcf.global.name") ->titleColumn() ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: "titleI18n"), GridViewColumn::for("items") ->label("wcf.acp.menu.item.list") - ->filter(new NumericFilter($this->subSelectItems())) + ->filter(new IntegerFilter('items', 'wcf.acp.menu.item.list', $this->subSelectItems())) ->renderer(new NumberColumnRenderer()) ->sortable(sortByDatabaseColumn: $this->subSelectItems()), GridViewColumn::for("position") @@ -64,7 +64,9 @@ public function __construct() \array_map(static function (string $postion): string { return 'wcf.acp.box.position.' . $postion; }, Box::$availableMenuPositions) - ) + ), + 'position', + 'wcf.acp.box.position' ) ) ->renderer( @@ -79,7 +81,7 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(sortByDatabaseColumn: $this->subSelectItems()), GridViewColumn::for("showOrder") ->label("wcf.global.showOrder") - ->filter(new NumericFilter($this->subSelectItems())) + ->filter(new IntegerFilter('showOrder', 'wcf.global.showOrder', $this->subSelectItems())) ->renderer(new NumberColumnRenderer()) ->sortable(sortByDatabaseColumn: $this->subSelectItems()), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php index ae3ae05accd..41b500ad037 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php @@ -14,9 +14,6 @@ use wcf\system\form\builder\field\AbstractFormField; use wcf\system\form\builder\field\SelectFormField; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\IGridViewFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\DefaultColumnRenderer; use wcf\system\gridView\renderer\ILinkColumnRenderer; @@ -24,6 +21,9 @@ use wcf\system\gridView\renderer\TimeColumnRenderer; use wcf\system\gridView\renderer\UserLinkColumnRenderer; use wcf\system\log\modification\IExtendedModificationLogHandler; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -55,7 +55,7 @@ public function __construct() ->label('wcf.user.username') ->sortable(true, 'modification_log.username') ->renderer(new UserLinkColumnRenderer()) - ->filter(new TextFilter('modification_log.username')), + ->filter(new TextFilter('userID', 'wcf.user.username', 'modification_log.username')), GridViewColumn::for('action') ->label('wcf.acp.modificationLog.action') ->titleColumn() @@ -79,22 +79,21 @@ public function render(mixed $value, DatabaseObject $row): string }, ]) ->filter( - new class($this->getAvailableActions()) implements IGridViewFilter { - /** - * @param array $options - */ - public function __construct(private readonly array $options) {} - + new class( + $this->getAvailableActions(), + 'action', + 'wcf.acp.modificationLog.action' + ) extends SelectFilter { #[\Override] - public function getFormField(string $id, string $label): AbstractFormField + public function getFormField(): AbstractFormField { - return SelectFormField::create($id) - ->label($label) + return SelectFormField::create($this->id) + ->label($this->languageItem) ->options($this->options, false, false); } #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { if (\is_numeric($value)) { $list->getConditionBuilder()->add( @@ -152,7 +151,7 @@ public function render(mixed $value, DatabaseObject $row): string ->label('wcf.global.date') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), + ->filter(TimeFilter::class), ]); $this->setDefaultSortField('time'); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/NoticeGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/NoticeGridView.class.php index 39feb92a3cf..99460acf006 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/NoticeGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/NoticeGridView.class.php @@ -6,8 +6,6 @@ use wcf\data\notice\Notice; use wcf\data\notice\NoticeList; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\NumberColumnRenderer; @@ -17,6 +15,8 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -41,12 +41,12 @@ public function __construct() GridViewColumn::for('noticeName') ->label('wcf.global.name') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('showOrder') ->label('wcf.global.showOrder') ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php index a5d27d82ebe..b901c9b7db7 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php @@ -8,8 +8,6 @@ use wcf\data\package\Package; use wcf\event\gridView\admin\PackageGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -21,6 +19,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\style\FontAwesomeIcon; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -46,7 +47,7 @@ public function __construct() GridViewColumn::for('packageName') ->label('wcf.acp.package.name') ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer( new class extends PhraseColumnRenderer { #[\Override] @@ -74,7 +75,7 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(sortByDatabaseColumn: "packageNameI18n"), GridViewColumn::for('author') ->label('wcf.acp.package.author') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->renderer([ new class extends DefaultColumnRenderer implements ILinkColumnRenderer { #[\Override] @@ -101,7 +102,8 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('updateDate') ->label('wcf.acp.package.updateDate') ->sortable() - ->renderer(new TimeColumnRenderer()), + ->renderer(new TimeColumnRenderer()) + ->filter(TimeFilter::class), ]); $provider = new PackageInteractions(); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php index f8d0e5a83ff..762d32c4c09 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php @@ -8,11 +8,6 @@ use wcf\data\package\update\server\PackageUpdateServerList; use wcf\event\gridView\admin\PackageUpdateServerGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -25,6 +20,11 @@ use wcf\system\interaction\EditInteraction; use wcf\system\interaction\IInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -46,29 +46,33 @@ public function __construct() GridViewColumn::for('packageUpdateServerID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('serverURL') ->label('wcf.acp.updateServer.serverURL') ->titleColumn() ->sortable() - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for('loginUsername') ->label('wcf.acp.updateServer.loginUsername') ->sortable() - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for('packages') ->label('wcf.acp.updateServer.packages') ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter($this->subSelectPackages())) + ->filter(new IntegerFilter('packages', 'wcf.acp.updateServer.packages', $this->subSelectPackages())) ->sortable(sortByDatabaseColumn: $this->subSelectPackages()), GridViewColumn::for('status') ->label('wcf.acp.updateServer.status') ->filter( - new SelectFilter([ - 'online' => 'online', - 'offline' => 'offline', - ]) + new SelectFilter( + [ + 'online' => 'online', + 'offline' => 'offline', + ], + 'status', + 'wcf.acp.updateServer.status' + ) ) ->renderer( new class extends DefaultColumnRenderer { @@ -89,7 +93,7 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('lastUpdateTime') ->label('wcf.acp.updateServer.lastUpdateTime') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PageGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PageGridView.class.php index 76230c32dd6..f31594f7e80 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PageGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PageGridView.class.php @@ -11,14 +11,8 @@ use wcf\event\gridView\admin\PageGridViewInitialized; use wcf\system\application\ApplicationHandler; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\BooleanFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; -use wcf\system\gridView\renderer\AbstractColumnRenderer; use wcf\system\gridView\renderer\DefaultColumnRenderer; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; use wcf\system\gridView\renderer\TimeColumnRenderer; @@ -26,8 +20,12 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\BooleanFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; -use wcf\util\StringUtil; /** * Grid view for the list of pages. @@ -47,22 +45,14 @@ public function __construct() GridViewColumn::for('pageID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('name') ->label('wcf.global.name') ->titleColumn() ->renderer(new DefaultColumnRenderer()) - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), - GridViewColumn::for('pageTitle') - ->label('wcf.global.title') - ->filter($this->getPageContentFilter('title')) - ->hidden(), - GridViewColumn::for('pageContent') - ->label('wcf.acp.page.content') - ->filter($this->getPageContentFilter('content')) - ->hidden(), GridViewColumn::for('url') ->label('wcf.acp.page.url') ->renderer( @@ -80,57 +70,67 @@ public function render(mixed $value, DatabaseObject $row): string ->label('wcf.acp.page.type') ->renderer(new DefaultColumnRenderer()) ->filter( - new SelectFilter([ - 'text' => 'wcf.acp.page.type.text', - 'html' => 'wcf.acp.page.type.html', - 'tpl' => 'wcf.acp.page.type.tpl', - 'system' => 'wcf.acp.page.type.system', - ]) + new SelectFilter( + [ + 'text' => 'wcf.acp.page.type.text', + 'html' => 'wcf.acp.page.type.html', + 'tpl' => 'wcf.acp.page.type.tpl', + 'system' => 'wcf.acp.page.type.system', + ], + 'pageType', + 'wcf.acp.page.type' + ) ) ->sortable(), - GridViewColumn::for('applicationPackageID') - ->label('wcf.acp.page.application') - ->filter($this->getApplicationFilter()) - ->renderer( - new class extends AbstractColumnRenderer { - #[\Override] - public function render(mixed $value, DatabaseObject $row): string - { - \assert($row instanceof Page); - - $application = $row->getApplication(); - - return StringUtil::encodeHTML($application->domainName . $application->domainPath); - } - } - ) - ->hidden(), GridViewColumn::for('lastUpdateTime') ->label('wcf.acp.page.lastUpdateTime') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), - GridViewColumn::for('originIsSystem') - ->label('wcf.acp.page.originIsNotSystem') - ->filter(new BooleanFilter(reverseValue: true)) - ->hidden(), - GridViewColumn::for('controllerCustomURL') - ->label('wcf.acp.page.customURL') - ->filter( - new class extends BooleanFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add( - "(page.controllerCustomURL <> ? OR page.pageType <> ?)", - ['', 'system'] - ); - } - } - ) - ->hidden(), ]); + $this->addAvailableFilters([ + new class('title', 'wcf.global.title') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "page.pageID IN ( + SELECT pageID + FROM wcf1_page_content + WHERE title LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }, + new class('content', 'wcf.acp.page.content') extends TextFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "page.pageID IN ( + SELECT pageID + FROM wcf1_page_content + WHERE content LIKE ? + )", + ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] + ); + } + }, + new BooleanFilter('originIsNotSystem', 'wcf.acp.page.originIsNotSystem', 'originIsSystem', true), + new class('controllerCustomURL', 'wcf.acp.page.customURL') extends BooleanFilter { + #[\Override] + public function applyFilter(DatabaseObjectList $list, string $value): void + { + $list->getConditionBuilder()->add( + "(page.controllerCustomURL <> ? OR page.pageType <> ?)", + ['', 'system'] + ); + } + }, + $this->getApplicationFilter(), + ]); $provider = new PageInteractions(); $provider->addInteractions([ new Divider(), @@ -150,33 +150,15 @@ public function applyFilter(DatabaseObjectList $list, string $id, string $value) $this->addRowLink(new GridViewRowLink(PageEditForm::class)); } - private function getPageContentFilter(string $databaseColumn): TextFilter - { - return new class($databaseColumn) extends TextFilter { - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $list->getConditionBuilder()->add( - "page.pageID IN ( - SELECT pageID - FROM wcf1_page_content - WHERE {$this->databaseColumn} LIKE ? - )", - ['%' . $value . '%'] - ); - } - }; - } - private function getApplicationFilter(): SelectFilter { $applications = \array_map(static function (Application $application): string { return $application->domainName . $application->domainPath; }, ApplicationHandler::getInstance()->getApplications()); - return new class($applications) extends SelectFilter { + return new class($applications, 'applicationPackageID', 'wcf.acp.page.application') extends SelectFilter { #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { $list->getConditionBuilder()->add( '((page.applicationPackageID = ? AND page.overrideApplicationPackageID IS NULL) OR page.overrideApplicationPackageID = ?)', diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php index 421e5fde436..4ee9d26976d 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php @@ -8,10 +8,6 @@ use wcf\data\paid\subscription\PaidSubscription; use wcf\event\gridView\admin\PaidSubscriptionGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\NumberColumnRenderer; @@ -22,6 +18,11 @@ use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; use wcf\system\payment\method\PaymentMethodHandler; +use wcf\system\view\filter\FloatFilter; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; /** @@ -42,22 +43,18 @@ public function __construct() GridViewColumn::for('subscriptionID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('title') ->label('wcf.global.title') ->titleColumn() ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: 'titleI18n'), - GridViewColumn::for('description') - ->label('wcf.global.description') - ->filter(new I18nTextFilter()) - ->hidden(), GridViewColumn::for('cost') ->label('wcf.acp.paidSubscription.cost') ->sortable() - ->filter(new NumericFilter()) + ->filter(FloatFilter::class) ->renderer( new class extends NumberColumnRenderer { #[\Override] @@ -71,14 +68,9 @@ public function render(mixed $value, DatabaseObject $row): string } } ), - GridViewColumn::for('currency') - ->label('wcf.acp.paidSubscription.currency') - ->filter(new SelectFilter($this->getAvailableCurrencies())) - ->hidden(), GridViewColumn::for('subscriptionLength') ->label('wcf.acp.paidSubscription.subscriptionLength') ->sortable() - ->filter(new NumericFilter()) ->renderer( new class extends NumberColumnRenderer { #[\Override] @@ -103,9 +95,13 @@ public function render(mixed $value, DatabaseObject $row): string ->label('wcf.global.showOrder') ->sortable() ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ]); + $this->addAvailableFilters([ + new I18nTextFilter('description', 'wcf.global.description'), + new SelectFilter($this->getAvailableCurrencies(), 'currency', 'wcf.acp.paidSubscription.currency'), + ]); $provider = new PaidSubscriptionInteractions(); $provider->addInteractions([ new Divider(), diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionTransactionLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionTransactionLogGridView.class.php index ee6fd5fb188..3188ea31c03 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionTransactionLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionTransactionLogGridView.class.php @@ -13,10 +13,6 @@ use wcf\system\cache\builder\PaidSubscriptionCacheBuilder; use wcf\system\cache\runtime\UserRuntimeCache; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -30,6 +26,10 @@ use wcf\system\interaction\IInteractionProvider; use wcf\system\interaction\LinkInteraction; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -55,8 +55,9 @@ public function __construct() GridViewColumn::for('logMessage') ->label('wcf.acp.paidSubscription.transactionLog.logMessage') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->renderer(new TruncatedTextColumnRenderer()) + ->valueEncoding(false) ->sortable(), GridViewColumn::for('userID') ->label('wcf.user.username') @@ -84,10 +85,14 @@ public function render(mixed $value, DatabaseObject $row): string } } ) - ->filter(new UserFilter()), + ->filter(UserFilter::class), GridViewColumn::for('paymentMethodObjectTypeID') ->label('wcf.acp.paidSubscription.transactionLog.paymentMethod') - ->filter(new SelectFilter($this->getAvailablePaymentMethods())) + ->filter(new SelectFilter( + $this->getAvailablePaymentMethods(), + 'paymentMethodObjectTypeID', + 'wcf.acp.paidSubscription.transactionLog.paymentMethod' + )) ->renderer( new class extends AbstractColumnRenderer { #[\Override] @@ -100,22 +105,25 @@ public function render(mixed $value, DatabaseObject $row): string } ) ->sortable(), - GridViewColumn::for('subscriptionID') - ->label('wcf.acp.paidSubscription.subscription') - ->filter(new SelectFilter($this->getAvailableSubscriptions())) - ->hidden(), GridViewColumn::for('transactionID') ->label('wcf.acp.paidSubscription.transactionLog.transactionID') ->renderer(new DefaultColumnRenderer()) - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('logTime') ->label('wcf.acp.paidSubscription.transactionLog.logTime') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), ]); + $this->addAvailableFilters([ + new SelectFilter( + $this->getAvailableSubscriptions(), + 'subscriptionID', + 'wcf.acp.paidSubscription.subscription' + ) + ]); $this->setInteractionProvider($this->getInteractions()); $this->addRowLink(new GridViewRowLink(PaidSubscriptionTransactionLogPage::class)); $this->setDefaultSortField("logTime"); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php index 0379bbcd4aa..2f9c5f0239b 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php @@ -10,10 +10,6 @@ use wcf\event\gridView\admin\PaidSubscriptionUserGridViewInitialized; use wcf\system\cache\builder\PaidSubscriptionCacheBuilder; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\ObjectIdFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; use wcf\system\gridView\renderer\PhraseColumnRenderer; @@ -22,6 +18,10 @@ use wcf\system\interaction\admin\PaidSubscriptionUserInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\ObjectIdFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; /** @@ -42,23 +42,28 @@ public function __construct() GridViewColumn::for('subscriptionUserID') ->label('wcf.global.objectID') ->sortable() - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->renderer(new ObjectIdColumnRenderer()), GridViewColumn::for('userID') ->label('wcf.user.username') ->titleColumn() ->renderer(new UserLinkColumnRenderer(UserEditForm::class)) - ->filter(new UserFilter()) + ->filter(UserFilter::class) ->sortable(sortByDatabaseColumn: "user_table.username"), GridViewColumn::for('title') ->label('wcf.acp.paidSubscription.subscription') - ->filter(new SelectFilter($this->getAvailableSubscriptions(), "subscriptionID")) + ->filter(new SelectFilter( + $this->getAvailableSubscriptions(), + 'title', + 'wcf.acp.paidSubscription.subscription', + 'subscriptionID' + )) ->renderer(new PhraseColumnRenderer()) ->sortable(sortByDatabaseColumn: "paid_subscription.title"), GridViewColumn::for('endDate') ->label('wcf.acp.paidSubscription.user.endDate') ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->sortable(), ]); @@ -70,9 +75,7 @@ public function __construct() static fn(PaidSubscriptionUser $user) => $user->endDate > 0 ), ]); - $this->setInteractionProvider($provider); - $this->setDefaultSortField("userID"); } diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php index 5b9b1460772..bf515b32d09 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php @@ -8,9 +8,6 @@ use wcf\data\reaction\type\ReactionType; use wcf\event\gridView\admin\ReactionTypeGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -22,6 +19,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -42,7 +42,7 @@ public function __construct() GridViewColumn::for("reactionTypeID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("image") ->label("wcf.acp.reactionType.image") @@ -67,12 +67,12 @@ public function getClasses(): string ->titleColumn() ->label("wcf.global.title") ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: "titleI18n"), GridViewColumn::for("showOrder") ->label("wcf.global.showOrder") ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/SmileyGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/SmileyGridView.class.php index 177e9c9c6ff..41ea5013b73 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/SmileyGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/SmileyGridView.class.php @@ -9,10 +9,6 @@ use wcf\data\smiley\Smiley; use wcf\data\smiley\SmileyCache; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -24,6 +20,10 @@ use wcf\system\interaction\bulk\admin\SmileyBulkInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -66,12 +66,12 @@ public function getClasses(): string GridViewColumn::for('smileyTitle') ->label('wcf.global.title') ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer(new PhraseColumnRenderer()) ->sortable(sortByDatabaseColumn: "smileyTitleI18n"), GridViewColumn::for('aliases') ->label('wcf.acp.smiley.aliases') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable() ->renderer( new class extends AbstractColumnRenderer { @@ -95,14 +95,14 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for("categoryID") ->label("wcf.global.category") ->filter( - new class($this->getSmileyCategories()) extends SelectFilter { + new class($this->getSmileyCategories(), 'categoryID', 'wcf.global.category') extends SelectFilter { #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { if (\intval($value) === 0) { $list->getConditionBuilder()->add("categoryID IS NULL"); } else { - parent::applyFilter($list, $id, $value); + parent::applyFilter($list, $value); } } } @@ -123,7 +123,7 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('showOrder') ->label('wcf.global.showOrder') ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/StyleGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/StyleGridView.class.php index d1ef585e649..9fc8883879b 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/StyleGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/StyleGridView.class.php @@ -8,7 +8,6 @@ use wcf\data\style\StyleList; use wcf\event\gridView\admin\StyleGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -19,6 +18,7 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -71,7 +71,7 @@ public function render(mixed $value, DatabaseObject $row): string } }, ]) - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for('styleVersion') ->label('wcf.acp.style.styleVersion') ->sortable(), @@ -100,7 +100,7 @@ public function render(mixed $value, DatabaseObject $row): string } }, ]) - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for('users') ->label('wcf.acp.style.users') ->sortable(true, 'users') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php index b54621be5fb..23351337377 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php @@ -8,9 +8,6 @@ use wcf\data\tag\TagList; use wcf\event\gridView\admin\TagGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -21,6 +18,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\language\LanguageFactory; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -46,12 +46,12 @@ public function __construct() GridViewColumn::for('name') ->label('wcf.acp.tag.name') ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('synonymName') ->label('wcf.acp.tag.synonymFor') ->renderer(new DefaultColumnRenderer()) - ->filter(new TextFilter("synonym.name")) + ->filter(new TextFilter('synonymName', 'wcf.acp.tag.synonymFor', 'synonym.name')) ->sortable(sortByDatabaseColumn: "synonym.name"), GridViewColumn::for('languageName') ->label('wcf.acp.tag.languageID') @@ -79,12 +79,17 @@ public function render(mixed $value, DatabaseObject $row): string } } ) - ->filter(new SelectFilter(LanguageFactory::getInstance()->getLanguages(), "tag.languageID")) + ->filter(new SelectFilter( + LanguageFactory::getInstance()->getLanguages(), + 'languageName', + 'wcf.acp.tag.languageID', + 'tag.languageID' + )) ->sortable(sortByDatabaseColumn: 'language.languageName'), GridViewColumn::for('usageCount') ->label('wcf.acp.tag.usageCount') ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter($this->subSelectUsageCount(), true)) + ->filter(new IntegerFilter('usageCount', 'wcf.acp.tag.usageCount', $this->subSelectUsageCount())) ->sortable(sortByDatabaseColumn: $this->subSelectUsageCount()), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TemplateGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TemplateGridView.class.php index a95b982d091..9be143afeb5 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TemplateGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TemplateGridView.class.php @@ -17,10 +17,6 @@ use wcf\system\form\builder\field\AbstractFormField; use wcf\system\form\builder\field\SingleSelectionFormField; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\AbstractFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -29,6 +25,10 @@ use wcf\system\interaction\admin\TemplateInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\AbstractFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; /** @@ -53,7 +53,11 @@ public function __construct(?int $templateGroupID = null) ->renderer(new ObjectIdColumnRenderer()), GridViewColumn::for("application") ->label("wcf.acp.template.application") - ->filter(new SelectFilter($this->getApplications())) + ->filter(new SelectFilter( + $this->getApplications(), + 'application', + 'wcf.acp.template.application' + )) ->renderer(new DefaultColumnRenderer()) ->sortable(), GridViewColumn::for("templateGroupID") @@ -64,10 +68,10 @@ public function __construct(?int $templateGroupID = null) ->label("wcf.global.name") ->titleColumn() ->sortable() - ->filter(new TextFilter()), + ->filter(TextFilter::class), GridViewColumn::for("lastModificationTime") ->label("wcf.acp.template.lastModificationTime") - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->renderer(new TimeColumnRenderer()) ->sortable(), ]); @@ -118,20 +122,20 @@ private function getApplications(): array private function getTemplateGroupFilter(): AbstractFilter { - return new class extends AbstractFilter { + return new class('templateGroupID', 'wcf.acp.template.group') extends AbstractFilter { #[\Override] - public function getFormField(string $id, string $label): AbstractFormField + public function getFormField(): AbstractFormField { - return SingleSelectionFormField::create($id) - ->label($label) + return SingleSelectionFormField::create($this->id) + ->label($this->languageItem) ->nullable() ->options($this->getSelectOptions(), true); } #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { - $columnName = $this->getDatabaseColumnName($list, $id); + $columnName = $this->getDatabaseColumnName($list); if ($value == TemplateGridView::DEFAULT_TEMPLATE_GROUP_ID) { $list->getConditionBuilder()->add("{$columnName} IS NULL"); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TemplateGroupGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TemplateGroupGridView.class.php index 02cf6004d8c..436f23f4ff0 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TemplateGroupGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TemplateGroupGridView.class.php @@ -7,9 +7,6 @@ use wcf\data\template\group\TemplateGroup; use wcf\event\gridView\admin\TemplateGroupGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\ObjectIdColumnRenderer; @@ -17,6 +14,9 @@ use wcf\system\interaction\admin\TemplateGroupInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; /** @@ -40,20 +40,28 @@ public function __construct() GridViewColumn::for('templateGroupName') ->label('wcf.global.name') ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer(new PhraseColumnRenderer()) ->sortable(sortByDatabaseColumn: 'templateGroupNameI18n'), GridViewColumn::for('templateGroupFolderName') ->label('wcf.acp.template.group.folderName') - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for('templates') ->label('wcf.acp.template.group.templates') - ->filter(new NumericFilter($this->subQueryTemplates())) + ->filter(new IntegerFilter( + 'templates', + 'wcf.acp.template.group.templates', + $this->subQueryTemplates(), + )) ->sortable(sortByDatabaseColumn: $this->subQueryTemplates()), GridViewColumn::for('styles') ->label('wcf.acp.template.group.styles') - ->filter(new NumericFilter($this->subQueryStyles())) + ->filter(new IntegerFilter( + 'styles', + 'wcf.acp.template.group.styles', + $this->subQueryStyles(), + )) ->sortable(sortByDatabaseColumn: $this->subQueryStyles()), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php index 384cb6c787b..3b346ecd874 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php @@ -8,9 +8,6 @@ use wcf\data\trophy\Trophy; use wcf\event\gridView\admin\TrophyGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\ObjectIdFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -22,6 +19,9 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -42,7 +42,7 @@ public function __construct() GridViewColumn::for("trophyID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(new ObjectIdFilter()) + ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("image") ->label("wcf.acp.trophy") @@ -67,12 +67,12 @@ public function getClasses(): string ->titleColumn() ->label("wcf.global.title") ->renderer(new PhraseColumnRenderer()) - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->sortable(sortByDatabaseColumn: "titleI18n"), GridViewColumn::for("showOrder") ->label("wcf.global.showOrder") ->renderer(new NumberColumnRenderer()) - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/UserAuthenticationFailureGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/UserAuthenticationFailureGridView.class.php index aa8b5843d10..1e294503fb7 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/UserAuthenticationFailureGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/UserAuthenticationFailureGridView.class.php @@ -8,10 +8,6 @@ use wcf\data\user\authentication\failure\UserAuthenticationFailureList; use wcf\event\gridView\admin\UserAuthenticationFailureGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\IpAddressFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; -use wcf\system\gridView\filter\TimeFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\renderer\DefaultColumnRenderer; use wcf\system\gridView\renderer\IpAddressColumnRenderer; @@ -19,6 +15,10 @@ use wcf\system\gridView\renderer\TimeColumnRenderer; use wcf\system\gridView\renderer\TruncatedTextColumnRenderer; use wcf\system\gridView\renderer\UserLinkColumnRenderer; +use wcf\system\view\filter\IpAddressFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; +use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; /** @@ -44,10 +44,14 @@ public function __construct() ->label("wcf.acp.user.authentication.failure.environment") ->sortable() ->filter( - new SelectFilter([ - 'user' => "wcf.acp.user.authentication.failure.environment.user", - 'admin' => "wcf.acp.user.authentication.failure.environment.admin", - ]) + new SelectFilter( + [ + 'user' => "wcf.acp.user.authentication.failure.environment.user", + 'admin' => "wcf.acp.user.authentication.failure.environment.admin", + ], + "environment", + "wcf.acp.user.authentication.failure.environment" + ) ) ->renderer( new class extends DefaultColumnRenderer { @@ -65,21 +69,25 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for("userID") ->label("wcf.user.username") ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->renderer(new UserLinkColumnRenderer(UserEditForm::class)) ->sortable(), GridViewColumn::for("time") ->label("wcf.acp.user.authentication.failure.time") - ->filter(new TimeFilter()) + ->filter(TimeFilter::class) ->renderer(new TimeColumnRenderer()) ->sortable(), GridViewColumn::for("validationError") ->label("wcf.acp.user.authentication.failure.validationError") ->filter( - new SelectFilter([ - 'invalidPassword' => "wcf.acp.user.authentication.failure.validationError.invalidPassword", - "invalidUsername" => "wcf.acp.user.authentication.failure.validationError.invalidUsername", - ]) + new SelectFilter( + [ + 'invalidPassword' => "wcf.acp.user.authentication.failure.validationError.invalidPassword", + "invalidUsername" => "wcf.acp.user.authentication.failure.validationError.invalidUsername", + ], + "validationError", + "wcf.acp.user.authentication.failure.validationError" + ) ) ->renderer( new class extends DefaultColumnRenderer { @@ -97,13 +105,14 @@ public function render(mixed $value, DatabaseObject $row): string ->sortable(), GridViewColumn::for("ipAddress") ->label("wcf.user.ipAddress") - ->filter(new IpAddressFilter()) + ->filter(IpAddressFilter::class) ->renderer(new IpAddressColumnRenderer()) ->sortable(), GridViewColumn::for("userAgent") ->label("wcf.user.userAgent") ->renderer(new TruncatedTextColumnRenderer(75)) - ->filter(new TextFilter()) + ->filter(TextFilter::class) + ->valueEncoding(false) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/UserGroupAssignmentGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/UserGroupAssignmentGridView.class.php index 97d12e5fa3b..a11d64576d5 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/UserGroupAssignmentGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/UserGroupAssignmentGridView.class.php @@ -9,8 +9,6 @@ use wcf\data\user\group\UserGroup; use wcf\event\gridView\admin\UserGroupAssignmentGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TextFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -19,6 +17,8 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -44,18 +44,20 @@ public function __construct() GridViewColumn::for("title") ->label("wcf.global.name") ->titleColumn() - ->filter(new TextFilter()) + ->filter(TextFilter::class) ->sortable(), GridViewColumn::for("groupID") ->label("wcf.acp.group.assignment.userGroup") - ->filter( - new SelectFilter(UserGroup::getSortedGroupsByType([], [ + ->filter(new SelectFilter( + UserGroup::getSortedGroupsByType([], [ UserGroup::EVERYONE, UserGroup::GUESTS, UserGroup::OWNER, UserGroup::USERS, - ])) - ) + ]), + 'groupID', + 'wcf.acp.group.assignment.userGroup' + )) ->sortable() ->renderer( new class extends DefaultColumnRenderer { diff --git a/wcfsetup/install/files/lib/system/gridView/admin/UserGroupGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/UserGroupGridView.class.php index edb0c5d4ded..2e19babf274 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/UserGroupGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/UserGroupGridView.class.php @@ -9,8 +9,6 @@ use wcf\data\user\group\UserGroup; use wcf\event\gridView\admin\UserGroupGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\NumericFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\ILinkColumnRenderer; @@ -21,6 +19,8 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\request\LinkHandler; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; use wcf\system\WCF; /** @@ -45,7 +45,7 @@ public function __construct() GridViewColumn::for("groupName") ->label("wcf.global.name") ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer( new class extends PhraseColumnRenderer { #[\Override] @@ -94,11 +94,11 @@ public function render(mixed $value, DatabaseObject $row): string } } ) - ->filter(new NumericFilter($this->subSelectMembers())) + ->filter(new IntegerFilter('members', 'wcf.acp.group.members', $this->subSelectMembers())) ->sortable(sortByDatabaseColumn: $this->subSelectMembers()), GridViewColumn::for("priority") ->label("wcf.acp.group.priority") - ->filter(new NumericFilter()) + ->filter(IntegerFilter::class) ->renderer(new NumberColumnRenderer()) ->sortable(), ]); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/UserRankGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/UserRankGridView.class.php index 7e8766efbda..f4c9285461d 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/UserRankGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/UserRankGridView.class.php @@ -9,8 +9,6 @@ use wcf\data\user\rank\UserRank; use wcf\event\gridView\admin\UserRankGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\I18nTextFilter; -use wcf\system\gridView\filter\SelectFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\DefaultColumnRenderer; @@ -20,6 +18,9 @@ use wcf\system\interaction\bulk\admin\UserRankBulkInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -46,7 +47,7 @@ public function __construct() ->label('wcf.acp.user.rank.title') ->sortable(true, 'rankTitleI18n') ->titleColumn() - ->filter(new I18nTextFilter()) + ->filter(I18nTextFilter::class) ->renderer([ new class extends DefaultColumnRenderer { public function render(mixed $value, DatabaseObject $row): string @@ -75,7 +76,11 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('groupID') ->label('wcf.user.group') ->sortable() - ->filter(new SelectFilter($this->getAvailableUserGroups())) + ->filter(new SelectFilter( + $this->getAvailableUserGroups(), + 'groupID', + 'wcf.user.group' + )) ->renderer([ new class extends DefaultColumnRenderer { public function render(mixed $value, DatabaseObject $row): string @@ -106,7 +111,8 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for('requiredPoints') ->label('wcf.acp.user.rank.requiredPoints') ->sortable() - ->renderer(new NumberColumnRenderer()), + ->renderer(new NumberColumnRenderer()) + ->filter(IntegerFilter::class), ]); $provider = new UserRankInteractions(); diff --git a/wcfsetup/install/files/lib/system/gridView/admin/UserTrophyGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/UserTrophyGridView.class.php index 6fa6d0ba64e..75166a195fd 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/UserTrophyGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/UserTrophyGridView.class.php @@ -12,9 +12,6 @@ use wcf\event\gridView\admin\UserTrophyGridViewInitialized; use wcf\system\form\builder\field\SelectFormField; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -26,6 +23,9 @@ use wcf\system\interaction\bulk\admin\UserTrophyBulkInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -51,7 +51,7 @@ public function __construct() GridViewColumn::for("userID") ->label("wcf.user.username") ->titleColumn() - ->filter(new UserFilter()) + ->filter(UserFilter::class) ->renderer(new UserLinkColumnRenderer(UserEditForm::class)) ->sortable(), GridViewColumn::for("image") @@ -92,7 +92,7 @@ public function render(mixed $value, DatabaseObject $row): string ->label('wcf.global.date') ->sortable() ->renderer(new TimeColumnRenderer()) - ->filter(new TimeFilter()), + ->filter(TimeFilter::class), ]); $provider = new UserTrophyInteractions(); @@ -119,14 +119,9 @@ public function render(mixed $value, DatabaseObject $row): string private function getTrophySelectFilter(): SelectFilter { - return new class() extends SelectFilter { - public function __construct() - { - parent::__construct([], "trophyID"); - } - + return new class([], 'trophyID', 'wcf.acp.trophy') extends SelectFilter { #[\Override] - public function getFormField(string $id, string $label): SelectFormField + public function getFormField(): SelectFormField { $options = []; foreach (TrophyCategoryCache::getInstance()->getCategories() as $category) { @@ -147,8 +142,8 @@ public function getFormField(string $id, string $label): SelectFormField } } - return SelectFormField::create($id) - ->label($label) + return SelectFormField::create($this->id) + ->label($this->languageItem) ->options($options, true, false); } diff --git a/wcfsetup/install/files/lib/system/gridView/filter/AbstractFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/AbstractFilter.class.php deleted file mode 100644 index a2e13205719..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/AbstractFilter.class.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @since 6.2 - */ -abstract class AbstractFilter implements IGridViewFilter -{ - public function __construct(protected readonly string $databaseColumn = '') {} - - #[\Override] - public function renderValue(string $value): string - { - return $value; - } - - /** - * @param DatabaseObjectList $list - */ - protected function getDatabaseColumnName(DatabaseObjectList $list, string $id): string - { - return ($this->databaseColumn ?: $list->getDatabaseTableAlias() . '.' . $id); - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/BooleanFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/BooleanFilter.class.php deleted file mode 100644 index 7bbd2bc5a8f..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/BooleanFilter.class.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @since 6.2 - */ -class BooleanFilter extends AbstractFilter -{ - public function __construct(string $databaseColumn = '', private readonly bool $reverseValue = false) - { - parent::__construct($databaseColumn); - } - - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return CheckboxFormField::create($id) - ->label($label) - ->nullable(); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add("{$columnName} = ?", [ - $this->reverseValue ? 0 : 1, - ]); - } - - #[\Override] - public function renderValue(string $value): string - { - return ''; - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/CategoryFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/CategoryFilter.class.php deleted file mode 100644 index 96828898eed..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/CategoryFilter.class.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @since 6.2 - */ -class CategoryFilter extends AbstractFilter -{ - /** - * @param \Traversable $options - */ - public function __construct(private readonly \Traversable $options, string $databaseColumn = '') - { - parent::__construct($databaseColumn); - } - - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return SelectFormField::create($id) - ->label($label) - ->options($this->options, true); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $category = CategoryHandler::getInstance()->getCategory((int)$value); - if ($category === null) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add("{$columnName} = ?", [$category->categoryID]); - } - - #[\Override] - public function renderValue(string $value): string - { - return CategoryHandler::getInstance()->getCategory((int)$value)->getTitle(); - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/DateFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/DateFilter.class.php deleted file mode 100644 index 772e7f5d634..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/DateFilter.class.php +++ /dev/null @@ -1,136 +0,0 @@ - - * @since 6.2 - */ -class DateFilter extends AbstractFilter -{ - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return DateRangeFormField::create($id) - ->label($label) - ->nullable(); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - $timestamps = $this->getTimestamps($value); - - if (!$timestamps['from'] && !$timestamps['to']) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - if (!$timestamps['to']) { - $list->getConditionBuilder()->add("{$columnName} >= ?", [$timestamps['from']]); - } else { - $list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$timestamps['from'], $timestamps['to']]); - } - } - - #[\Override] - public function renderValue(string $value): string - { - $values = explode(';', $value); - if (\count($values) !== 2) { - return ''; - } - - $locale = WCF::getLanguage()->getLocale(); - $fromString = $toString = ''; - if ($values[0] !== '') { - $fromDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d', - $values[0], - WCF::getUser()->getTimeZone() - ); - if ($fromDateTime !== false) { - $fromString = \IntlDateFormatter::formatObject( - $fromDateTime, - [ - \IntlDateFormatter::LONG, - \IntlDateFormatter::NONE, - ], - $locale - ); - } - } - if ($values[1] !== '') { - $toDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d', - $values[1], - WCF::getUser()->getTimeZone() - ); - if ($toDateTime !== false) { - $toString = \IntlDateFormatter::formatObject( - $toDateTime, - [ - \IntlDateFormatter::LONG, - \IntlDateFormatter::NONE, - ], - $locale - ); - } - } - - if ($fromString && $toString) { - return $fromString . ' ‐ ' . $toString; - } else if ($fromString) { - return '>= ' . $fromString; - } else if ($toString) { - return '<= ' . $toString; - } - - return ''; - } - - /** - * @return array{from: int, to: int} - */ - private function getTimestamps(string $value): array - { - $from = 0; - $to = 0; - - $values = explode(';', $value); - if (\count($values) === 2) { - $fromDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d', - $values[0] - ); - if ($fromDateTime !== false) { - $fromDateTime = $fromDateTime->setTime(0, 0); - $from = $fromDateTime->getTimestamp(); - } - - $toDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d', - $values[1] - ); - if ($toDateTime !== false) { - $toDateTime = $toDateTime->setTime(23, 59, 59); - $to = $toDateTime->getTimestamp(); - } - } - - return [ - 'from' => $from, - 'to' => $to, - ]; - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/IGridViewFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/IGridViewFilter.class.php deleted file mode 100644 index dfbcb648956..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/IGridViewFilter.class.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @since 6.2 - */ -interface IGridViewFilter -{ - /** - * Returns the form field for the input of this filter. - */ - public function getFormField(string $id, string $label): AbstractFormField; - - /** - * Applies the filter to the given database object list. - * - * @param DatabaseObjectList $list - */ - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void; - - /** - * Renders the filter value in a human readable format. - */ - public function renderValue(string $value): string; -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/NumericFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/NumericFilter.class.php deleted file mode 100644 index 744c035213e..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/NumericFilter.class.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @since 6.2 - */ -class NumericFilter extends AbstractFilter -{ - public function __construct( - string $databaseColumn = '', - protected readonly bool $integerValues = false, - protected readonly null|int|float $minimum = null, - protected readonly null|int|float $maximum = null, - ) { - parent::__construct($databaseColumn); - } - - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return NumericRangeFormField::create($id) - ->label($label) - ->nullable() - ->integerValues($this->integerValues) - ->minimum($this->minimum) - ->maximum($this->maximum); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - $values = $this->parseValue($value); - - if (!$values['from'] && !$values['to']) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - if (!$values['to']) { - $list->getConditionBuilder()->add("{$columnName} >= ?", [$values['from']]); - } else { - $list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$values['from'], $values['to']]); - } - } - - #[\Override] - public function renderValue(string $value): string - { - $values = $this->parseValue($value); - - if ($values['from'] && $values['to']) { - return $values['from'] . ' ‐ ' . $values['to']; - } else if ($values['from']) { - return '>= ' . $values['from']; - } else if ($values['to']) { - return '<= ' . $values['to']; - } - - return ''; - } - - /** - * @return array{from: int, to: int} - */ - private function parseValue(string $value): array - { - $from = 0; - $to = 0; - - $values = explode(';', $value); - if (\count($values) === 2) { - $from = $values[0]; - $to = $values[1]; - } - - return [ - 'from' => $from, - 'to' => $to, - ]; - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/SelectFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/SelectFilter.class.php deleted file mode 100644 index 6b6b87a601e..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/SelectFilter.class.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @since 6.2 - */ -class SelectFilter extends AbstractFilter -{ - /** - * @param array $options - */ - public function __construct( - private readonly array $options, - string $databaseColumn = '', - protected readonly bool $labelLanguageItems = true - ) { - parent::__construct($databaseColumn); - } - - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return SelectFormField::create($id) - ->label($label) - ->options($this->options, labelLanguageItems: $this->labelLanguageItems); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - if (!isset($this->options[$value])) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add("{$columnName} = ?", [$value]); - } - - #[\Override] - public function renderValue(string $value): string - { - return WCF::getLanguage()->get($this->options[$value]); - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/TextFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/TextFilter.class.php deleted file mode 100644 index fd2dadfb66c..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/TextFilter.class.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @since 6.2 - */ -class TextFilter extends AbstractFilter -{ - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return TextFormField::create($id) - ->label($label); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add( - "{$columnName} LIKE ?", - ['%' . WCF::getDB()->escapeLikeValue($value) . '%'] - ); - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/TimeFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/TimeFilter.class.php deleted file mode 100644 index 151f5b403af..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/TimeFilter.class.php +++ /dev/null @@ -1,137 +0,0 @@ - - * @since 6.2 - */ -class TimeFilter extends AbstractFilter -{ - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return DateRangeFormField::create($id) - ->label($label) - ->nullable() - ->supportTime(); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $columnName = $this->getDatabaseColumnName($list, $id); - $timestamps = $this->getTimestamps($value); - - if (!$timestamps['from'] && !$timestamps['to']) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - if (!$timestamps['to']) { - $list->getConditionBuilder()->add("{$columnName} >= ?", [$timestamps['from']]); - } else { - $list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$timestamps['from'], $timestamps['to']]); - } - } - - #[\Override] - public function renderValue(string $value): string - { - $values = explode(';', $value); - if (\count($values) !== 2) { - return ''; - } - - $locale = WCF::getLanguage()->getLocale(); - $fromString = $toString = ''; - if ($values[0] !== '') { - $fromDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d\TH:i:sP', - $values[0], - WCF::getUser()->getTimeZone() - ); - if ($fromDateTime !== false) { - $fromString = \IntlDateFormatter::formatObject( - $fromDateTime, - [ - \IntlDateFormatter::LONG, - \IntlDateFormatter::SHORT, - ], - $locale - ); - } - } - if ($values[1] !== '') { - $toDateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d\TH:i:sP', - $values[1], - WCF::getUser()->getTimeZone() - ); - if ($toDateTime !== false) { - $toString = \IntlDateFormatter::formatObject( - $toDateTime, - [ - \IntlDateFormatter::LONG, - \IntlDateFormatter::SHORT, - ], - $locale - ); - } - } - - if ($fromString && $toString) { - return $fromString . ' ‐ ' . $toString; - } else if ($fromString) { - return '>= ' . $fromString; - } else if ($toString) { - return '<= ' . $toString; - } - - return ''; - } - - /** - * @return array{from: int, to: int} - */ - private function getTimestamps(string $value): array - { - $from = 0; - $to = 0; - - $values = explode(';', $value); - if (\count($values) === 2) { - $from = $this->getTimestamp($values[0]); - $to = $this->getTimestamp($values[1]); - } - - return [ - 'from' => $from, - 'to' => $to, - ]; - } - - private function getTimestamp(string $date): int - { - $dateTime = \DateTimeImmutable::createFromFormat( - 'Y-m-d\TH:i:sP', - $date - ); - - if ($dateTime !== false) { - return $dateTime->getTimestamp(); - } - - return 0; - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/UserFilter.class.php b/wcfsetup/install/files/lib/system/gridView/filter/UserFilter.class.php deleted file mode 100644 index 8271408c8fa..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/UserFilter.class.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @since 6.2 - */ -class UserFilter extends AbstractFilter -{ - #[\Override] - public function getFormField(string $id, string $label): AbstractFormField - { - return UserFormField::create($id) - ->label($label) - ->nullable(); - } - - #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void - { - $user = UserRuntimeCache::getInstance()->getObject((int)$value); - if ($user === null) { - throw new InvalidFilterValue("Invalid value '{$value}' for filter '{$id}' given."); - } - - $columnName = $this->getDatabaseColumnName($list, $id); - - $list->getConditionBuilder()->add("{$columnName} = ?", [$user->userID]); - } - - #[\Override] - public function renderValue(string $value): string - { - $user = UserRuntimeCache::getInstance()->getObject((int)$value); - - return $user ? $user->username : ''; - } -} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/exception/InvalidFilterValue.class.php b/wcfsetup/install/files/lib/system/gridView/filter/exception/InvalidFilterValue.class.php deleted file mode 100644 index 3bb8168db4c..00000000000 --- a/wcfsetup/install/files/lib/system/gridView/filter/exception/InvalidFilterValue.class.php +++ /dev/null @@ -1,13 +0,0 @@ - - * @since 6.2 - */ -final class InvalidFilterValue extends \RuntimeException {} diff --git a/wcfsetup/install/files/lib/system/gridView/user/ModerationQueueGridView.class.php b/wcfsetup/install/files/lib/system/gridView/user/ModerationQueueGridView.class.php index 4655ce17559..15f18e9c066 100644 --- a/wcfsetup/install/files/lib/system/gridView/user/ModerationQueueGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/user/ModerationQueueGridView.class.php @@ -9,10 +9,6 @@ use wcf\data\moderation\queue\ViewableModerationQueueList; use wcf\event\gridView\user\ModerationQueueGridViewInitialized; use wcf\system\gridView\AbstractGridView; -use wcf\system\gridView\filter\NumericFilter; -use wcf\system\gridView\filter\SelectFilter; -use wcf\system\gridView\filter\TimeFilter; -use wcf\system\gridView\filter\UserFilter; use wcf\system\gridView\GridViewColumn; use wcf\system\gridView\GridViewRowLink; use wcf\system\gridView\renderer\AbstractColumnRenderer; @@ -23,6 +19,10 @@ use wcf\system\interaction\bulk\user\ModerationQueueBulkInteractions; use wcf\system\interaction\user\ModerationQueueInteractions; use wcf\system\moderation\queue\ModerationQueueManager; +use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\SelectFilter; +use wcf\system\view\filter\TimeFilter; +use wcf\system\view\filter\UserFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -45,85 +45,82 @@ public function __construct(?int $status = null) ->label('wcf.global.title') ->titleColumn() ->renderer( - new - class extends DefaultColumnRenderer { - #[\Override] - public function render(mixed $value, DatabaseObject $row): string - { - \assert($row instanceof ViewableModerationQueue); - $title = StringUtil::encodeHTML($row->getTitle()); + new class extends DefaultColumnRenderer { + #[\Override] + public function render(mixed $value, DatabaseObject $row): string + { + \assert($row instanceof ViewableModerationQueue); + $title = StringUtil::encodeHTML($row->getTitle()); - if ($row->isNew()) { - $badgeLabel = WCF::getLanguage()->get('wcf.message.new'); - $badge = <<isNew()) { + $badgeLabel = WCF::getLanguage()->get('wcf.message.new'); + $badge = <<{$badgeLabel} HTML; - } else { - $badge = ''; - } + } else { + $badge = ''; + } - return <<label("wcf.moderation.username") ->renderer( - new - class extends UserLinkColumnRenderer { - #[\Override] - public function render(mixed $value, DatabaseObject $row): string - { - \assert($row instanceof ViewableModerationQueue); - $userID = $row->getAffectedObject()->getUserID(); - - if ($userID) { - return parent::render($userID, $row); - } - - if ($row->getAffectedObject()->getUsername()) { - return StringUtil::encodeHTML($row->getAffectedObject()->getUsername()); - } + new class extends UserLinkColumnRenderer { + #[\Override] + public function render(mixed $value, DatabaseObject $row): string + { + \assert($row instanceof ViewableModerationQueue); + $userID = $row->getAffectedObject()->getUserID(); - return ''; + if ($userID) { + return parent::render($userID, $row); } - #[\Override] - public function prepare(mixed $value, DatabaseObject $row): void - { - \assert($row instanceof ViewableModerationQueue); - parent::prepare($row->getAffectedObject()->getUserID(), $row); + if ($row->getAffectedObject()->getUsername()) { + return StringUtil::encodeHTML($row->getAffectedObject()->getUsername()); } + + return ''; + } + + #[\Override] + public function prepare(mixed $value, DatabaseObject $row): void + { + \assert($row instanceof ViewableModerationQueue); + parent::prepare($row->getAffectedObject()->getUserID(), $row); } + } ), GridViewColumn::for("assignedUser") ->label("wcf.moderation.assignedUser") - ->filter(new UserFilter("moderation_queue.assignedUserID")) + ->filter(new UserFilter('assignedUser', 'wcf.moderation.assignedUser', 'moderation_queue.assignedUserID')) ->sortable(sortByDatabaseColumn: "assignedUsername") ->renderer( - new - class extends UserLinkColumnRenderer { - public function __construct() - { - parent::__construct(fallbackValue: "assignedUsername"); - } + new class extends UserLinkColumnRenderer { + public function __construct() + { + parent::__construct(fallbackValue: "assignedUsername"); + } - #[\Override] - public function render(mixed $value, DatabaseObject $row): string - { - \assert($row instanceof ViewableModerationQueue); - return parent::render($row->assignedUserID, $row); - } + #[\Override] + public function render(mixed $value, DatabaseObject $row): string + { + \assert($row instanceof ViewableModerationQueue); + return parent::render($row->assignedUserID, $row); + } - #[\Override] - public function prepare(mixed $value, DatabaseObject $row): void - { - \assert($row instanceof ViewableModerationQueue); - parent::prepare($row->assignedUserID, $row); - } + #[\Override] + public function prepare(mixed $value, DatabaseObject $row): void + { + \assert($row instanceof ViewableModerationQueue); + parent::prepare($row->assignedUserID, $row); } + } ), GridViewColumn::for("definition") ->label("wcf.moderation.type") @@ -158,12 +155,16 @@ public function render(mixed $value, DatabaseObject $row): string ->label("wcf.moderation.status") ->sortable(sortByDatabaseColumn: "moderation_queue.status") ->filter( - new class([ - ModerationQueue::STATUS_OUTSTANDING => "wcf.moderation.status.outstanding", - ModerationQueue::STATUS_DONE => "wcf.moderation.status.done", - ]) extends SelectFilter { + new class( + [ + ModerationQueue::STATUS_OUTSTANDING => "wcf.moderation.status.outstanding", + ModerationQueue::STATUS_DONE => "wcf.moderation.status.done", + ], + 'status', + 'wcf.moderation.status' + ) extends SelectFilter { #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { if ($value == ModerationQueue::STATUS_DONE) { $list->getConditionBuilder()->add( @@ -199,12 +200,12 @@ public function render(mixed $value, DatabaseObject $row): string GridViewColumn::for("comments") ->label("wcf.global.comments") ->sortable(sortByDatabaseColumn: "moderation_queue.comments") - ->filter(new NumericFilter("moderation_queue.comments")) + ->filter(new IntegerFilter('comments', 'wcf.global.comments', 'moderation_queue.comments')) ->renderer(new NumberColumnRenderer()), GridViewColumn::for("lastChangeTime") ->label("wcf.moderation.lastChangeTime") ->sortable(sortByDatabaseColumn: "moderation_queue.lastChangeTime") - ->filter(new TimeFilter("moderation_queue.lastChangeTime")) + ->filter(new TimeFilter('lastChangeTime', 'wcf.moderation.lastChangeTime', "moderation_queue.lastChangeTime")) ->renderer(new TimeColumnRenderer()), ]); @@ -228,13 +229,18 @@ private function getDefinitionFilter(): SelectFilter return new class extends SelectFilter { public function __construct() { - parent::__construct($this->getDefinitionOptions(), "moderation_queue.objectTypeID"); + parent::__construct( + $this->getDefinitionOptions(), + 'definition', + 'wcf.moderation.type', + 'moderation_queue.objectTypeID' + ); } #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { - $columnName = $this->getDatabaseColumnName($list, $id); + $columnName = $this->getDatabaseColumnName($list); $list->getConditionBuilder()->add("{$columnName} IN (?)", [ ModerationQueueManager::getInstance()->getObjectTypeIDs([(int)$value]), diff --git a/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php b/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php index 6abc67bea49..50f97f09114 100644 --- a/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php +++ b/wcfsetup/install/files/lib/system/listView/AbstractListView.class.php @@ -365,9 +365,7 @@ public function countItems(): int */ public function getObjectList(): DatabaseObjectList { - if (!isset($this->objectList)) { - $this->initObjectList(); - } + $this->init(); return $this->objectList; } @@ -418,8 +416,8 @@ public function getID(): string */ public function isFilterable(): bool { - return $this->allowFiltering - && $this->availableFilters !== []; + return $this->getAvailableFilters() !== [] + && $this->allowFiltering; } /** @@ -735,6 +733,8 @@ public function getCssClassName(): string public function render(): string { + $this->init(); + return WCF::getTPL()->render('wcf', 'shared_listView', ['view' => $this]); } @@ -777,6 +777,13 @@ class="listView__item__markAsRead jsTooltip" HTML; } + private function init(): void + { + if (!isset($this->objectList)) { + $this->initObjectList(); + } + } + /** * @return TDatabaseObjectList */ diff --git a/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php index dc2e0966b23..04ee47fd139 100644 --- a/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/BooleanFilter.class.php @@ -16,6 +16,15 @@ */ class BooleanFilter extends AbstractFilter { + public function __construct( + string $id, + string $languageItem, + string $databaseColumn = '', + private readonly bool $reverseValue = false + ) { + parent::__construct($id, $languageItem, $databaseColumn); + } + #[\Override] public function getFormField(): AbstractFormField { diff --git a/wcfsetup/install/files/lib/system/view/filter/FloatFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/FloatFilter.class.php new file mode 100644 index 00000000000..98a10e54abd --- /dev/null +++ b/wcfsetup/install/files/lib/system/view/filter/FloatFilter.class.php @@ -0,0 +1,37 @@ + + * @since 6.2 + */ +class FloatFilter extends NumericFilter +{ + public function __construct( + string $id, + string $languageItem, + string $databaseColumn = '', + protected readonly ?float $minimum = null, + protected readonly ?float $maximum = null, + ) { + parent::__construct($id, $languageItem, $databaseColumn); + } + + #[\Override] + public function getFormField(): AbstractFormField + { + return NumericRangeFormField::create($this->id) + ->label($this->languageItem) + ->nullable() + ->minimum($this->minimum) + ->maximum($this->maximum); + } +} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/I18nTextFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/I18nTextFilter.class.php similarity index 82% rename from wcfsetup/install/files/lib/system/gridView/filter/I18nTextFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/I18nTextFilter.class.php index 861d15fc013..4dcef614965 100644 --- a/wcfsetup/install/files/lib/system/gridView/filter/I18nTextFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/I18nTextFilter.class.php @@ -1,6 +1,6 @@ * @since 6.2 */ class I18nTextFilter extends TextFilter { #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { - $columnName = $this->getDatabaseColumnName($list, $id); + $columnName = $this->getDatabaseColumnName($list); $list->getConditionBuilder()->add("({$columnName} LIKE ? OR {$columnName} IN (SELECT languageItem FROM wcf1_language_item WHERE languageID = ? AND languageItemValue LIKE ?))", [ '%' . WCF::getDB()->escapeLikeValue($value) . '%', diff --git a/wcfsetup/install/files/lib/system/view/filter/IntegerFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/IntegerFilter.class.php new file mode 100644 index 00000000000..636050c077c --- /dev/null +++ b/wcfsetup/install/files/lib/system/view/filter/IntegerFilter.class.php @@ -0,0 +1,38 @@ + + * @since 6.2 + */ +class IntegerFilter extends NumericFilter +{ + public function __construct( + string $id, + string $languageItem, + string $databaseColumn = '', + protected readonly ?int $minimum = null, + protected readonly ?int $maximum = null, + ) { + parent::__construct($id, $languageItem, $databaseColumn); + } + + #[\Override] + public function getFormField(): AbstractFormField + { + return NumericRangeFormField::create($this->id) + ->label($this->languageItem) + ->nullable() + ->integerValues() + ->minimum($this->minimum) + ->maximum($this->maximum); + } +} diff --git a/wcfsetup/install/files/lib/system/gridView/filter/IpAddressFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/IpAddressFilter.class.php similarity index 74% rename from wcfsetup/install/files/lib/system/gridView/filter/IpAddressFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/IpAddressFilter.class.php index b459ca3f15b..1d3d5389146 100644 --- a/wcfsetup/install/files/lib/system/gridView/filter/IpAddressFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/IpAddressFilter.class.php @@ -1,6 +1,6 @@ * @since 6.2 */ class IpAddressFilter extends AbstractFilter { #[\Override] - public function getFormField(string $id, string $label): AbstractFormField + public function getFormField(): AbstractFormField { - return TextFormField::create($id) - ->label($label); + return TextFormField::create($this->id) + ->label($this->languageItem); } #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { - $columnName = $this->getDatabaseColumnName($list, $id); + $columnName = $this->getDatabaseColumnName($list); $list->getConditionBuilder()->add( "{$columnName} LIKE ?", diff --git a/wcfsetup/install/files/lib/system/view/filter/NumericFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/NumericFilter.class.php index 3775a64c4ff..ce5c17c0678 100644 --- a/wcfsetup/install/files/lib/system/view/filter/NumericFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/NumericFilter.class.php @@ -3,8 +3,6 @@ namespace wcf\system\view\filter; use wcf\data\DatabaseObjectList; -use wcf\system\form\builder\field\AbstractFormField; -use wcf\system\form\builder\field\NumericRangeFormField; use wcf\system\view\filter\exception\InvalidFilterValue; /** @@ -15,30 +13,8 @@ * @license GNU Lesser General Public License * @since 6.2 */ -class NumericFilter extends AbstractFilter +abstract class NumericFilter extends AbstractFilter { - public function __construct( - string $id, - string $languageItem, - string $databaseColumn = '', - protected readonly bool $integerValues = false, - protected readonly null|int|float $minimum = null, - protected readonly null|int|float $maximum = null, - ) { - parent::__construct($id, $languageItem, $databaseColumn); - } - - #[\Override] - public function getFormField(): AbstractFormField - { - return NumericRangeFormField::create($this->id) - ->label($this->languageItem) - ->nullable() - ->integerValues($this->integerValues) - ->minimum($this->minimum) - ->maximum($this->maximum); - } - #[\Override] public function applyFilter(DatabaseObjectList $list, string $value): void { diff --git a/wcfsetup/install/files/lib/system/gridView/filter/ObjectIdFilter.class.php b/wcfsetup/install/files/lib/system/view/filter/ObjectIdFilter.class.php similarity index 67% rename from wcfsetup/install/files/lib/system/gridView/filter/ObjectIdFilter.class.php rename to wcfsetup/install/files/lib/system/view/filter/ObjectIdFilter.class.php index d23bd920266..9cf8bf19ff5 100644 --- a/wcfsetup/install/files/lib/system/gridView/filter/ObjectIdFilter.class.php +++ b/wcfsetup/install/files/lib/system/view/filter/ObjectIdFilter.class.php @@ -1,6 +1,6 @@ * @since 6.2 */ class ObjectIdFilter extends AbstractFilter { #[\Override] - public function getFormField(string $id, string $label): AbstractFormField + public function getFormField(): AbstractFormField { - return IntegerFormField::create($id) - ->label($label) + return IntegerFormField::create($this->id) + ->label($this->languageItem) ->minimum(1) ->nullable(); } #[\Override] - public function applyFilter(DatabaseObjectList $list, string $id, string $value): void + public function applyFilter(DatabaseObjectList $list, string $value): void { - $columnName = $this->getDatabaseColumnName($list, $id); + $columnName = $this->getDatabaseColumnName($list); $list->getConditionBuilder()->add("{$columnName} = ?", [$value]); } From 0e8b12da70236c72056dd1cc13e06bb66c5c9a32 Mon Sep 17 00:00:00 2001 From: Marcel Werk Date: Tue, 23 Sep 2025 15:40:43 +0200 Subject: [PATCH 3/7] Unify object id filtering --- .../files/lib/system/gridView/admin/AdGridView.class.php | 2 -- .../gridView/admin/BBCodeMediaProviderGridView.class.php | 2 -- .../lib/system/gridView/admin/ContactOptionGridView.class.php | 2 -- .../system/gridView/admin/ContactRecipientGridView.class.php | 2 -- .../files/lib/system/gridView/admin/LabelGridView.class.php | 2 -- .../lib/system/gridView/admin/LanguageGridView.class.php | 2 -- .../files/lib/system/gridView/admin/MenuGridView.class.php | 2 -- .../files/lib/system/gridView/admin/PackageGridView.class.php | 4 +++- .../gridView/admin/PackageUpdateServerGridView.class.php | 2 -- .../system/gridView/admin/PaidSubscriptionGridView.class.php | 2 -- .../gridView/admin/PaidSubscriptionUserGridView.class.php | 2 -- .../lib/system/gridView/admin/ReactionTypeGridView.class.php | 2 -- .../files/lib/system/gridView/admin/TagGridView.class.php | 4 +++- .../files/lib/system/gridView/admin/TrophyGridView.class.php | 2 -- 14 files changed, 6 insertions(+), 26 deletions(-) diff --git a/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php index 7dda0eb1567..7a5cfbf24ce 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/AdGridView.class.php @@ -18,7 +18,6 @@ use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\TextFilter; use wcf\system\WCF; @@ -40,7 +39,6 @@ public function __construct() GridViewColumn::for('adID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('adName') ->label('wcf.global.name') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php index 9aaa37296dd..b5617f89b52 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/BBCodeMediaProviderGridView.class.php @@ -15,7 +15,6 @@ use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; use wcf\system\interaction\ToggleInteraction; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\TextFilter; use wcf\system\WCF; @@ -37,7 +36,6 @@ public function __construct() GridViewColumn::for('providerID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('title') ->label('wcf.acp.bbcode.mediaProvider.title') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php index 94cf4ec5817..32d00adfa82 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ContactOptionGridView.class.php @@ -19,7 +19,6 @@ use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; @@ -41,7 +40,6 @@ public function __construct() GridViewColumn::for("optionID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("optionTitle") ->label("wcf.global.name") diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php index 932389a5219..0258959ac33 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ContactRecipientGridView.class.php @@ -19,7 +19,6 @@ use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -40,7 +39,6 @@ public function __construct() GridViewColumn::for("recipientID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("name") ->label("wcf.global.name") diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php index d833c1e990b..69053e4d0eb 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LabelGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\interaction\EditInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -44,7 +43,6 @@ public function __construct() GridViewColumn::for("labelID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("label") ->label("wcf.acp.label.label") diff --git a/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php index 88c8e7af1bd..f146d50f1a3 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/LanguageGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\interaction\ToggleInteraction; use wcf\system\request\LinkHandler; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\TextFilter; use wcf\system\WCF; use wcf\util\StringUtil; @@ -43,7 +42,6 @@ public function __construct() $this->addColumns([ GridViewColumn::for('languageID') ->label('wcf.global.objectID') - ->filter(ObjectIdFilter::class) ->renderer(new ObjectIdColumnRenderer()) ->sortable(), GridViewColumn::for('languageName') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php index 26197c52ef0..fb3a4dc961b 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/MenuGridView.class.php @@ -20,7 +20,6 @@ use wcf\system\interaction\EditInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; @@ -42,7 +41,6 @@ public function __construct() GridViewColumn::for("menuID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("title") ->label("wcf.global.name") diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php index b901c9b7db7..7e07d65a4a2 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PackageGridView.class.php @@ -20,6 +20,7 @@ use wcf\system\interaction\EditInteraction; use wcf\system\style\FontAwesomeIcon; use wcf\system\view\filter\I18nTextFilter; +use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\TextFilter; use wcf\system\view\filter\TimeFilter; use wcf\system\WCF; @@ -43,7 +44,8 @@ public function __construct() GridViewColumn::for('packageID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->sortable(), + ->sortable() + ->filter(ObjectIdFilter::class), GridViewColumn::for('packageName') ->label('wcf.acp.package.name') ->titleColumn() diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php index 762d32c4c09..2ae22560a34 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PackageUpdateServerGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\interaction\IInteraction; use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\view\filter\TextFilter; use wcf\system\view\filter\TimeFilter; @@ -46,7 +45,6 @@ public function __construct() GridViewColumn::for('packageUpdateServerID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('serverURL') ->label('wcf.acp.updateServer.serverURL') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php index 4ee9d26976d..f1e3b35b959 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\view\filter\FloatFilter; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\WCF; @@ -43,7 +42,6 @@ public function __construct() GridViewColumn::for('subscriptionID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for('title') ->label('wcf.global.title') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php index 2f9c5f0239b..9b8fa6cdd52 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/PaidSubscriptionUserGridView.class.php @@ -18,7 +18,6 @@ use wcf\system\interaction\admin\PaidSubscriptionUserInteractions; use wcf\system\interaction\Divider; use wcf\system\interaction\EditInteraction; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\view\filter\TimeFilter; use wcf\system\view\filter\UserFilter; @@ -42,7 +41,6 @@ public function __construct() GridViewColumn::for('subscriptionUserID') ->label('wcf.global.objectID') ->sortable() - ->filter(ObjectIdFilter::class) ->renderer(new ObjectIdColumnRenderer()), GridViewColumn::for('userID') ->label('wcf.user.username') diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php index bf515b32d09..faa9ce4d034 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ReactionTypeGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -42,7 +41,6 @@ public function __construct() GridViewColumn::for("reactionTypeID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("image") ->label("wcf.acp.reactionType.image") diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php index 23351337377..6a6507aef8e 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TagGridView.class.php @@ -19,6 +19,7 @@ use wcf\system\interaction\EditInteraction; use wcf\system\language\LanguageFactory; use wcf\system\view\filter\IntegerFilter; +use wcf\system\view\filter\ObjectIdFilter; use wcf\system\view\filter\SelectFilter; use wcf\system\view\filter\TextFilter; use wcf\system\WCF; @@ -42,7 +43,8 @@ public function __construct() GridViewColumn::for('tagID') ->label('wcf.global.objectID') ->renderer(new ObjectIdColumnRenderer()) - ->sortable(), + ->sortable() + ->filter(ObjectIdFilter::class), GridViewColumn::for('name') ->label('wcf.acp.tag.name') ->titleColumn() diff --git a/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php index 3b346ecd874..92ed6dea1a7 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/TrophyGridView.class.php @@ -21,7 +21,6 @@ use wcf\system\interaction\ToggleInteraction; use wcf\system\view\filter\I18nTextFilter; use wcf\system\view\filter\IntegerFilter; -use wcf\system\view\filter\ObjectIdFilter; use wcf\system\WCF; /** @@ -42,7 +41,6 @@ public function __construct() GridViewColumn::for("trophyID") ->label("wcf.global.objectID") ->renderer(new ObjectIdColumnRenderer()) - ->filter(ObjectIdFilter::class) ->sortable(), GridViewColumn::for("image") ->label("wcf.acp.trophy") From aa21c9108d8503e7837580abe8ec77c9ca460f6b Mon Sep 17 00:00:00 2001 From: Marcel Werk Date: Tue, 23 Sep 2025 15:50:22 +0200 Subject: [PATCH 4/7] Hide unsupported types from global modification log --- .../admin/ModificationLogGridView.class.php | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php b/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php index 41b500ad037..ee8aea0be5c 100644 --- a/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php +++ b/wcfsetup/install/files/lib/system/gridView/admin/ModificationLogGridView.class.php @@ -167,7 +167,30 @@ public function isAccessible(): bool #[\Override] protected function createObjectList(): ModificationLogList { - return new ModificationLogList(); + $list = new ModificationLogList(); + + $availableObjectTypeIDs = []; + foreach (ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.modifiableContent') as $objectType) { + $processor = $objectType->getProcessor(); + if ($processor === null) { + continue; + } + \assert($processor instanceof IExtendedModificationLogHandler); + + if (!$processor->includeInLogList()) { + continue; + } + + $availableObjectTypeIDs[] = $objectType->objectTypeID; + } + + if ($availableObjectTypeIDs !== []) { + $list->getConditionBuilder()->add('objectTypeID IN (?)', [$availableObjectTypeIDs]); + } else { + $list->getConditionBuilder()->add('1 = 0'); + } + + return $list; } /** From 1118efa4cc04ffdee37bbcbd929eb80864536083 Mon Sep 17 00:00:00 2001 From: Marcel Werk Date: Tue, 23 Sep 2025 16:29:45 +0200 Subject: [PATCH 5/7] Remove item count badges The number was asynchronous with the list of rows actually displayed in the grid view. --- com.woltlab.wcf/templates/moderationList.tpl | 3 +-- wcfsetup/install/files/acp/templates/acpSessionLogList.tpl | 2 +- wcfsetup/install/files/acp/templates/adList.tpl | 2 +- wcfsetup/install/files/acp/templates/articleList.tpl | 2 +- wcfsetup/install/files/acp/templates/bbcodeList.tpl | 2 +- .../install/files/acp/templates/bbcodeMediaProviderList.tpl | 2 +- wcfsetup/install/files/acp/templates/cronjobLogList.tpl | 2 +- wcfsetup/install/files/acp/templates/emailLogList.tpl | 2 +- wcfsetup/install/files/acp/templates/labelGroupList.tpl | 2 +- wcfsetup/install/files/acp/templates/labelList.tpl | 2 +- wcfsetup/install/files/acp/templates/languageItemList.tpl | 2 +- wcfsetup/install/files/acp/templates/languageList.tpl | 2 +- wcfsetup/install/files/acp/templates/menuList.tpl | 2 +- wcfsetup/install/files/acp/templates/modificationLogList.tpl | 2 +- wcfsetup/install/files/acp/templates/noticeList.tpl | 2 +- wcfsetup/install/files/acp/templates/packageList.tpl | 2 +- .../install/files/acp/templates/packageUpdateServerList.tpl | 2 +- wcfsetup/install/files/acp/templates/pageList.tpl | 2 +- wcfsetup/install/files/acp/templates/paidSubscriptionList.tpl | 2 +- .../files/acp/templates/paidSubscriptionTransactionLogList.tpl | 2 +- .../install/files/acp/templates/paidSubscriptionUserList.tpl | 2 +- wcfsetup/install/files/acp/templates/reactionTypeList.tpl | 2 +- wcfsetup/install/files/acp/templates/smileyList.tpl | 2 +- wcfsetup/install/files/acp/templates/styleList.tpl | 2 +- wcfsetup/install/files/acp/templates/tagList.tpl | 2 +- wcfsetup/install/files/acp/templates/templateGroupList.tpl | 2 +- wcfsetup/install/files/acp/templates/templateList.tpl | 2 +- wcfsetup/install/files/acp/templates/trophyList.tpl | 2 +- .../files/acp/templates/userAuthenticationFailureList.tpl | 2 +- .../install/files/acp/templates/userGroupAssignmentList.tpl | 2 +- wcfsetup/install/files/acp/templates/userGroupList.tpl | 2 +- wcfsetup/install/files/acp/templates/userOptionList.tpl | 2 +- wcfsetup/install/files/acp/templates/userRankList.tpl | 2 +- wcfsetup/install/files/acp/templates/userTrophyList.tpl | 2 +- .../lib/system/attachment/IAttachmentObjectType.class.php | 3 +-- 35 files changed, 35 insertions(+), 37 deletions(-) diff --git a/com.woltlab.wcf/templates/moderationList.tpl b/com.woltlab.wcf/templates/moderationList.tpl index cfbcd2f5ee9..fa00b83dccc 100644 --- a/com.woltlab.wcf/templates/moderationList.tpl +++ b/com.woltlab.wcf/templates/moderationList.tpl @@ -1,6 +1,5 @@ {capture assign='pageTitle'}{lang}wcf.moderation.items{/lang}{if $gridView->getPageNo() > 1} - {lang pageNo=$gridView->getPageNo()}wcf.page.pageNo{/lang}{/if}{/capture} - -{capture assign='contentTitle'}{lang}wcf.moderation.items{/lang} {#$gridView->countRows()}{/capture} +{capture assign='contentTitle'}{lang}wcf.moderation.items{/lang}{/capture} {capture assign='sidebarRight'} {event name='sidebarBoxes'} diff --git a/wcfsetup/install/files/acp/templates/acpSessionLogList.tpl b/wcfsetup/install/files/acp/templates/acpSessionLogList.tpl index 55e003f5dd0..c9db1946566 100644 --- a/wcfsetup/install/files/acp/templates/acpSessionLogList.tpl +++ b/wcfsetup/install/files/acp/templates/acpSessionLogList.tpl @@ -2,7 +2,7 @@
-

{lang}wcf.acp.sessionLog.list{/lang} {#$gridView->countRows()}

+

{lang}wcf.acp.sessionLog.list{/lang}

{hascontent} diff --git a/wcfsetup/install/files/acp/templates/adList.tpl b/wcfsetup/install/files/acp/templates/adList.tpl index 2d1551ac35a..614b6f53018 100644 --- a/wcfsetup/install/files/acp/templates/adList.tpl +++ b/wcfsetup/install/files/acp/templates/adList.tpl @@ -2,7 +2,7 @@
-

{lang}wcf.acp.ad.list{/lang} {#$gridView->countRows()}

+

{lang}wcf.acp.ad.list{/lang}