addTitleTab(t('Hosts')); $compact = $this->view->compact; $db = $this->getDb(); $hosts = Host::on($db)->with(['state', 'icon_image', 'state.last_comment']); $hosts->getWith()['host.state']->setJoinType('INNER'); $hosts->setResultSetClass(VolatileStateResults::class); $this->handleSearchRequest($hosts); $summary = null; if (! $compact) { $summary = HoststateSummary::on($db); } $limitControl = $this->createLimitControl(); $paginationControl = $this->createPaginationControl($hosts); $sortControl = $this->createSortControl( $hosts, [ 'host.display_name' => t('Name'), 'host.state.severity 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); $columns = $this->createColumnControl($hosts, $viewModeSwitcher); $searchBar = $this->createSearchBar($hosts, [ $limitControl->getLimitParam(), $sortControl->getSortParam(), $viewModeSwitcher->getViewModeParam(), 'columns' ]); if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { if ($searchBar->hasBeenSubmitted()) { $filter = $this->getFilter(); } else { $this->addControl($searchBar); $this->sendMultipartUpdate(); return; } } else { $filter = $searchBar->getFilter(); } $hosts->peekAhead($compact); $this->filter($hosts, $filter); if (isset($summary)) { $this->filter($summary, $filter); yield $this->export($hosts, $summary); } else { yield $this->export($hosts); } $this->addControl($paginationControl); $this->addControl($sortControl); $this->addControl($limitControl); $this->addControl($viewModeSwitcher); $this->addControl($searchBar); $continueWith = $this->createContinueWith(Links::hostsDetails(), $searchBar); $results = $hosts->execute(); if ($viewModeSwitcher->getViewMode() === 'tabular') { $hostList = (new HostItemTable($results, HostItemTable::applyColumnMetaData($hosts, $columns))) ->setSort($sortControl->getSort()); } else { $hostList = (new HostList($results)) ->setViewMode($viewModeSwitcher->getViewMode()); } $this->addContent($hostList); if ($compact) { $this->addContent( (new ShowMore($results, Url::fromRequest()->without(['showCompact', 'limit', 'view']))) ->setBaseTarget('_next') ->setAttribute('title', sprintf( t('Show all %d hosts'), $hosts->count() )) ); } else { $this->addFooter((new HostStatusBar($summary->first()))->setBaseFilter($filter)); } if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { $this->sendMultipartUpdate($continueWith); } $this->setAutorefreshInterval(10); } public function detailsAction() { $this->addTitleTab(t('Hosts')); $db = $this->getDb(); $hosts = Host::on($db)->with(['state', 'icon_image']); $hosts->setResultSetClass(VolatileStateResults::class); $summary = HoststateSummary::on($db)->with(['state']); $this->filter($hosts); $this->filter($summary); $hosts->limit(3); $hosts->peekAhead(); yield $this->export($hosts, $summary); $results = $hosts->execute(); $summary = $summary->first(); $downtimes = Host::on($db)->with(['downtime']); $downtimes->getWith()['host.downtime']->setJoinType('INNER'); $this->filter($downtimes); $summary->downtimes_total = $downtimes->count(); $comments = Host::on($db)->with(['comment']); $comments->getWith()['host.comment']->setJoinType('INNER'); // TODO: This should be automatically done by the model/resolver and added as ON condition $comments->filter(Filter::equal('comment.object_type', 'host')); $this->filter($comments); $summary->comments_total = $comments->count(); $this->addControl( (new HostList($results)) ->setViewMode('minimal') ); $this->addControl(new ShowMore( $results, Links::hosts()->setQueryString(QueryString::render($this->getFilter())), sprintf(t('Show all %d hosts'), $hosts->count()) )); $this->addControl( (new MultiselectQuickActions('host', $summary)) ->setBaseFilter($this->getFilter()) ); $this->addContent( (new ObjectsDetail('host', $summary, $hosts)) ->setBaseFilter($this->getFilter()) ); } public function completeAction() { $suggestions = new ObjectSuggestions(); $suggestions->setModel(Host::class); $suggestions->forRequest(ServerRequest::fromGlobals()); $this->getDocument()->add($suggestions); } public function searchEditorAction() { $editor = $this->createSearchEditor(Host::on($this->getDb()), [ LimitControl::DEFAULT_LIMIT_PARAM, SortControl::DEFAULT_SORT_PARAM, ViewModeSwitcher::DEFAULT_VIEW_MODE_PARAM, 'columns' ]); $this->getDocument()->add($editor); $this->setTitle(t('Adjust Filter')); } protected function fetchCommandTargets(): Query { $db = $this->getDb(); $hosts = Host::on($db)->with('state'); $hosts->setResultSetClass(VolatileStateResults::class); switch ($this->getRequest()->getActionName()) { case 'acknowledge': $hosts->filter(Filter::equal('state.is_problem', 'y')) ->filter(Filter::equal('state.is_acknowledged', 'n')); break; } $this->filter($hosts); return $hosts; } protected function getCommandTargetsUrl(): Url { return Links::hostsDetails()->setQueryString(QueryString::render($this->getFilter())); } protected function getFeatureStatus() { $summary = HoststateSummary::on($this->getDb()); $this->filter($summary); return new FeatureStatus('host', $summary->first()); } }