342 lines
7.5 KiB
PHP
342 lines
7.5 KiB
PHP
<?php
|
|
/* Icinga Web 2 | (c) 2015 Icinga Development Team | GPLv2+ */
|
|
|
|
namespace Icinga\Module\Monitoring\Web\Widget;
|
|
|
|
use Icinga\Web\Form;
|
|
use Icinga\Web\Navigation\Navigation;
|
|
use Icinga\Web\Navigation\NavigationItem;
|
|
use Icinga\Web\Url;
|
|
use Icinga\Web\Widget\AbstractWidget;
|
|
use Icinga\Data\Filter\Filter;
|
|
|
|
class StateBadges extends AbstractWidget
|
|
{
|
|
/**
|
|
* CSS class for the widget
|
|
*
|
|
* @var string
|
|
*/
|
|
const CSS_CLASS = 'state-badges';
|
|
|
|
/**
|
|
* State critical
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_CRITICAL = 'state-critical';
|
|
|
|
/**
|
|
* State critical handled
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_CRITICAL_HANDLED = 'state-critical handled';
|
|
|
|
/**
|
|
* State down
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_DOWN = 'state-down';
|
|
|
|
/**
|
|
* State down handled
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_DOWN_HANDLED = 'state-down handled';
|
|
|
|
/**
|
|
* State ok
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_OK = 'state-ok';
|
|
|
|
/**
|
|
* State pending
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_PENDING = 'state-pending';
|
|
|
|
/**
|
|
* State unknown
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_UNKNOWN = 'state-unknown';
|
|
|
|
/**
|
|
* State unknown handled
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_UNKNOWN_HANDLED = 'state-unknown handled';
|
|
|
|
/**
|
|
* State unreachable
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_UNREACHABLE = 'state-unreachable';
|
|
|
|
/**
|
|
* State unreachable handled
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_UNREACHABLE_HANDLED = 'state-unreachable handled';
|
|
|
|
/**
|
|
* State up
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_UP = 'state-up';
|
|
|
|
/**
|
|
* State warning
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_WARNING = 'state-warning';
|
|
|
|
/**
|
|
* State warning handled
|
|
*
|
|
* @var string
|
|
*/
|
|
const STATE_WARNING_HANDLED = 'state-warning handled';
|
|
|
|
/**
|
|
* State badges
|
|
*
|
|
* @var object[]
|
|
*/
|
|
protected $badges = array();
|
|
|
|
/**
|
|
* Internal counter for badge priorities
|
|
*
|
|
* @var int
|
|
*/
|
|
protected $priority = 1;
|
|
|
|
/**
|
|
* The base filter applied to any badge link
|
|
*
|
|
* @var Filter
|
|
*/
|
|
protected $baseFilter;
|
|
|
|
/**
|
|
* Base URL
|
|
*
|
|
* @var Url
|
|
*/
|
|
protected $url;
|
|
|
|
/**
|
|
* Get the base URL
|
|
*
|
|
* @return Url
|
|
*/
|
|
public function getUrl()
|
|
{
|
|
return $this->url;
|
|
}
|
|
|
|
/**
|
|
* Set the base URL
|
|
*
|
|
* @param Url|string $url
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setUrl($url)
|
|
{
|
|
if (! $url instanceof $url) {
|
|
$url = Url::fromPath($url);
|
|
}
|
|
$this->url = $url;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the base filter
|
|
*
|
|
* @return Filter
|
|
*/
|
|
public function getBaseFilter()
|
|
{
|
|
return $this->baseFilter;
|
|
}
|
|
|
|
/**
|
|
* Set the base filter
|
|
*
|
|
* @param Filter $baseFilter
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBaseFilter($baseFilter)
|
|
{
|
|
$this->baseFilter = $baseFilter;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add a state badge
|
|
*
|
|
* @param string $state
|
|
* @param int $count
|
|
* @param array $filter
|
|
* @param string $translateSingular
|
|
* @param string $translatePlural
|
|
* @param array $translateArgs
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function add(
|
|
$state,
|
|
$count,
|
|
array $filter,
|
|
$translateSingular,
|
|
$translatePlural,
|
|
array $translateArgs = array()
|
|
) {
|
|
$this->badges[$state] = (object) array(
|
|
'count' => (int) $count,
|
|
'filter' => $filter,
|
|
'translateArgs' => $translateArgs,
|
|
'translatePlural' => $translatePlural,
|
|
'translateSingular' => $translateSingular
|
|
);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Create a badge
|
|
*
|
|
* @param string $state
|
|
* @param Navigation $badges
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function createBadge($state, Navigation $badges)
|
|
{
|
|
if ($this->has($state)) {
|
|
$badge = $this->get($state);
|
|
$url = clone $this->url->setParams($badge->filter);
|
|
if (isset($this->baseFilter)) {
|
|
$url->addFilter($this->baseFilter);
|
|
}
|
|
$badges->addItem(new NavigationItem($state, array(
|
|
'attributes' => array('class' => 'badge ' . $state),
|
|
'label' => $badge->count,
|
|
'priority' => $this->priority++,
|
|
'title' => vsprintf(
|
|
mtp('monitoring', $badge->translateSingular, $badge->translatePlural, $badge->count),
|
|
$badge->translateArgs
|
|
),
|
|
'url' => $url
|
|
)));
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Create a badge group
|
|
*
|
|
* @param array $states
|
|
* @param Navigation $badges
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function createBadgeGroup(array $states, Navigation $badges)
|
|
{
|
|
$group = array_intersect_key($this->badges, array_flip($states));
|
|
if (! empty($group)) {
|
|
$groupItem = new NavigationItem(
|
|
uniqid(),
|
|
array(
|
|
'cssClass' => 'state-badge-group',
|
|
'label' => '',
|
|
'priority' => $this->priority++
|
|
)
|
|
);
|
|
$groupBadges = new Navigation();
|
|
$groupBadges->setLayout(Navigation::LAYOUT_TABS);
|
|
foreach (array_keys($group) as $state) {
|
|
$this->createBadge($state, $groupBadges);
|
|
}
|
|
$groupItem->setChildren($groupBadges);
|
|
$badges->addItem($groupItem);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get whether a badge for the given state has been added
|
|
*
|
|
* @param string $state
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function has($state)
|
|
{
|
|
return isset($this->badges[$state]) && $this->badges[$state]->count;
|
|
}
|
|
|
|
/**
|
|
* Get the badge for the given state
|
|
*
|
|
* @param string $state
|
|
*
|
|
* @return object
|
|
*/
|
|
public function get($state)
|
|
{
|
|
return $this->badges[$state];
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function render()
|
|
{
|
|
$badges = new Navigation();
|
|
$badges->setLayout(Navigation::LAYOUT_TABS);
|
|
$this
|
|
->createBadgeGroup(
|
|
array(static::STATE_CRITICAL, static::STATE_CRITICAL_HANDLED),
|
|
$badges
|
|
)
|
|
->createBadgeGroup(
|
|
array(static::STATE_DOWN, static::STATE_DOWN_HANDLED),
|
|
$badges
|
|
)
|
|
->createBadgeGroup(
|
|
array(static::STATE_WARNING, static::STATE_WARNING_HANDLED),
|
|
$badges
|
|
)
|
|
->createBadgeGroup(
|
|
array(static::STATE_UNREACHABLE, static::STATE_UNREACHABLE_HANDLED),
|
|
$badges
|
|
)
|
|
->createBadgeGroup(
|
|
array(static::STATE_UNKNOWN, static::STATE_UNKNOWN_HANDLED),
|
|
$badges
|
|
)
|
|
->createBadge(static::STATE_OK, $badges)
|
|
->createBadge(static::STATE_UP, $badges)
|
|
->createBadge(static::STATE_PENDING, $badges);
|
|
return $badges
|
|
->getRenderer()
|
|
->setCssClass(static::CSS_CLASS)
|
|
->render();
|
|
}
|
|
}
|