From 7773e974638f92065b0c9dd5e9835359b53c00fe Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Wed, 12 Nov 2025 08:57:26 +0100 Subject: [PATCH 1/2] Continue with: Disable button when the filter returns no results --- application/controllers/CommentsController.php | 3 ++- .../controllers/DowntimesController.php | 3 ++- application/controllers/HostController.php | 7 +++++-- .../controllers/HostgroupController.php | 7 +++++-- application/controllers/HostsController.php | 2 +- .../controllers/ServicegroupController.php | 7 +++++-- application/controllers/ServicesController.php | 5 +++-- library/Icingadb/Common/SearchControls.php | 18 ++++++++++++++---- 8 files changed, 37 insertions(+), 15 deletions(-) diff --git a/application/controllers/CommentsController.php b/application/controllers/CommentsController.php index b1995f63b..09ad62ff4 100644 --- a/application/controllers/CommentsController.php +++ b/application/controllers/CommentsController.php @@ -83,10 +83,11 @@ public function indexAction() $this->addControl($limitControl); $this->addControl($viewModeSwitcher); $this->addControl($searchBar); - $continueWith = $this->createContinueWith(Links::commentsDetails(), $searchBar); $results = $comments->execute(); + $continueWith = $this->createContinueWith(Links::commentsDetails(), $searchBar, $results->hasResult()); + $this->addContent( (new ObjectList($results)) ->setViewMode($viewModeSwitcher->getViewMode()) diff --git a/application/controllers/DowntimesController.php b/application/controllers/DowntimesController.php index 90a3eddd5..2e39a248b 100644 --- a/application/controllers/DowntimesController.php +++ b/application/controllers/DowntimesController.php @@ -89,10 +89,11 @@ public function indexAction() $this->addControl($limitControl); $this->addControl($viewModeSwitcher); $this->addControl($searchBar); - $continueWith = $this->createContinueWith(Links::downtimesDetails(), $searchBar); $results = $downtimes->execute(); + $continueWith = $this->createContinueWith(Links::downtimesDetails(), $searchBar, $results->hasResult()); + $this->addContent( (new ObjectList($results)) ->setViewMode($viewModeSwitcher->getViewMode()) diff --git a/application/controllers/HostController.php b/application/controllers/HostController.php index ec1ca0cd4..23b88e024 100644 --- a/application/controllers/HostController.php +++ b/application/controllers/HostController.php @@ -286,7 +286,9 @@ public function servicesAction(): Generator yield $this->export($services); - $serviceList = (new ObjectList($services)) + $results = $services->execute(); + + $serviceList = (new ObjectList($results)) ->setViewMode($viewModeSwitcher->getViewMode()) ->setEmptyStateMessage($paginationControl->getEmptyStateMessage()); @@ -297,7 +299,8 @@ public function servicesAction(): Generator $this->addControl($searchBar); $continueWith = $this->createContinueWith( Links::servicesDetails()->setFilter(Filter::equal('host.name', $this->host->name)), - $searchBar + $searchBar, + $results->hasResult() ); $this->addContent($serviceList); diff --git a/application/controllers/HostgroupController.php b/application/controllers/HostgroupController.php index 3967acc51..5d08c23d6 100644 --- a/application/controllers/HostgroupController.php +++ b/application/controllers/HostgroupController.php @@ -102,7 +102,9 @@ public function indexAction(): Generator yield $this->export($hosts); - $hostList = (new ObjectList($hosts)) + $results = $hosts->execute(); + + $hostList = (new ObjectList($results)) ->setViewMode($viewModeSwitcher->getViewMode()) ->setEmptyStateMessage($paginationControl->getEmptyStateMessage()); @@ -122,7 +124,8 @@ public function indexAction(): Generator $continueWith = $this->createContinueWith( Links::hostsDetails() ->setFilter(Filter::equal('hostgroup.name', $hostgroup->name)), - $searchBar + $searchBar, + $results->hasResult() ); $this->addContent($hostList); diff --git a/application/controllers/HostsController.php b/application/controllers/HostsController.php index 3dbe2688a..512e88349 100644 --- a/application/controllers/HostsController.php +++ b/application/controllers/HostsController.php @@ -97,10 +97,10 @@ public function indexAction() $this->addControl($limitControl); $this->addControl($viewModeSwitcher); $this->addControl($searchBar); - $continueWith = $this->createContinueWith(Links::hostsDetails(), $searchBar); $results = $hosts->execute(); + $continueWith = $this->createContinueWith(Links::hostsDetails(), $searchBar, $results->hasResult()); if ($viewModeSwitcher->getViewMode() === 'tabular') { $hostList = (new HostItemTable($results, HostItemTable::applyColumnMetaData($hosts, $columns))) ->setSort($sortControl->getSort()); diff --git a/application/controllers/ServicegroupController.php b/application/controllers/ServicegroupController.php index da887f890..e84d78eac 100644 --- a/application/controllers/ServicegroupController.php +++ b/application/controllers/ServicegroupController.php @@ -109,7 +109,9 @@ public function indexAction(): Generator yield $this->export($services); - $serviceList = (new ObjectList($services)) + $results = $services->execute(); + + $serviceList = (new ObjectList($results)) ->setViewMode($viewModeSwitcher->getViewMode()) ->setEmptyStateMessage($paginationControl->getEmptyStateMessage()); @@ -129,7 +131,8 @@ public function indexAction(): Generator $continueWith = $this->createContinueWith( Links::servicesDetails() ->setFilter(Filter::equal('servicegroup.name', $servicegroup->name)), - $searchBar + $searchBar, + $results->hasResult() ); $this->addContent($serviceList); diff --git a/application/controllers/ServicesController.php b/application/controllers/ServicesController.php index 743e7e712..15f3b668b 100644 --- a/application/controllers/ServicesController.php +++ b/application/controllers/ServicesController.php @@ -108,10 +108,11 @@ public function indexAction() $this->addControl($limitControl); $this->addControl($viewModeSwitcher); $this->addControl($searchBar); - $continueWith = $this->createContinueWith(Links::servicesDetails(), $searchBar); $results = $services->execute(); + $continueWith = $this->createContinueWith(Links::servicesDetails(), $searchBar, $results->hasResult()); + if ($viewModeSwitcher->getViewMode() === 'tabular') { $serviceList = (new ServiceItemTable($results, ServiceItemTable::applyColumnMetaData($services, $columns))) ->setSort($sortControl->getSort()); @@ -279,7 +280,6 @@ public function gridAction() $this->addControl($problemToggle); $this->addControl($sortControl); $this->addControl($searchBar); - $continueWith = $this->createContinueWith(Links::servicesDetails(), $searchBar); $pivotFilter = $problemToggle->isChecked() ? Filter::equal('service.state.is_problem', 'y') : null; @@ -316,6 +316,7 @@ public function gridAction() $this->view->pivotData = $pivotData; $this->view->pivotHeader = $pivotHeader; + $continueWith = $this->createContinueWith(Links::servicesDetails(), $searchBar, ! empty($pivotData)); /** Preserve filter and params in view links (the `BaseFilter` implementation for view scripts -.-) */ $this->view->baseUrl = Url::fromRequest() ->onlyWith([ diff --git a/library/Icingadb/Common/SearchControls.php b/library/Icingadb/Common/SearchControls.php index 7927da0a0..699a497d6 100644 --- a/library/Icingadb/Common/SearchControls.php +++ b/library/Icingadb/Common/SearchControls.php @@ -51,14 +51,24 @@ public function createSearchBar(Query $query, ...$params): SearchBar * * @param Url $detailsUrl * @param SearchBar $searchBar + * @param bool $hasResults Whether the current query has results * * @return ContinueWith */ - public function createContinueWith(Url $detailsUrl, SearchBar $searchBar): ContinueWith + public function createContinueWith(Url $detailsUrl, SearchBar $searchBar, bool $hasResults): ContinueWith { - $continueWith = new ContinueWith($detailsUrl, [$searchBar, 'getFilter']); - $continueWith->setTitle(t('Show bulk processing actions for all filtered results')); - $continueWith->setBaseTarget('_next'); + if ($hasResults) { + $continueWith = ContinueWith::create( + $detailsUrl, + [$searchBar, 'getFilter'], + t('Show bulk processing actions for all filtered results'), + t('A filter is required to show bulk processing actions'), + ); + $continueWith->setBaseTarget('_next'); + } else { + $continueWith = ContinueWith::createDisabled(t('No items found')); + } + $continueWith->getAttributes() ->set('id', $this->getRequest()->protectId('continue-with')); From 1dadaa234dfc6bf8e2ab6c91face94372aa76c5b Mon Sep 17 00:00:00 2001 From: Sukhwinder Dhillon Date: Wed, 21 Jan 2026 09:49:51 +0100 Subject: [PATCH 2/2] `SearchControls::createContinueWith()`: Set the default param value for BC --- library/Icingadb/Common/SearchControls.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Icingadb/Common/SearchControls.php b/library/Icingadb/Common/SearchControls.php index 699a497d6..4fe700a76 100644 --- a/library/Icingadb/Common/SearchControls.php +++ b/library/Icingadb/Common/SearchControls.php @@ -55,7 +55,7 @@ public function createSearchBar(Query $query, ...$params): SearchBar * * @return ContinueWith */ - public function createContinueWith(Url $detailsUrl, SearchBar $searchBar, bool $hasResults): ContinueWith + public function createContinueWith(Url $detailsUrl, SearchBar $searchBar, bool $hasResults = true): ContinueWith { if ($hasResults) { $continueWith = ContinueWith::create(