From 8da16eaaf2834cbd64c6cad7c97baf4feeca5ada Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 19 Jul 2024 10:40:06 +0200 Subject: [PATCH 1/5] css: Ensure compatibility with ipl v0.14.2 --- module.info | 2 +- public/css/common.less | 4 ++-- public/css/widget/group-grid.less | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module.info b/module.info index b77e7ce9e..e85f00250 100644 --- a/module.info +++ b/module.info @@ -1,6 +1,6 @@ Module: icingadb Version: 1.1.2 Requires: - Libraries: icinga-php-library (>=0.13.2), icinga-php-thirdparty (>=0.12.0) + Libraries: icinga-php-library (>=0.14.1), icinga-php-thirdparty (>=0.12.0) Description: Icinga DB Web UI for Icinga DB – Provides a graphical interface to your Icinga monitoring diff --git a/public/css/common.less b/public/css/common.less index 4cf5cfcd9..333df94b8 100644 --- a/public/css/common.less +++ b/public/css/common.less @@ -337,7 +337,7 @@ div.show-more { .servicegroup-table, .usergroup-table, .user-table { - .title .content > * { + .title .column-content > * { display: block; max-width: fit-content; } @@ -351,7 +351,7 @@ div.show-more { .controls .servicegroup-table-row, .controls .usergroup-table-row, .controls .user-table-row { - .title .content { + .title .column-content { display: inline-flex; align-items: center; diff --git a/public/css/widget/group-grid.less b/public/css/widget/group-grid.less index 94b5b131e..22dce9390 100644 --- a/public/css/widget/group-grid.less +++ b/public/css/widget/group-grid.less @@ -19,7 +19,7 @@ ul.item-table.group-grid { margin-right: 1em; } - .content { + .column-content { line-height: 1; a { From a4a30c1a01ff9378c8c50477904df236ad5b6bc3 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 19 Jul 2024 10:41:46 +0200 Subject: [PATCH 2/5] ObjectSuggestions: Support more base filters than restrictions --- .../Control/SearchBar/ObjectSuggestions.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php b/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php index 31b6483cd..7630e0162 100644 --- a/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php +++ b/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php @@ -16,6 +16,7 @@ use ipl\Orm\Exception\InvalidColumnException; use ipl\Orm\Exception\InvalidRelationException; use ipl\Orm\Model; +use ipl\Orm\Query; use ipl\Orm\Relation; use ipl\Orm\Relation\BelongsToMany; use ipl\Orm\Relation\HasOne; @@ -23,6 +24,7 @@ use ipl\Orm\UnionModel; use ipl\Sql\Expression; use ipl\Sql\Select; +use ipl\Stdlib\BaseFilter; use ipl\Stdlib\Filter; use ipl\Stdlib\Seq; use ipl\Web\Control\SearchBar\SearchException; @@ -32,6 +34,7 @@ class ObjectSuggestions extends Suggestions { use Auth; + use BaseFilter; use Database; /** @var Model */ @@ -114,6 +117,15 @@ protected function shouldShowRelationFor(string $column): bool } } + private function applyBaseFilter(Query $query): void + { + $this->applyRestrictions($query); + + if ($this->hasBaseFilter()) { + $query->filter($this->getBaseFilter()); + } + } + protected function createQuickSearchFilter($searchTerm) { $model = $this->getModel(); @@ -194,7 +206,7 @@ protected function fetchValueSuggestions($column, $searchTerm, Filter\Chain $sea } $query->filter($searchFilter); - $this->applyRestrictions($query); + $this->applyBaseFilter($query); try { return (new ObjectSuggestionsCursor($query->getDb(), $query->assembleSelect()->distinct())) @@ -279,7 +291,7 @@ protected function queryCustomvarConfig(string $searchTerm): Select $resolver->qualifyPath($name, $tableName) ); - $this->applyRestrictions($query); + $this->applyBaseFilter($query); $aggregates[$name] = new Expression("MAX($name)"); $scalarQueries[$name] = $query->assembleSelect() @@ -289,7 +301,7 @@ protected function queryCustomvarConfig(string $searchTerm): Select } $customVars->columns('flatname'); - $this->applyRestrictions($customVars); + $this->applyBaseFilter($customVars); $customVars->filter(Filter::like('flatname', $searchTerm)); $idColumn = $resolver->qualifyColumn('id', $resolver->getAlias($customVars->getModel())); $customVars = $customVars->assembleSelect(); From 648a544bd9fe59ee2f092dd3ec51d356af551762 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 19 Jul 2024 10:48:40 +0200 Subject: [PATCH 3/5] hostgroups: Preserve filters in details --- .../controllers/HostgroupController.php | 116 +++++++++++++++--- .../Widget/ItemTable/BaseHostGroupItem.php | 21 ++-- 2 files changed, 112 insertions(+), 25 deletions(-) diff --git a/application/controllers/HostgroupController.php b/application/controllers/HostgroupController.php index 14fd0c184..e48adca20 100644 --- a/application/controllers/HostgroupController.php +++ b/application/controllers/HostgroupController.php @@ -4,79 +4,159 @@ namespace Icinga\Module\Icingadb\Controllers; -use Icinga\Exception\NotFoundError; +use Generator; +use Icinga\Module\Icingadb\Common\Links; use Icinga\Module\Icingadb\Model\Host; use Icinga\Module\Icingadb\Model\Hostgroupsummary; use Icinga\Module\Icingadb\Redis\VolatileStateResults; +use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; +use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher; use Icinga\Module\Icingadb\Web\Controller; use Icinga\Module\Icingadb\Widget\ItemList\HostList; use Icinga\Module\Icingadb\Widget\ItemTable\HostgroupTableRow; use ipl\Html\Html; use ipl\Stdlib\Filter; +use ipl\Web\Control\LimitControl; +use ipl\Web\Control\SortControl; +use ipl\Web\Url; class HostgroupController extends Controller { - /** @var Hostgroupsummary The host group object */ - protected $hostgroup; + /** @var string */ + protected $hostgroupName; public function init() { $this->assertRouteAccess('hostgroups'); + $this->hostgroupName = $this->params->shiftRequired('name'); + } - $this->addTitleTab(t('Host Group')); - - $name = $this->params->getRequired('name'); - + /** + * Fetch the host group object + * + * @return Hostgroupsummary + */ + protected function fetchHostgroup(): Hostgroupsummary + { $query = Hostgroupsummary::on($this->getDb()); foreach ($query->getUnions() as $unionPart) { - $unionPart->filter(Filter::equal('hostgroup.name', $name)); + $unionPart->filter(Filter::equal('hostgroup.name', $this->hostgroupName)); } $this->applyRestrictions($query); + /** @var Hostgroupsummary $hostgroup */ $hostgroup = $query->first(); if ($hostgroup === null) { - throw new NotFoundError(t('Host group not found')); + $this->httpNotFound(t('Host group not found')); } - $this->hostgroup = $hostgroup; - $this->setTitle($hostgroup->display_name); + return $hostgroup; } - public function indexAction() + public function indexAction(): Generator { $db = $this->getDb(); + $hostgroup = $this->fetchHostgroup(); $hosts = Host::on($db)->with(['state', 'state.last_comment', 'icon_image']); $hosts ->setResultSetClass(VolatileStateResults::class) - ->filter(Filter::equal('hostgroup.id', $this->hostgroup->id)); + ->filter(Filter::equal('hostgroup.id', $hostgroup->id)); $this->applyRestrictions($hosts); $limitControl = $this->createLimitControl(); $paginationControl = $this->createPaginationControl($hosts); + $sortControl = $this->createSortControl( + $hosts, + [ + 'host.display_name' => t('Name'), + 'host.state.severity desc,host.state.last_state_change desc' => t('Severity'), + 'host.state.soft_state' => t('Current State'), + 'host.state.last_state_change desc' => t('Last State Change') + ] + ); $viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl); - $hostList = (new HostList($hosts->execute())) - ->setViewMode($viewModeSwitcher->getViewMode()); + $searchBar = $this->createSearchBar($hosts, [ + $limitControl->getLimitParam(), + $sortControl->getSortParam(), + $viewModeSwitcher->getViewModeParam(), + 'name' + ])->setSuggestionUrl(Url::fromPath( + 'icingadb/hostgroup/complete', + [ + 'name' => $this->hostgroupName, + '_disableLayout' => true, + 'showCompact' => true + ] + )); + + if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { + if ($searchBar->hasBeenSubmitted()) { + $filter = $this->getFilter(); + } else { + $this->addControl($searchBar); + $this->sendMultipartUpdate(); + return; + } + } else { + $filter = $searchBar->getFilter(); + } + + $hosts->filter($filter); yield $this->export($hosts); + $hostList = (new HostList($hosts->execute())) + ->setViewMode($viewModeSwitcher->getViewMode()); + // ICINGAWEB_EXPORT_FORMAT is not set yet and $this->format is inaccessible, yeah... if ($this->getRequest()->getParam('format') === 'pdf') { - $this->addContent(new HostgroupTableRow($this->hostgroup)); + $this->addContent(new HostgroupTableRow($hostgroup)); $this->addContent(Html::tag('h2', null, t('Hosts'))); } else { - $this->addControl(new HostgroupTableRow($this->hostgroup)); + $this->addControl(new HostgroupTableRow($hostgroup)); } $this->addControl($paginationControl); - $this->addControl($viewModeSwitcher); + $this->addControl($sortControl); $this->addControl($limitControl); + $this->addControl($viewModeSwitcher); + $this->addControl($searchBar); + $continueWith = $this->createContinueWith(Links::hostsDetails(), $searchBar); $this->addContent($hostList); + if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { + $this->sendMultipartUpdate($continueWith); + } + + $this->addTitleTab(t('Host Group')); + $this->setTitle($hostgroup->display_name); $this->setAutorefreshInterval(10); } + + public function completeAction(): void + { + $suggestions = new ObjectSuggestions(); + $suggestions->setModel(Host::class); + $suggestions->setBaseFilter(Filter::equal('hostgroup.name', $this->hostgroupName)); + $suggestions->forRequest($this->getServerRequest()); + $this->getDocument()->add($suggestions); + } + + public function searchEditorAction(): void + { + $editor = $this->createSearchEditor(Host::on($this->getDb()), [ + LimitControl::DEFAULT_LIMIT_PARAM, + SortControl::DEFAULT_SORT_PARAM, + ViewModeSwitcher::DEFAULT_VIEW_MODE_PARAM, + 'name' + ]); + + $this->getDocument()->add($editor); + $this->setTitle(t('Adjust Filter')); + } } diff --git a/library/Icingadb/Widget/ItemTable/BaseHostGroupItem.php b/library/Icingadb/Widget/ItemTable/BaseHostGroupItem.php index b3099c802..aa581eed3 100644 --- a/library/Icingadb/Widget/ItemTable/BaseHostGroupItem.php +++ b/library/Icingadb/Widget/ItemTable/BaseHostGroupItem.php @@ -34,8 +34,8 @@ protected function init(): void protected function createSubject(): BaseHtmlElement { - return isset($this->table) - ? new Link( + if (isset($this->table)) { + $link = new Link( $this->item->display_name, Links::hostgroup($this->item), [ @@ -45,12 +45,19 @@ protected function createSubject(): BaseHtmlElement $this->item->display_name ) ] - ) - : new HtmlElement( - 'span', - Attributes::create(['class' => 'subject']), - Text::create($this->item->display_name) ); + if ($this->table->hasBaseFilter()) { + $link->getUrl()->setFilter($this->table->getBaseFilter()); + } + + return $link; + } + + return new HtmlElement( + 'span', + Attributes::create(['class' => 'subject']), + Text::create($this->item->display_name) + ); } protected function createCaption(): BaseHtmlElement From 32ab5e561d5da10bc757616a78352c9517d0f5ca Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 19 Jul 2024 11:03:00 +0200 Subject: [PATCH 4/5] servicegroups: Preserve filters in details --- .../controllers/ServicegroupController.php | 117 +++++++++++++++--- .../Widget/ItemTable/BaseServiceGroupItem.php | 21 ++-- 2 files changed, 113 insertions(+), 25 deletions(-) diff --git a/application/controllers/ServicegroupController.php b/application/controllers/ServicegroupController.php index d6ebc1943..c3dea15bc 100644 --- a/application/controllers/ServicegroupController.php +++ b/application/controllers/ServicegroupController.php @@ -4,49 +4,61 @@ namespace Icinga\Module\Icingadb\Controllers; -use Icinga\Exception\NotFoundError; +use Generator; +use Icinga\Module\Icingadb\Common\Links; use Icinga\Module\Icingadb\Model\Service; use Icinga\Module\Icingadb\Model\ServicegroupSummary; use Icinga\Module\Icingadb\Redis\VolatileStateResults; +use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; +use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher; use Icinga\Module\Icingadb\Web\Controller; use Icinga\Module\Icingadb\Widget\ItemList\ServiceList; use Icinga\Module\Icingadb\Widget\ItemTable\ServicegroupTableRow; use ipl\Html\Html; use ipl\Stdlib\Filter; +use ipl\Web\Control\LimitControl; +use ipl\Web\Control\SortControl; +use ipl\Web\Url; class ServicegroupController extends Controller { - /** @var ServicegroupSummary The service group object */ - protected $servicegroup; + /** @var string */ + protected $servicegroupName; public function init() { $this->assertRouteAccess('servicegroups'); + $this->servicegroupName = $this->params->shiftRequired('name'); + } - $this->addTitleTab(t('Service Group')); - - $name = $this->params->getRequired('name'); - + /** + * Fetch the service group object + * + * @return ServicegroupSummary + */ + protected function fetchServicegroup(): ServicegroupSummary + { $query = ServicegroupSummary::on($this->getDb()); foreach ($query->getUnions() as $unionPart) { - $unionPart->filter(Filter::equal('servicegroup.name', $name)); + $unionPart->filter(Filter::equal('servicegroup.name', $this->servicegroupName)); } $this->applyRestrictions($query); + /** @var ServicegroupSummary $servicegroup */ $servicegroup = $query->first(); if ($servicegroup === null) { - throw new NotFoundError(t('Service group not found')); + $this->httpNotFound(t('Service group not found')); } - $this->servicegroup = $servicegroup; - $this->setTitle($servicegroup->display_name); + return $servicegroup; } - public function indexAction() + public function indexAction(): Generator { $db = $this->getDb(); + $servicegroup = $this->fetchServicegroup(); $services = Service::on($db)->with([ 'state', @@ -57,33 +69,102 @@ public function indexAction() ]); $services ->setResultSetClass(VolatileStateResults::class) - ->filter(Filter::equal('servicegroup.id', $this->servicegroup->id)); + ->filter(Filter::equal('servicegroup.id', $servicegroup->id)); $this->applyRestrictions($services); $limitControl = $this->createLimitControl(); $paginationControl = $this->createPaginationControl($services); + $sortControl = $this->createSortControl( + $services, + [ + 'service.display_name' => t('Name'), + 'service.state.severity desc,service.state.last_state_change desc' => t('Severity'), + 'service.state.soft_state' => t('Current State'), + 'service.state.last_state_change desc' => t('Last State Change'), + 'host.display_name' => t('Host') + ] + ); $viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl); - $serviceList = (new ServiceList($services->execute())) - ->setViewMode($viewModeSwitcher->getViewMode()); + $searchBar = $this->createSearchBar($services, [ + $limitControl->getLimitParam(), + $sortControl->getSortParam(), + $viewModeSwitcher->getViewModeParam(), + 'name' + ])->setSuggestionUrl(Url::fromPath( + 'icingadb/servicegroup/complete', + [ + 'name' => $this->servicegroupName, + '_disableLayout' => true, + 'showCompact' => true + ] + )); + + if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { + if ($searchBar->hasBeenSubmitted()) { + $filter = $this->getFilter(); + } else { + $this->addControl($searchBar); + $this->sendMultipartUpdate(); + return; + } + } else { + $filter = $searchBar->getFilter(); + } + + $services->filter($filter); yield $this->export($services); + $serviceList = (new ServiceList($services->execute())) + ->setViewMode($viewModeSwitcher->getViewMode()); + // ICINGAWEB_EXPORT_FORMAT is not set yet and $this->format is inaccessible, yeah... if ($this->getRequest()->getParam('format') === 'pdf') { - $this->addContent(new ServicegroupTableRow($this->servicegroup)); + $this->addContent(new ServicegroupTableRow($servicegroup)); $this->addContent(Html::tag('h2', null, t('Services'))); } else { - $this->addControl(new ServicegroupTableRow($this->servicegroup)); + $this->addControl(new ServicegroupTableRow($servicegroup)); } $this->addControl($paginationControl); - $this->addControl($viewModeSwitcher); + $this->addControl($sortControl); $this->addControl($limitControl); + $this->addControl($viewModeSwitcher); + $this->addControl($searchBar); + $continueWith = $this->createContinueWith(Links::servicesDetails(), $searchBar); $this->addContent($serviceList); + if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { + $this->sendMultipartUpdate($continueWith); + } + + $this->addTitleTab(t('Service Group')); + $this->setTitle($servicegroup->display_name); $this->setAutorefreshInterval(10); } + + public function completeAction(): void + { + $suggestions = new ObjectSuggestions(); + $suggestions->setModel(Service::class); + $suggestions->setBaseFilter(Filter::equal('servicegroup.name', $this->servicegroupName)); + $suggestions->forRequest($this->getServerRequest()); + $this->getDocument()->add($suggestions); + } + + public function searchEditorAction(): void + { + $editor = $this->createSearchEditor(Service::on($this->getDb()), [ + LimitControl::DEFAULT_LIMIT_PARAM, + SortControl::DEFAULT_SORT_PARAM, + ViewModeSwitcher::DEFAULT_VIEW_MODE_PARAM, + 'name' + ]); + + $this->getDocument()->add($editor); + $this->setTitle(t('Adjust Filter')); + } } diff --git a/library/Icingadb/Widget/ItemTable/BaseServiceGroupItem.php b/library/Icingadb/Widget/ItemTable/BaseServiceGroupItem.php index 24f0beaae..4719bb9e5 100644 --- a/library/Icingadb/Widget/ItemTable/BaseServiceGroupItem.php +++ b/library/Icingadb/Widget/ItemTable/BaseServiceGroupItem.php @@ -34,8 +34,8 @@ protected function init(): void protected function createSubject(): BaseHtmlElement { - return isset($this->table) - ? new Link( + if (isset($this->table)) { + $link = new Link( $this->item->display_name, Links::servicegroup($this->item), [ @@ -45,12 +45,19 @@ protected function createSubject(): BaseHtmlElement $this->item->display_name ) ] - ) - : new HtmlElement( - 'span', - Attributes::create(['class' => 'subject']), - Text::create($this->item->display_name) ); + if ($this->table->hasBaseFilter()) { + $link->getUrl()->setFilter($this->table->getBaseFilter()); + } + + return $link; + } + + return new HtmlElement( + 'span', + Attributes::create(['class' => 'subject']), + Text::create($this->item->display_name) + ); } protected function createCaption(): BaseHtmlElement From ceb87ead566b92ffa4d2126aee106cac2d217429 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Fri, 19 Jul 2024 14:33:04 +0200 Subject: [PATCH 5/5] phpstan: Update standard baseline --- phpstan-baseline-standard.neon | 43 +++++++--------------------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/phpstan-baseline-standard.neon b/phpstan-baseline-standard.neon index 5d23e8296..c974c5e11 100644 --- a/phpstan-baseline-standard.neon +++ b/phpstan-baseline-standard.neon @@ -171,7 +171,7 @@ parameters: path: application/controllers/ConfigController.php - - message: "#^Parameter \\#1 \\$name of method ipl\\\\Web\\\\Widget\\\\Tabs\\:\\:add\\(\\) expects string, mixed given\\.$#" + message: "#^Parameter \\#1 \\$name of method ipl\\\\Web\\\\Widget\\\\Tabs\\:\\:add\\(\\) expects string, string\\|null given\\.$#" count: 1 path: application/controllers/ConfigController.php @@ -311,7 +311,7 @@ parameters: path: application/controllers/EventController.php - - message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\EventController\\:\\:\\$event \\(Icinga\\\\Module\\\\Icingadb\\\\Model\\\\History\\) does not accept ipl\\\\Orm\\\\Model\\|null\\.$#" + message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\EventController\\:\\:\\$event \\(Icinga\\\\Module\\\\Icingadb\\\\Model\\\\History\\) does not accept ipl\\\\Orm\\\\Model\\.$#" count: 1 path: application/controllers/EventController.php @@ -506,22 +506,7 @@ parameters: path: application/controllers/HostController.php - - message: "#^Method Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\HostgroupController\\:\\:indexAction\\(\\) has no return type specified\\.$#" - count: 1 - path: application/controllers/HostgroupController.php - - - - message: "#^Parameter \\#1 \\$title of method ipl\\\\Web\\\\Compat\\\\CompatController\\:\\:setTitle\\(\\) expects string, mixed given\\.$#" - count: 1 - path: application/controllers/HostgroupController.php - - - - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" - count: 1 - path: application/controllers/HostgroupController.php - - - - message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\HostgroupController\\:\\:\\$hostgroup \\(Icinga\\\\Module\\\\Icingadb\\\\Model\\\\Hostgroupsummary\\) does not accept ipl\\\\Orm\\\\Model\\.$#" + message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\HostgroupController\\:\\:\\$hostgroupName \\(string\\) does not accept mixed\\.$#" count: 1 path: application/controllers/HostgroupController.php @@ -886,22 +871,7 @@ parameters: path: application/controllers/ServiceController.php - - message: "#^Method Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\ServicegroupController\\:\\:indexAction\\(\\) has no return type specified\\.$#" - count: 1 - path: application/controllers/ServicegroupController.php - - - - message: "#^Parameter \\#1 \\$title of method ipl\\\\Web\\\\Compat\\\\CompatController\\:\\:setTitle\\(\\) expects string, mixed given\\.$#" - count: 1 - path: application/controllers/ServicegroupController.php - - - - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" - count: 1 - path: application/controllers/ServicegroupController.php - - - - message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\ServicegroupController\\:\\:\\$servicegroup \\(Icinga\\\\Module\\\\Icingadb\\\\Model\\\\ServicegroupSummary\\) does not accept ipl\\\\Orm\\\\Model\\.$#" + message: "#^Property Icinga\\\\Module\\\\Icingadb\\\\Controllers\\\\ServicegroupController\\:\\:\\$servicegroupName \\(string\\) does not accept mixed\\.$#" count: 1 path: application/controllers/ServicegroupController.php @@ -5130,6 +5100,11 @@ parameters: count: 2 path: library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php + - + message: "#^Parameter \\#1 \\$filter of method ipl\\\\Orm\\\\Query\\:\\:filter\\(\\) expects ipl\\\\Stdlib\\\\Filter\\\\Rule, ipl\\\\Stdlib\\\\Filter\\\\Rule\\|null given\\.$#" + count: 1 + path: library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php + - message: "#^Parameter \\#1 \\$path of method ipl\\\\Orm\\\\Resolver\\:\\:qualifyPath\\(\\) expects string, mixed given\\.$#" count: 2