icingaweb2-module-director/library/Director/Web/Table/Dependency/DependencyInfoTable.php

102 lines
3.1 KiB
PHP

<?php
namespace Icinga\Module\Director\Web\Table\Dependency;
use Icinga\Application\Modules\Module;
use Icinga\Module\Director\Application\DependencyChecker;
use Icinga\Web\Url;
class DependencyInfoTable
{
protected $module;
protected $checker;
public function __construct(DependencyChecker $checker, Module $module)
{
$this->module = $module;
$this->checker = $checker;
}
protected function linkToModule($name, $icon)
{
return Html::link(
Html::escape($name),
Html::webUrl('config/module', ['name' => $name]),
[
'class' => "icon-$icon"
]
);
}
public function render()
{
$html = '<table class="common-table table-row-selectable">
<thead>
<tr>
<th>' . Html::escape($this->translate('Module name')) . '</th>
<th>' . Html::escape($this->translate('Required')) . '</th>
<th>' . Html::escape($this->translate('Installed')) . '</th>
</tr>
</thead>
<tbody data-base-target="_next">
';
foreach ($this->checker->getDependencies($this->module) as $dependency) {
$name = $dependency->getName();
$isLibrary = substr($name, 0, 11) === 'icinga-php-';
$rowAttributes = $isLibrary ? ['data-base-target' => '_self'] : null;
if ($dependency->isSatisfied()) {
if ($dependency->isSatisfied()) {
$icon = 'ok';
} else {
$icon = 'cancel';
}
$link = $isLibrary ? $this->noLink($name, $icon) : $this->linkToModule($name, $icon);
$installed = $dependency->getInstalledVersion();
} elseif ($dependency->isInstalled()) {
$installed = sprintf('%s (%s)', $dependency->getInstalledVersion(), $this->translate('disabled'));
$link = $this->linkToModule($name, 'cancel');
} else {
$installed = $this->translate('missing');
$repository = $isLibrary ? $name : "icingaweb2-module-$name";
$link = sprintf(
'%s (%s)',
$this->noLink($name, 'cancel'),
Html::linkToGitHub(Html::escape($this->translate('more')), 'Icinga', $repository)
);
}
$html .= $this->htmlRow([
$link,
Html::escape($dependency->getRequirement()),
Html::escape($installed)
], $rowAttributes);
}
return $html . '</tbody>
</table>
';
}
protected function noLink($label, $icon)
{
return Html::link(Html::escape($label), Url::fromRequest()->with('rnd', rand(1, 100000)), [
'class' => "icon-$icon"
]);
}
protected function translate($string)
{
return \mt('director', $string);
}
protected function htmlRow(array $cols, $rowAttributes)
{
$content = '';
foreach ($cols as $escapedContent) {
$content .= Html::tag('td', null, $escapedContent);
}
return Html::tag('tr', $rowAttributes, $content);
}
}