| | <?php |
| |
|
| | namespace Kanboard\Core; |
| |
|
| | use Kanboard\Core\Filter\FormatterInterface; |
| | use Pimple\Container; |
| | use PicoDb\Table; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | class Paginator |
| | { |
| | |
| | |
| | |
| | |
| | |
| | |
| | private $container; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $total = 0; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $page = 1; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $offset = 0; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $limit = 0; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $order = ''; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $direction = 'ASC'; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $items = array(); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $query = null; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $controller = ''; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $action = ''; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $anchor = ''; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | private $params = array(); |
| |
|
| | |
| | |
| | |
| | protected $formatter = null; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function __construct(Container $container) |
| | { |
| | $this->container = $container; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setQuery(Table $query) |
| | { |
| | $this->query = $query; |
| | $this->total = $this->query->count(); |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setFormatter(FormatterInterface $formatter) |
| | { |
| | $this->formatter = $formatter; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function executeQuery() |
| | { |
| | if ($this->query !== null) { |
| |
|
| | $this->query |
| | ->offset($this->offset) |
| | ->limit($this->limit); |
| |
|
| | if (preg_match('/^[a-zA-Z0-9._]+$/', $this->order)) { |
| | $this->query->orderBy($this->order, $this->direction); |
| | } else { |
| | $this->order = ''; |
| | } |
| |
|
| | if ($this->formatter !== null) { |
| | return $this->formatter->withQuery($this->query)->format(); |
| | } else { |
| | return $this->query->findAll(); |
| | } |
| | } |
| |
|
| | return array(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setUrl($controller, $action, array $params = array(), $anchor = '') |
| | { |
| | $this->controller = $controller; |
| | $this->action = $action; |
| | $this->params = $params; |
| | $this->anchor = $anchor; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setCollection(array $items) |
| | { |
| | $this->items = $items; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getCollection() |
| | { |
| | return $this->items ?: $this->executeQuery(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setTotal($total) |
| | { |
| | $this->total = $total; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getTotal() |
| | { |
| | return $this->total; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setPage($page) |
| | { |
| | $this->page = $page; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getPage() |
| | { |
| | return $this->page; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setOrder($order) |
| | { |
| | $this->order = $order; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setDirection($direction) |
| | { |
| | $this->direction = $direction; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function setMax($limit) |
| | { |
| | $this->limit = $limit; |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getMax() |
| | { |
| | return $this->limit; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function isEmpty() |
| | { |
| | return $this->total === 0; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function calculateOnlyIf($condition) |
| | { |
| | if ($condition) { |
| | $this->calculate(); |
| | } |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function calculate() |
| | { |
| | $this->page = $this->container['request']->getIntegerParam('page', 1); |
| | $this->direction = $this->container['request']->getStringParam('direction', $this->direction); |
| | $this->order = $this->container['request']->getStringParam('order', $this->order); |
| |
|
| | if ($this->page < 1) { |
| | $this->page = 1; |
| | } |
| |
|
| | $this->offset = (int) (($this->page - 1) * $this->limit); |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getUrlParams($page, $order, $direction) |
| | { |
| | $params = array( |
| | 'page' => $page, |
| | 'order' => $order, |
| | 'direction' => $direction, |
| | ); |
| |
|
| | return array_merge($this->params, $params); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function generatePreviousLink() |
| | { |
| | $html = '<span class="pagination-previous">'; |
| |
|
| | if ($this->offset > 0) { |
| | $html .= $this->container['helper']->url->link( |
| | '← '.t('Previous'), |
| | $this->controller, |
| | $this->action, |
| | $this->getUrlParams($this->page - 1, $this->order, $this->direction), |
| | false, |
| | 'js-modal-replace', |
| | t('Previous'), |
| | false, |
| | $this->anchor |
| | ); |
| | } else { |
| | $html .= '← '.t('Previous'); |
| | } |
| |
|
| | $html .= '</span>'; |
| |
|
| | return $html; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function generateNextLink() |
| | { |
| | $html = '<span class="pagination-next">'; |
| |
|
| | if (($this->total - $this->offset) > $this->limit) { |
| | $html .= $this->container['helper']->url->link( |
| | t('Next').' →', |
| | $this->controller, |
| | $this->action, |
| | $this->getUrlParams($this->page + 1, $this->order, $this->direction), |
| | false, |
| | 'js-modal-replace', |
| | t('Next'), |
| | false, |
| | $this->anchor |
| | ); |
| | } else { |
| | $html .= t('Next').' →'; |
| | } |
| |
|
| | $html .= '</span>'; |
| |
|
| | return $html; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function generatePageShowing() |
| | { |
| | return '<span class="pagination-showing">'.t('Showing %d-%d of %d', (($this->getPage() - 1) * $this->getMax() + 1), min($this->getTotal(), $this->getPage() * $this->getMax()), $this->getTotal()).'</span>'; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function hasNothingToShow() |
| | { |
| | return $this->offset === 0 && ($this->total - $this->offset) <= $this->limit; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function toHtml() |
| | { |
| | $html = ''; |
| |
|
| | if (! $this->hasNothingToShow()) { |
| | $html .= '<div class="pagination">'; |
| | $html .= $this->generatePageShowing(); |
| | $html .= $this->generatePreviousLink(); |
| | $html .= $this->generateNextLink(); |
| | $html .= '</div>'; |
| | } |
| |
|
| | return $html; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function __toString() |
| | { |
| | return $this->toHtml(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function order($label, $column) |
| | { |
| | $prefix = ''; |
| | $direction = 'ASC'; |
| |
|
| | if ($this->order === $column) { |
| | $prefix = $this->direction === 'DESC' ? '▼ ' : '▲ '; |
| | $direction = $this->direction === 'DESC' ? 'ASC' : 'DESC'; |
| | } |
| |
|
| | return $prefix.$this->container['helper']->url->link( |
| | $label, |
| | $this->controller, |
| | $this->action, |
| | $this->getUrlParams($this->page, $column, $direction), |
| | false, |
| | 'js-modal-replace' |
| | ); |
| | } |
| | } |
| |
|