mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-11-03 20:54:27 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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();
 | 
						|
    }
 | 
						|
}
 |