Skip to content

Commit

Permalink
Introduce a form the limiter control
Browse files Browse the repository at this point in the history
refs #5543
  • Loading branch information
lippserd committed Nov 12, 2015
1 parent 9cfa813 commit 0abbe25
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 66 deletions.
113 changes: 113 additions & 0 deletions application/forms/Control/LimiterControlForm.php
@@ -0,0 +1,113 @@
<?php
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */

namespace Icinga\Forms\Control;

use Icinga\Web\Form;

/**
* Limiter control form
*/
class LimiterControlForm extends Form
{
/**
* CSS class for the limiter control
*
* @var string
*/
const CSS_CLASS_LIMITER = 'limiter-control';

/**
* Default limit
*
* @var int
*/
const DEFAULT_LIMIT = 50;

/**
* Selectable limits
*
* @var int[]
*/
public static $limits = array(
10 => '10',
25 => '25',
50 => '50',
100 => '100',
500 => '500'
);

/**
* Default limit for this instance
*
* @var int|null
*/
protected $defaultLimit;

/**
* {@inheritdoc}
*/
public function init()
{
$this->setAttrib('class', static::CSS_CLASS_LIMITER);
}

/**
* Get the default limit
*
* @return int
*/
public function getDefaultLimit()
{
return $this->defaultLimit !== null ? $this->defaultLimit : static::DEFAULT_LIMIT;
}

/**
* Set the default limit
*
* @param int $defaultLimit
*
* @return $this
*/
public function setDefaultLimit($defaultLimit)
{
$this->defaultLimit = (int) $defaultLimit;
return $this;
}

/**
* {@inheritdoc}
*/
public function getRedirectUrl()
{
return $this->getRequest()->getUrl()->setParam('limit', $this->getElement('limit')->getValue());
}

/**
* {@inheritdoc}
*/
public function createElements(array $formData)
{
$this->addElement(
'select',
'limit',
array(
'autosubmit' => true,
'escape' => false,
'label' => '#',
'multiOptions' => static::$limits,
'value' => $this->getRequest()->getUrl()->getParam('limit', $this->getDefaultLimit())
)
);
}

/**
* Limiter control is always successful
*
* @return bool
*/
public function onSuccess()
{
return true;
}
}
75 changes: 9 additions & 66 deletions library/Icinga/Web/Widget/Limiter.php
Expand Up @@ -3,41 +3,13 @@

namespace Icinga\Web\Widget;

use Icinga\Web\Navigation\Navigation;
use Icinga\Web\Url;
use Icinga\Forms\Control\LimiterControlForm;

/**
* Limiter control
* Limiter control widget
*/
class Limiter extends AbstractWidget
{
/**
* CSS class for the limiter widget
*
* @var string
*/
const CSS_CLASS_LIMITER = 'limiter-control';

/**
* Default limit
*
* @var int
*/
const DEFAULT_LIMIT = 50;

/**
* Selectable limits
*
* @var int[]
*/
public static $limits = array(
10 => '10',
25 => '25',
50 => '50',
100 => '100',
500 => '500'
);

/**
* Default limit for this instance
*
Expand All @@ -48,11 +20,11 @@ class Limiter extends AbstractWidget
/**
* Get the default limit
*
* @return int
* @return int|null
*/
public function getDefaultLimit()
{
return $this->defaultLimit !== null ? $this->defaultLimit : static::DEFAULT_LIMIT;
return $this->defaultLimit;
}

/**
Expand All @@ -73,39 +45,10 @@ public function setDefaultLimit($defaultLimit)
*/
public function render()
{
$url = Url::fromRequest();
$activeLimit = (int) $url->getParam('limit', $this->getDefaultLimit());
$navigation = new Navigation();
$navigation->setLayout(Navigation::LAYOUT_TABS);
foreach (static::$limits as $limit => $label) {
$navigation->addItem(
'limit_' . $limit,
array(
'priority' => $limit,
'label' => $label,
'active' => $activeLimit === $limit,
'url' => $url->with(array('limit' => $limit)),
'title' => sprintf(t('Show %u rows on this page'), $limit)
)
);
}

if ($activeLimit === 0) {
$navigation->addItem(
'limit_0',
array(
'active' => true,
'label' => t('all'),
'title' => t('Show all items on this page'),
'priority' => max(array_keys(static::$limits)) + 1
)
);
}

return $navigation
->getRenderer()
->setCssClass(static::CSS_CLASS_LIMITER)
->setHeading(t('Limiter'))
->render();
$control = new LimiterControlForm();
$control
->setDefaultLimit($this->defaultLimit)
->handleRequest();
return (string)$control;
}
}

0 comments on commit 0abbe25

Please sign in to comment.