mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-10-31 03:14:31 +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();
 | |
|     }
 | |
| }
 |