summaryrefslogtreecommitdiffstats
path: root/application
diff options
context:
space:
mode:
Diffstat (limited to 'application')
-rw-r--r--application/controllers/HostsController.php45
-rw-r--r--application/controllers/IdoHostsController.php24
-rw-r--r--application/controllers/IdoServicesController.php24
-rw-r--r--application/controllers/IndexController.php15
-rw-r--r--application/controllers/ServicesController.php45
-rw-r--r--application/forms/DimensionsForm.php211
-rw-r--r--application/views/scripts/cube-details.phtml12
-rw-r--r--application/views/scripts/cube-index.phtml22
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>