Icingadb/CustomVarRenderer: Render labels of key and value as HtmlElements
This commit is contained in:
parent
b7ea8aada6
commit
c78979b24a
|
@ -12,6 +12,12 @@ use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
|
|||
use Icinga\Module\Icingadb\Hook\CustomVarRendererHook;
|
||||
use Icinga\Module\Icingadb\Model\Host;
|
||||
use Icinga\Module\Icingadb\Model\Service;
|
||||
use ipl\Html\Attributes;
|
||||
use ipl\Html\Html;
|
||||
use ipl\Html\HtmlDocument;
|
||||
use ipl\Html\HtmlElement;
|
||||
use ipl\Html\Text;
|
||||
use ipl\Html\ValidHtml;
|
||||
use ipl\Orm\Model;
|
||||
|
||||
class CustomVarRenderer extends CustomVarRendererHook
|
||||
|
@ -25,6 +31,14 @@ class CustomVarRenderer extends CustomVarRendererHook
|
|||
/** @var array Related dictionary field names */
|
||||
protected $dictionaryNames = [];
|
||||
|
||||
protected $dictionaryLevel = 0;
|
||||
|
||||
/** @var HtmlElement Table for dictionary fields */
|
||||
private $dictionaryTable;
|
||||
|
||||
/** @var HtmlElement Table body for dictionary fields */
|
||||
private $dictionaryBody;
|
||||
|
||||
/**
|
||||
* Get a database connection to the director database
|
||||
*
|
||||
|
@ -126,7 +140,11 @@ class CustomVarRenderer extends CustomVarRendererHook
|
|||
public function renderCustomVarKey(string $key)
|
||||
{
|
||||
if (isset($this->fieldConfig[$key]['label'])) {
|
||||
return $this->fieldConfig[$key]['label'];
|
||||
return new HtmlElement(
|
||||
'span',
|
||||
Attributes::create(['title' => $this->fieldConfig[$key]['label'] . " [$key]"]),
|
||||
Text::create($this->fieldConfig[$key]['label'])
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -140,9 +158,13 @@ class CustomVarRenderer extends CustomVarRendererHook
|
|||
}
|
||||
|
||||
if (isset($this->datalistMaps[$key][$value])) {
|
||||
return $this->datalistMaps[$key][$value];
|
||||
return new HtmlElement(
|
||||
'span',
|
||||
Attributes::create(['title' => $this->datalistMaps[$key][$value] . " [$value]"]),
|
||||
Text::create($this->datalistMaps[$key][$value])
|
||||
);
|
||||
} elseif ($value !== null && in_array($key, $this->dictionaryNames)) {
|
||||
return $this->renderDictionaryVal((array) $value);
|
||||
return $this->renderDictionaryVal($key, (array) $value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,25 +181,151 @@ class CustomVarRenderer extends CustomVarRendererHook
|
|||
}
|
||||
|
||||
/**
|
||||
* Render the value of the dictionary
|
||||
* Render the dictionary value
|
||||
*
|
||||
* @param string $key
|
||||
* @param array $value
|
||||
*
|
||||
* @return array
|
||||
* @return ?ValidHtml
|
||||
*/
|
||||
protected function renderDictionaryVal(array $value): array
|
||||
protected function renderDictionaryVal(string $key, array $value): ?ValidHtml
|
||||
{
|
||||
$newValue = [];
|
||||
if ($this->dictionaryLevel > 0) {
|
||||
$numItems = count($value);
|
||||
$label = $this->renderCustomVarKey($key) ?? $key;
|
||||
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml($label)),
|
||||
new HtmlElement(
|
||||
'td',
|
||||
null,
|
||||
Text::create(sprintf(tp('%d item', '%d items', $numItems), $numItems))
|
||||
)
|
||||
)
|
||||
);
|
||||
} else {
|
||||
$this->dictionaryTable = new HtmlElement(
|
||||
'table',
|
||||
Attributes::create(['class' => ['custom-var-table', 'name-value-table']])
|
||||
);
|
||||
|
||||
$this->dictionaryBody = new HtmlElement('tbody');
|
||||
}
|
||||
|
||||
$this->dictionaryLevel++;
|
||||
|
||||
foreach ($value as $key => $val) {
|
||||
if (is_array($val)) {
|
||||
foreach ($val as $subKey => $subVal) {
|
||||
$label = $this->renderCustomVarKey($subKey) ?? $subKey;
|
||||
$subVal = $this->renderCustomVarValue($subKey, $subVal) ?? $subVal;
|
||||
$newValue[$key][$label] = $subVal;
|
||||
if ($key !== null && is_array($val) || is_object($val)) {
|
||||
$val = (array) $val;
|
||||
$numChildItems = count($val);
|
||||
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml($key)),
|
||||
new HtmlElement(
|
||||
'td',
|
||||
null,
|
||||
Text::create(sprintf(tp('%d item', '%d items', $numChildItems), $numChildItems))
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$this->dictionaryLevel++;
|
||||
foreach ($val as $childKey => $childVal) {
|
||||
$childVal = $this->renderCustomVarValue($childKey, $childVal) ?? $childVal;
|
||||
if (! in_array($childKey, $this->dictionaryNames)) {
|
||||
$label = $this->renderCustomVarKey($childKey) ?? $childKey;
|
||||
|
||||
if (is_array($childVal)) {
|
||||
$this->renderArrayVal($label, $childVal);
|
||||
} else {
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml(
|
||||
$label
|
||||
)),
|
||||
new HtmlElement('td', null, Html::wantHtml($childVal))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->dictionaryLevel--;
|
||||
} elseif (is_array($val)) {
|
||||
$this->renderArrayVal($key, $val);
|
||||
} else {
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml($key)),
|
||||
new HtmlElement('td', null, Html::wantHtml($val))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $newValue;
|
||||
$this->dictionaryLevel--;
|
||||
|
||||
if ($this->dictionaryLevel === 0) {
|
||||
return $this->dictionaryTable->addHtml($this->dictionaryBody);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render an array
|
||||
*
|
||||
* @param HtmlElement|string $name
|
||||
* @param array $array
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function renderArrayVal($name, array $array)
|
||||
{
|
||||
$numItems = count($array);
|
||||
|
||||
if ($name instanceof HtmlElement) {
|
||||
$name->addHtml(Text::create(' (Array)'));
|
||||
} else {
|
||||
$name = (new HtmlDocument())->addHtml(
|
||||
Html::wantHtml($name),
|
||||
Text::create(' (Array)')
|
||||
);
|
||||
}
|
||||
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml($name)),
|
||||
new HtmlElement('td', null, Html::wantHtml(sprintf(tp('%d item', '%d items', $numItems), $numItems)))
|
||||
)
|
||||
);
|
||||
|
||||
++$this->dictionaryLevel;
|
||||
|
||||
ksort($array);
|
||||
foreach ($array as $key => $value) {
|
||||
$this->dictionaryBody->addHtml(
|
||||
new HtmlElement(
|
||||
'tr',
|
||||
Attributes::create(['class' => "level-{$this->dictionaryLevel}"]),
|
||||
new HtmlElement('th', null, Html::wantHtml("[$key]")),
|
||||
new HtmlElement('td', null, Html::wantHtml($value))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
--$this->dictionaryLevel;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue