Skip to content

Commit ac52d74

Browse files
authored
Add a control to choose columns in tabular view mode (#1333)
Add a new form to choose the displayed columns in hosts and services view. resolves: #82
2 parents ba56d55 + c8a719d commit ac52d74

15 files changed

Lines changed: 938 additions & 361 deletions

File tree

application/controllers/HostgroupsController.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Icinga\Module\Icingadb\Model\Hostgroupsummary;
1111
use Icinga\Module\Icingadb\View\HostgroupGridRenderer;
1212
use Icinga\Module\Icingadb\View\HostgroupRenderer;
13+
use Icinga\Module\Icingadb\Web\Control\GridViewModeSwitcher;
1314
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
1415
use Icinga\Module\Icingadb\Web\Controller;
1516
use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher;
@@ -42,7 +43,11 @@ public function indexAction()
4243

4344
$limitControl = $this->createLimitControl();
4445
$paginationControl = $this->createPaginationControl($hostgroups);
45-
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl);
46+
$viewModeSwitcher = $this->createViewModeSwitcher(
47+
$paginationControl,
48+
$limitControl,
49+
viewModeSwitcherClass: GridViewModeSwitcher::class
50+
);
4651

4752
if ($viewModeSwitcher->getViewMode() === 'grid') {
4853
$hostgroups->without([

application/controllers/HostsController.php

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Icinga\Module\Icingadb\Redis\VolatileStateResults;
1414
use Icinga\Module\Icingadb\Util\FeatureStatus;
1515
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
16+
use Icinga\Module\Icingadb\Web\Control\TabularViewModeSwitcher;
1617
use Icinga\Module\Icingadb\Web\Controller;
1718
use Icinga\Module\Icingadb\Widget\Detail\MultiselectQuickActions;
1819
use Icinga\Module\Icingadb\Widget\Detail\ObjectsDetail;
@@ -61,8 +62,18 @@ public function indexAction()
6162
],
6263
['host.state.severity DESC', 'host.state.last_state_change DESC']
6364
);
64-
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl);
65-
$columns = $this->createColumnControl($hosts, $viewModeSwitcher);
65+
$viewModeSwitcher = $this->createViewModeSwitcher(
66+
$paginationControl,
67+
$limitControl,
68+
viewModeSwitcherClass: TabularViewModeSwitcher::class
69+
);
70+
$columns = $this->createColumnControl(
71+
$hosts,
72+
Url::fromPath('icingadb/hosts/suggestColumns'),
73+
['host.name', 'host.state.output'],
74+
Url::fromPath('icingadb/hosts')
75+
)
76+
->getColumns();
6677

6778
$searchBar = $this->createSearchBar($hosts, [
6879
$limitControl->getLimitParam(),
@@ -104,7 +115,8 @@ public function indexAction()
104115
$continueWith = $this->createContinueWith(Links::hostsDetails(), $searchBar, $results->hasResult());
105116
if ($viewModeSwitcher->getViewMode() === 'tabular') {
106117
$hostList = (new HostItemTable($results, HostItemTable::applyColumnMetaData($hosts, $columns)))
107-
->setSort($sortControl->getSort());
118+
->setSort($sortControl->getSort())
119+
->setColumnChooserUrl(Url::fromPath('icingadb/hosts/columnControl'));
108120
} else {
109121
$hostList = (new ObjectList($results))
110122
->setViewMode($viewModeSwitcher->getViewMode());
@@ -198,6 +210,14 @@ public function completeAction()
198210
$this->getDocument()->add($suggestions);
199211
}
200212

213+
public function suggestColumnsAction()
214+
{
215+
$this->suggestColumns(Host::class, [
216+
'host' => t('Host %s', '..<customvar-name>'),
217+
'service' => t('Service %s', '..<customvar-name>')
218+
]);
219+
}
220+
201221
public function searchEditorAction()
202222
{
203223
$editor = $this->createSearchEditor(Host::on($this->getDb()), [
@@ -211,6 +231,18 @@ public function searchEditorAction()
211231
$this->setTitle(t('Adjust Filter'));
212232
}
213233

234+
public function columnControlAction()
235+
{
236+
$this->setTitle($this->translate('Select Columns'));
237+
$columnChooser = $this->createColumnControl(
238+
Host::on($this->getDb()),
239+
Url::fromPath('icingadb/hosts/suggestColumns'),
240+
['host.name', 'host.state.output'],
241+
Url::fromPath('icingadb/hosts')
242+
)->handleRequest($this->getServerRequest());
243+
$this->addContent($columnChooser);
244+
}
245+
214246
protected function fetchCommandTargets(): Query
215247
{
216248
$db = $this->getDb();

application/controllers/ServicegroupsController.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Icinga\Module\Icingadb\Model\ServicegroupSummary;
1111
use Icinga\Module\Icingadb\View\ServicegroupGridRenderer;
1212
use Icinga\Module\Icingadb\View\ServicegroupRenderer;
13+
use Icinga\Module\Icingadb\Web\Control\GridViewModeSwitcher;
1314
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
1415
use Icinga\Module\Icingadb\Web\Controller;
1516
use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher;
@@ -44,7 +45,11 @@ public function indexAction()
4445

4546
$limitControl = $this->createLimitControl();
4647
$paginationControl = $this->createPaginationControl($servicegroups);
47-
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl);
48+
$viewModeSwitcher = $this->createViewModeSwitcher(
49+
$paginationControl,
50+
$limitControl,
51+
viewModeSwitcherClass: GridViewModeSwitcher::class
52+
);
4853

4954
$sortControl = $this->createSortControl(
5055
$servicegroups,

application/controllers/ServicesController.php

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Icinga\Module\Icingadb\Util\FeatureStatus;
1616
use Icinga\Module\Icingadb\Web\Control\ProblemToggle;
1717
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
18+
use Icinga\Module\Icingadb\Web\Control\TabularViewModeSwitcher;
1819
use Icinga\Module\Icingadb\Web\Controller;
1920
use Icinga\Module\Icingadb\Widget\Detail\MultiselectQuickActions;
2021
use Icinga\Module\Icingadb\Widget\Detail\ObjectsDetail;
@@ -72,8 +73,18 @@ public function indexAction()
7273
],
7374
['service.state.severity DESC', 'service.state.last_state_change DESC']
7475
);
75-
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl);
76-
$columns = $this->createColumnControl($services, $viewModeSwitcher);
76+
$viewModeSwitcher = $this->createViewModeSwitcher(
77+
$paginationControl,
78+
$limitControl,
79+
viewModeSwitcherClass: TabularViewModeSwitcher::class
80+
);
81+
$columns = $this->createColumnControl(
82+
$services,
83+
Url::fromPath('icingadb/services/suggestColumns'),
84+
['service.name', 'service.state.output'],
85+
Url::fromPath('icingadb/services')
86+
)
87+
->getColumns();
7788

7889
$searchBar = $this->createSearchBar($services, [
7990
$limitControl->getLimitParam(),
@@ -116,7 +127,8 @@ public function indexAction()
116127

117128
if ($viewModeSwitcher->getViewMode() === 'tabular') {
118129
$serviceList = (new ServiceItemTable($results, ServiceItemTable::applyColumnMetaData($services, $columns)))
119-
->setSort($sortControl->getSort());
130+
->setSort($sortControl->getSort())
131+
->setColumnChooserUrl(Url::fromPath('icingadb/services/columnControl'));
120132
} else {
121133
$serviceList = (new ObjectList($results))
122134
->setViewMode($viewModeSwitcher->getViewMode());
@@ -215,6 +227,14 @@ public function completeAction()
215227
$this->getDocument()->add($suggestions);
216228
}
217229

230+
public function suggestColumnsAction()
231+
{
232+
$this->suggestColumns(Service::class, [
233+
'host' => t('Host %s', '..<customvar-name>'),
234+
'service' => t('Service %s', '..<customvar-name>')
235+
]);
236+
}
237+
218238
public function searchEditorAction()
219239
{
220240
$editor = $this->createSearchEditor(Service::on($this->getDb()), [
@@ -376,6 +396,18 @@ public function gridSearchEditorAction()
376396
$this->setTitle(t('Adjust Filter'));
377397
}
378398

399+
public function columnControlAction()
400+
{
401+
$this->setTitle($this->translate('Select Columns'));
402+
$columnChooser = $this->createColumnControl(
403+
Service::on($this->getDb()),
404+
Url::fromPath('icingadb/services/suggestColumns'),
405+
['service.name', 'service.state.output'],
406+
Url::fromPath('icingadb/services')
407+
)->handleRequest($this->getServerRequest());
408+
$this->addContent($columnChooser);
409+
}
410+
379411
protected function fetchCommandTargets(): Query
380412
{
381413
$db = $this->getDb();

doc/02-Installation.md.d/From-Source.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Make sure you use `icingadb` as the module name. The following requirements must
1111
* The following PHP modules must be installed: `cURL`, `dom`, `json`, `libxml`
1212
* [Icinga DB](https://github.com/Icinga/icingadb) ≥ 1.4
1313
* [Icinga Web 2](https://github.com/Icinga/icingaweb2) ≥ 2.12.5
14-
* [Icinga PHP Library (ipl)](https://github.com/Icinga/icinga-php-library) ≥ 0.19.0
14+
* [Icinga PHP Library (ipl)](https://github.com/Icinga/icinga-php-library) ≥ 0.20.0
1515
* [Icinga PHP Thirdparty](https://github.com/Icinga/icinga-php-thirdparty) ≥ 0.15.0
1616

1717
<!-- {% include "02-Installation.md" %} -->

library/Icingadb/Common/SearchControls.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace Icinga\Module\Icingadb\Common;
77

8-
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
8+
use Icinga\Module\Icingadb\Data\QueryColumnsProvider;
99
use ipl\Html\Html;
1010
use ipl\Orm\Query;
1111
use ipl\Web\Control\SearchBar;
@@ -20,7 +20,7 @@ trait SearchControls
2020

2121
public function fetchFilterColumns(Query $query): array
2222
{
23-
return iterator_to_array(ObjectSuggestions::collectFilterColumns($query->getModel(), $query->getResolver()));
23+
return iterator_to_array(QueryColumnsProvider::collectFilterColumns($query->getModel(), $query->getResolver()));
2424
}
2525

2626
/**

0 commit comments

Comments
 (0)