diff options
Diffstat (limited to 'application')
-rw-r--r-- | application/controllers/HostsController.php | 45 | ||||
-rw-r--r-- | application/controllers/IdoHostsController.php | 24 | ||||
-rw-r--r-- | application/controllers/IdoServicesController.php | 24 | ||||
-rw-r--r-- | application/controllers/IndexController.php | 15 | ||||
-rw-r--r-- | application/controllers/ServicesController.php | 45 | ||||
-rw-r--r-- | application/forms/DimensionsForm.php | 211 | ||||
-rw-r--r-- | application/views/scripts/cube-details.phtml | 12 | ||||
-rw-r--r-- | application/views/scripts/cube-index.phtml | 22 |
8 files changed, 398 insertions, 0 deletions
diff --git a/application/controllers/HostsController.php b/application/controllers/HostsController.php new file mode 100644 index 0000000..c41d846 --- /dev/null +++ b/application/controllers/HostsController.php @@ -0,0 +1,45 @@ +<?php + +// Icinga Web 2 Cube Module | (c) 2019 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Controllers; + +use Icinga\Module\Cube\IcingaDb\IcingaDbCube; +use Icinga\Module\Cube\IcingaDb\IcingaDbHostStatusCube; +use Icinga\Module\Cube\Web\Controller; +use Icinga\Module\Icingadb\Model\Host; +use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; + +class HostsController extends Controller +{ + public function indexAction(): void + { + $this->createTabs()->activate('cube/hosts'); + + $this->renderCube(); + } + + protected function getCube(): IcingaDbCube + { + return new IcingaDbHostStatusCube(); + } + + public function completeAction(): void + { + $suggestions = new ObjectSuggestions(); + $suggestions->setModel(Host::class); + $suggestions->forRequest($this->getServerRequest()); + $this->getDocument()->add($suggestions); + } + + public function searchEditorAction(): void + { + $editor = $this->createSearchEditor( + Host::on($this->getDb()), + $this->preserveParams + ); + + $this->getDocument()->add($editor); + $this->setTitle($this->translate('Adjust Filter')); + } +} diff --git a/application/controllers/IdoHostsController.php b/application/controllers/IdoHostsController.php new file mode 100644 index 0000000..8648823 --- /dev/null +++ b/application/controllers/IdoHostsController.php @@ -0,0 +1,24 @@ +<?php + +// Icinga Cube Module | (c) 2022 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Controllers; + +use Icinga\Module\Cube\Ido\IdoCube; +use Icinga\Module\Cube\Ido\IdoHostStatusCube; +use Icinga\Module\Cube\Web\IdoController; + +class IdoHostsController extends IdoController +{ + public function indexAction(): void + { + $this->createTabs()->activate('cube/hosts'); + + $this->renderCube(); + } + + protected function getCube(): IdoCube + { + return new IdoHostStatusCube(); + } +} diff --git a/application/controllers/IdoServicesController.php b/application/controllers/IdoServicesController.php new file mode 100644 index 0000000..f55e1d7 --- /dev/null +++ b/application/controllers/IdoServicesController.php @@ -0,0 +1,24 @@ +<?php + +// Icinga Cube Module | (c) 2022 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Controllers; + +use Icinga\Module\Cube\Ido\IdoCube; +use Icinga\Module\Cube\Ido\IdoServiceStatusCube; +use Icinga\Module\Cube\Web\IdoController; + +class IdoServicesController extends IdoController +{ + public function indexAction(): void + { + $this->createTabs()->activate('cube/services'); + + $this->renderCube(); + } + + protected function getCube(): IdoCube + { + return new IdoServiceStatusCube(); + } +} diff --git a/application/controllers/IndexController.php b/application/controllers/IndexController.php new file mode 100644 index 0000000..082fda3 --- /dev/null +++ b/application/controllers/IndexController.php @@ -0,0 +1,15 @@ +<?php + +// Icinga Web 2 Cube Module | (c) 2016 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Controllers; + +use Icinga\Web\Controller; + +class IndexController extends Controller +{ + public function indexAction() + { + $this->redirectNow('cube/hosts' . ($this->params->toString() === '' ? '' : '?' . $this->params->toString())); + } +} diff --git a/application/controllers/ServicesController.php b/application/controllers/ServicesController.php new file mode 100644 index 0000000..0914aa2 --- /dev/null +++ b/application/controllers/ServicesController.php @@ -0,0 +1,45 @@ +<?php + +// Icinga Web 2 Cube Module | (c) 2019 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Controllers; + +use Icinga\Module\Cube\IcingaDb\IcingaDbCube; +use Icinga\Module\Cube\IcingaDb\IcingaDbServiceStatusCube; +use Icinga\Module\Cube\Web\Controller; +use Icinga\Module\Icingadb\Model\Service; +use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; + +class ServicesController extends Controller +{ + public function indexAction(): void + { + $this->createTabs()->activate('cube/services'); + + $this->renderCube(); + } + + protected function getCube(): IcingaDbCube + { + return new IcingaDbServiceStatusCube(); + } + + public function completeAction(): void + { + $suggestions = new ObjectSuggestions(); + $suggestions->setModel(Service::class); + $suggestions->forRequest($this->getServerRequest()); + $this->getDocument()->add($suggestions); + } + + public function searchEditorAction(): void + { + $editor = $this->createSearchEditor( + Service::on($this->getDb()), + $this->preserveParams + ); + + $this->getDocument()->add($editor); + $this->setTitle($this->translate('Adjust Filter')); + } +} diff --git a/application/forms/DimensionsForm.php b/application/forms/DimensionsForm.php new file mode 100644 index 0000000..fbfbbc7 --- /dev/null +++ b/application/forms/DimensionsForm.php @@ -0,0 +1,211 @@ +<?php + +// Icinga Web 2 Cube Module | (c) 2016 Icinga GmbH | GPLv2 + +namespace Icinga\Module\Cube\Forms; + +use Icinga\Module\Cube\Cube; +use Icinga\Module\Cube\Dimension; +use Icinga\Module\Cube\DimensionParams; +use Icinga\Web\Notification; +use ipl\Html\Form; +use ipl\Html\Html; +use ipl\I18n\Translation; +use ipl\Web\Common\FormUid; +use ipl\Web\Url; +use ipl\Web\Widget\Icon; + +class DimensionsForm extends Form +{ + use FormUid; + use Translation; + + protected $defaultAttributes = [ + 'class' => 'icinga-controls', + 'name' => 'dimensions-form' + ]; + + /** + * @var Cube + */ + private $cube; + + /** + * @var Url + */ + private $url; + + /** + * Get the url + * + * @return Url + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set the url + * + * @param mixed $url + */ + public function setUrl($url): self + { + $this->url = $url; + + return $this; + } + + public function setCube(Cube $cube) + { + $this->cube = $cube; + return $this; + } + + public function hasBeenSubmitted(): bool + { + // required to submit dimension controls and the selected dropdown option + return $this->hasBeenSent() && + ($this->getPressedSubmitElement() !== null || $this->getPopulatedValue('addDimension')); + } + + public function assemble() + { + $dimensions = $this->cube->listDimensions(); + $cnt = count($dimensions); + + if ($cnt < 3) { + $allDimensions = $this->cube->listAdditionalDimensions(); + + $this->addElement('select', 'addDimension', [ + 'options' => [null => $this->translate('+ Add a dimension')] + $allDimensions, + 'class' => 'autosubmit' + ]); + } + + $pos = 0; + foreach ($dimensions as $dimension) { + $this->addDimensionButtons($dimension, $pos++, $cnt); + } + + foreach ($this->cube->getSlices() as $key => $value) { + $this->addSlice($this->cube->getDimension($key), $value); + } + + $this->addElement($this->createUidElement()); + } + + protected function addSlice(Dimension $dimension, $value) + { + $sliceId = sha1($this->cube::SLICE_PREFIX . $dimension->getName()); + + $sliceFieldset = Html::tag('fieldset', ['class' => 'dimensions']); + + $btn = $this->createElement('submitButton', 'removeSlice_' . $sliceId, [ + 'label' => new Icon('trash'), + 'class' => 'dimension-control' + ]); + + $this->registerElement($btn); + $sliceFieldset->addHtml($btn); + + $sliceFieldset->addHtml(Html::tag( + 'span', + ['class' => 'dimension-name'], + sprintf('%s: %s = %s', $this->translate('Slice/Filter'), $dimension->getLabel(), $value) + )); + + $this->addHtml($sliceFieldset); + } + + protected function addDimensionButtons(Dimension $dimension, $pos, $total) + { + $dimensionId = sha1($dimension->getName()); + + $dimensionFieldset = Html::tag('fieldset', ['class' => 'dimensions']); + + $btn = $this->createElement('submitButton', 'removeDimension_' . $dimensionId, [ + 'label' => new Icon('trash'), + 'title' => sprintf($this->translate('Remove dimension "%s"'), $dimension->getLabel()), + 'class' => 'dimension-control' + ]); + + $this->registerElement($btn); + $dimensionFieldset->addHtml($btn); + + if ($pos > 0) { + $btn = $this->createElement('submitButton', 'moveDimensionUp_' . $dimensionId, [ + 'label' => new Icon('angle-double-up'), + 'title' => sprintf($this->translate('Move dimension "%s" up'), $dimension->getLabel()), + 'class' => 'dimension-control', + ]); + + $this->registerElement($btn); + $dimensionFieldset->addHtml($btn); + } + + if ($pos + 1 !== $total) { + $btn = $this->createElement('submitButton', 'moveDimensionDown_' . $dimensionId, [ + 'label' => new Icon('angle-double-down'), + 'title' => sprintf($this->translate('Move dimension "%s" down'), $dimension->getLabel()), + 'class' => 'dimension-control' + ]); + + $this->registerElement($btn); + $dimensionFieldset->addHtml($btn); + } + + $dimensionFieldset->addHtml(Html::tag('span', ['class' => 'dimension-name'], $dimension->getLabel())); + + $this->addHtml($dimensionFieldset); + } + + public function onSuccess() + { + $url = $this->getUrl(); + + if ($dimension = $this->getValue('addDimension')) { + $url->setParam('dimensions', DimensionParams::fromUrl($url)->add($dimension)->getParams()); + Notification::success($this->translate('New dimension has been added')); + } else { + $updateDimensions = false; + $pressedButtonName = $this->getPressedSubmitElement()->getName(); + + foreach ($this->cube->listDimensions() as $name => $_) { + $dimensionId = sha1($name); + + switch (true) { + case ($pressedButtonName === 'removeDimension_' . $dimensionId): + $this->cube->removeDimension($name); + $updateDimensions = true; + break 2; + case ($pressedButtonName === 'moveDimensionUp_' . $dimensionId): + $this->cube->moveDimensionUp($name); + $updateDimensions = true; + break 2; + case ($pressedButtonName === 'moveDimensionDown_' . $dimensionId): + $this->cube->moveDimensionDown($name); + $updateDimensions = true; + break 2; + } + } + + if ($updateDimensions) { + $dimensions = array_merge(array_keys($this->cube->listDimensions()), $this->cube->listSlices()); + $url->setParam('dimensions', DimensionParams::update($dimensions)->getParams()); + } else { + foreach ($this->cube->listSlices() as $slice) { + $slice = $this->cube::SLICE_PREFIX . $slice; + $sliceId = sha1($slice); + + if ($pressedButtonName === 'removeSlice_' . $sliceId) { + $url->getParams()->remove(rawurlencode($slice)); + } + } + } + } + + $this->setRedirectUrl($url); + } +} diff --git a/application/views/scripts/cube-details.phtml b/application/views/scripts/cube-details.phtml new file mode 100644 index 0000000..8e0611f --- /dev/null +++ b/application/views/scripts/cube-details.phtml @@ -0,0 +1,12 @@ +<div class="controls"> +<?php if (! \Icinga\Module\Cube\Cube::isUsingIcingaDb()): ?> + <?= $this->tabs ?> +<?php endif ?> +<h1><?= $this->escape($this->title) ?></h1> +</div> + +<div class="content"> + <ul class="action-links"> + <?= $this->links ?> + </ul> +</div> diff --git a/application/views/scripts/cube-index.phtml b/application/views/scripts/cube-index.phtml new file mode 100644 index 0000000..f46d74a --- /dev/null +++ b/application/views/scripts/cube-index.phtml @@ -0,0 +1,22 @@ +<div class="controls"> + <?php if (! $this->compact): ?> + <?php if (! \Icinga\Module\Cube\Cube::isUsingIcingaDb()): ?> + <?= $this->tabs ?> + <?php endif ?> + <h1><?= $this->escape($this->title) ?></h1> + <?php if ($this->form && ! $this->compact): ?> + <?= $this->qlink('Hide settings', $this->url->without('showSettings'), null, ['icon' => 'wrench']) ?> + <?php else: ?> + <?= $this->qlink('Show settings', $this->url->with('showSettings', true), null, ['icon' => 'wrench']) ?> + <?php endif ?> + <?php endif ?> +</div> + +<div class="content"> + <?php if ($this->form && ! $this->compact): ?> + <?= $this->form ?> + <?php endif ?> + <?php if ($this->cube): ?> + <?= $this->cube->render($this) ?> + <?php endif ?> +</div> |