mirror of
https://github.com/Icinga/icingadb-web.git
synced 2026-05-28 04:36:06 -04:00
This was easy because only README.md and doc/01-About.md were redacted manually, everything else via: git ls-files -z |xargs -0 perl -pi -e 's/Icinga GmbH \| GPLv2/Icinga GmbH | GPLv2+/' This is legal because we have only merged PRs with label:cla/signed or made by Icinga staff: https://github.com/Icinga/icingadb-web/pulls?page=1&q=is%3Apr+is%3Aclosed+-label%3Acla%2Fsigned+-author%3Anilmerg This has no risk for us in people distributing their own version under GPLv3 only. After all, we won't take their patches anyway, unless they sign our CLA. This is the cleanest solution for having e.g. these in one address space: * Icinga Web, GPLv2+ * K8s Web, AGPLv3 * Thirdparty, some LGPLv3 and Apache-2.0 Apropos, K8s Web is even v3-licensed on purpose, to have a stronger protection against cloud ops.
221 lines
5.3 KiB
PHP
221 lines
5.3 KiB
PHP
<?php
|
|
|
|
/* Icinga DB Web | (c) 2020 Icinga GmbH | GPLv2+ */
|
|
|
|
namespace Icinga\Module\Icingadb\Common;
|
|
|
|
use InvalidArgumentException;
|
|
use ipl\Html\BaseHtmlElement;
|
|
use ipl\Html\Html;
|
|
use ipl\Html\HtmlElement;
|
|
use ipl\Stdlib\BaseFilter;
|
|
use ipl\Stdlib\Filter;
|
|
use ipl\Web\Url;
|
|
use ipl\Web\Widget\Link;
|
|
use ipl\Web\Widget\StateBadge;
|
|
|
|
abstract class StateBadges extends BaseHtmlElement
|
|
{
|
|
use BaseFilter;
|
|
|
|
/** @var object $item */
|
|
protected $item;
|
|
|
|
/** @var string */
|
|
protected $type;
|
|
|
|
/** @var string Prefix */
|
|
protected $prefix;
|
|
|
|
/** @var ?Url Badge link */
|
|
protected $url;
|
|
|
|
protected $tag = 'ul';
|
|
|
|
protected $defaultAttributes = ['class' => 'state-badges'];
|
|
|
|
/**
|
|
* Create a new widget for state badges
|
|
*
|
|
* @param object $item
|
|
*/
|
|
public function __construct($item)
|
|
{
|
|
$this->item = $item;
|
|
$this->type = $this->getType();
|
|
$this->prefix = $this->getPrefix();
|
|
$this->url = $this->getBaseUrl();
|
|
}
|
|
|
|
/**
|
|
* Get the type of the items
|
|
*
|
|
* @return string
|
|
*/
|
|
abstract protected function getType(): string;
|
|
|
|
/**
|
|
* Get the prefix for accessing state information
|
|
*
|
|
* @return string
|
|
*/
|
|
abstract protected function getPrefix(): string;
|
|
|
|
/**
|
|
* Get the badge base URL
|
|
*
|
|
* @return ?Url
|
|
*/
|
|
protected function getBaseUrl(): ?Url
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Get the integer of the given state text
|
|
*
|
|
* @param string $state
|
|
*
|
|
* @return int
|
|
*
|
|
* @throws InvalidArgumentException if the given state is not valid
|
|
*/
|
|
protected function getStateInt(string $state): int
|
|
{
|
|
throw new InvalidArgumentException(sprintf('%s is not a valid state', $state));
|
|
}
|
|
|
|
/**
|
|
* Get the badge URL
|
|
*
|
|
* @return ?Url
|
|
*/
|
|
public function getUrl(): ?Url
|
|
{
|
|
return $this->url;
|
|
}
|
|
|
|
/**
|
|
* Set the badge URL
|
|
*
|
|
* @param Url $url
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setUrl(Url $url): self
|
|
{
|
|
$this->url = $url;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Create a badge link
|
|
*
|
|
* @param mixed $content
|
|
* @param ?Filter\Rule $filter
|
|
*
|
|
* @return Link
|
|
*/
|
|
protected function createLink($content, Filter\Rule $filter = null): Link
|
|
{
|
|
$url = clone $this->getUrl();
|
|
|
|
$urlFilter = Filter::all();
|
|
if ($filter !== null) {
|
|
$urlFilter->add($filter);
|
|
}
|
|
|
|
if ($this->hasBaseFilter()) {
|
|
$urlFilter->add($this->getBaseFilter());
|
|
}
|
|
|
|
if (! $urlFilter->isEmpty()) {
|
|
$url->setFilter($urlFilter);
|
|
}
|
|
|
|
return new Link($content, $url);
|
|
}
|
|
|
|
/**
|
|
* Create a state bade
|
|
*
|
|
* @param string $state
|
|
*
|
|
* @return ?BaseHtmlElement
|
|
*/
|
|
protected function createBadge(string $state): ?BaseHtmlElement
|
|
{
|
|
$key = $this->prefix . "_{$state}";
|
|
if (empty($this->item->$key)) {
|
|
return null;
|
|
}
|
|
|
|
$stateBadge = new StateBadge($this->item->$key, $state);
|
|
|
|
if ($this->url !== null) {
|
|
$stateBadge = $this->createLink(
|
|
$stateBadge,
|
|
Filter::equal($this->type . '.state.soft_state', $this->getStateInt($state))
|
|
);
|
|
}
|
|
|
|
return new HtmlElement('li', null, $stateBadge);
|
|
}
|
|
|
|
/**
|
|
* Create a state group
|
|
*
|
|
* @param string $state
|
|
*
|
|
* @return ?BaseHtmlElement
|
|
*/
|
|
protected function createGroup(string $state): ?BaseHtmlElement
|
|
{
|
|
$content = [];
|
|
$handledKey = $this->prefix . "_{$state}_handled";
|
|
$unhandledKey = $this->prefix . "_{$state}_unhandled";
|
|
|
|
if (isset($this->item->$unhandledKey) && $this->item->$unhandledKey) {
|
|
$unhandledStateBadge = new StateBadge($this->item->$unhandledKey, $state);
|
|
|
|
if ($this->url !== null) {
|
|
$unhandledStateBadge = $this->createLink(
|
|
$unhandledStateBadge,
|
|
Filter::all(
|
|
Filter::equal($this->type . '.state.soft_state', $this->getStateInt($state)),
|
|
Filter::equal($this->type . '.state.is_handled', 'n'),
|
|
Filter::equal($this->type . '.state.is_reachable', 'y')
|
|
)
|
|
);
|
|
}
|
|
|
|
$content[] = new HtmlElement('li', null, $unhandledStateBadge);
|
|
}
|
|
|
|
if (isset($this->item->$handledKey) && $this->item->$handledKey) {
|
|
$handledStateBadge = new StateBadge($this->item->$handledKey, $state, true);
|
|
|
|
if ($this->url !== null) {
|
|
$handledStateBadge = $this->createLink(
|
|
$handledStateBadge,
|
|
Filter::all(
|
|
Filter::equal($this->type . '.state.soft_state', $this->getStateInt($state)),
|
|
Filter::any(
|
|
Filter::equal($this->type . '.state.is_handled', 'y'),
|
|
Filter::equal($this->type . '.state.is_reachable', 'n')
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
$content[] = new HtmlElement('li', null, $handledStateBadge);
|
|
}
|
|
|
|
if (empty($content)) {
|
|
return null;
|
|
}
|
|
|
|
return Html::tag('li', Html::tag('ul', $content));
|
|
}
|
|
}
|