'object-grid', 'data-base-target' => '_next' ]; protected $tag = 'ul'; /** @var ItemRenderer */ protected $itemRenderer; /** @var ResultSet|iterable */ protected $data; /** @var ?ValidHtml Message to show if the list is empty */ protected $emptyStateMessage; /** * Create a new object grid * * @param ResultSet|iterable $data * @param ItemRenderer $renderer */ public function __construct($data, ItemRenderer $renderer) { if (! is_iterable($data)) { throw new InvalidArgumentException('Data must be an array or an instance of Traversable'); } $this->data = $data; $this->itemRenderer = $renderer; $this->initializeDetailActions(); } /** * Get message to show if the list is empty * * @return ValidHtml */ public function getEmptyStateMessage(): ValidHtml { if ($this->emptyStateMessage === null) { return new Text($this->translate('No items found.')); } return $this->emptyStateMessage; } /** * Set message to show if the list is empty * * @param mixed $message If empty, the default message is used * * @return $this */ public function setEmptyStateMessage($message): self { if (empty($message)) { $this->emptyStateMessage = null; } else { $this->emptyStateMessage = Html::wantHtml($message); } return $this; } /** * Create a list item for the given data * * @param Item $data * * @return ValidHtml * * @throws NotImplementedError When the data is not of the expected type */ protected function createListItem(object $data): ValidHtml { $layout = new ItemLayout($data, $this->itemRenderer); $item = new HtmlElement('li', $layout->getAttributes(), $layout); if ($this->getDetailActionsDisabled()) { return $item; } switch (true) { case $data instanceof Hostgroupsummary: $this->setDetailUrl(Url::fromPath('icingadb/hostgroup')); break; case $data instanceof ServicegroupSummary: $this->setDetailUrl(Url::fromPath('icingadb/servicegroup')); break; default: throw new NotImplementedError('Not implemented'); } $this->addDetailFilterAttribute($item, Filter::equal('name', $data->name)); return $item; } protected function assemble(): void { /** @var Item $data */ foreach ($this->data as $data) { $this->addHtml($this->createListItem($data)); } if ($this->isEmpty()) { $this->setTag('div'); $this->addHtml(new EmptyStateBar($this->getEmptyStateMessage())); } } }