diff --git a/library/Icingadb/Common/LoadMore.php b/library/Icingadb/Common/LoadMore.php new file mode 100644 index 00000000..e585e1d8 --- /dev/null +++ b/library/Icingadb/Common/LoadMore.php @@ -0,0 +1,95 @@ +pageSize = $size; + + return $this; + } + + /** + * Set the page number + * + * @param int $number + * + * @return $this + */ + public function setPageNumber($number) + { + $this->pageNumber = $number; + + return $this; + } + + /** + * Set the page number + * + * @param Url $url + * + * @return $this + */ + public function setLoadMoreUrl(Url $url) + { + $this->loadMoreUrl = $url; + + return $this; + } + + protected function getIterator($result) + { + $count = 0; + $pageNumber = $this->pageNumber ?: 1; + + $showMore = (new ShowMore( + $result, + $this->loadMoreUrl->setParam('page', $pageNumber + 1) + ->setAnchor('page-' . ($pageNumber + 1)) + )) + ->setLabel(t('Load More')) + ->setAttribute('data-no-icinga-ajax', true); + + if ($pageNumber > 1) { + $this->add(new PageSeparatorItem($pageNumber)); + } + + foreach ($result as $data) { + $count++; + + if ($count % $this->pageSize === 0) { + $pageNumber++; + } elseif ($count > $this->pageSize && $count % $this->pageSize === 1) { + $this->add(new PageSeparatorItem($pageNumber)); + } + + yield $data; + } + + $this->add($showMore->setTag('li')->addAttributes(['class' => 'list-item'])); + } +}