Introduce class `Icinga\Web\Widget\SingleValueSearchControl`
This commit is contained in:
parent
fe7879c68b
commit
42bdbe38b1
|
@ -0,0 +1,140 @@
|
||||||
|
<?php
|
||||||
|
/* Icinga Web 2 | (c) 2021 Icinga GmbH | GPLv2+ */
|
||||||
|
|
||||||
|
namespace Icinga\Web\Widget;
|
||||||
|
|
||||||
|
use Icinga\Application\Icinga;
|
||||||
|
use ipl\Html\Form;
|
||||||
|
use ipl\Html\FormElement\InputElement;
|
||||||
|
use ipl\Html\HtmlElement;
|
||||||
|
use ipl\Web\Url;
|
||||||
|
|
||||||
|
class SingleValueSearchControl extends Form
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
const DEFAULT_SEARCH_PARAMETER = 'q';
|
||||||
|
|
||||||
|
protected $defaultAttributes = ['class' => 'icinga-controls inline'];
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $searchParameter = self::DEFAULT_SEARCH_PARAMETER;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $inputLabel;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $submitLabel;
|
||||||
|
|
||||||
|
/** @var Url */
|
||||||
|
protected $suggestionUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the search parameter to use
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setSearchParameter($name)
|
||||||
|
{
|
||||||
|
$this->searchParameter = $name;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the input's label
|
||||||
|
*
|
||||||
|
* @param string $label
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setInputLabel($label)
|
||||||
|
{
|
||||||
|
$this->inputLabel = $label;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the submit button's label
|
||||||
|
*
|
||||||
|
* @param string $label
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setSubmitLabel($label)
|
||||||
|
{
|
||||||
|
$this->submitLabel = $label;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the suggestion url
|
||||||
|
*
|
||||||
|
* @param Url $url
|
||||||
|
*
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function setSuggestionUrl(Url $url)
|
||||||
|
{
|
||||||
|
$this->suggestionUrl = $url;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assemble()
|
||||||
|
{
|
||||||
|
$suggestionsId = Icinga::app()->getRequest()->protectId('single-value-suggestions');
|
||||||
|
|
||||||
|
$this->addElement(
|
||||||
|
'text',
|
||||||
|
$this->searchParameter,
|
||||||
|
[
|
||||||
|
'required' => true,
|
||||||
|
'minlength' => 1,
|
||||||
|
'autocomplete' => 'off',
|
||||||
|
'data-enrichment-type' => 'completion',
|
||||||
|
'data-term-suggestions' => '#' . $suggestionsId,
|
||||||
|
'data-suggest-url' => $this->suggestionUrl,
|
||||||
|
'placeholder' => $this->inputLabel
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->addElement(
|
||||||
|
'submit',
|
||||||
|
'btn_sumit',
|
||||||
|
[
|
||||||
|
'label' => $this->submitLabel,
|
||||||
|
'class' => 'btn-primary'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->add(new HtmlElement('div', [
|
||||||
|
'id' => $suggestionsId,
|
||||||
|
'class' => 'search-suggestions'
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a list of search suggestions
|
||||||
|
*
|
||||||
|
* @param array $values
|
||||||
|
*
|
||||||
|
* @return HtmlElement
|
||||||
|
*/
|
||||||
|
public static function createSuggestions(array $values)
|
||||||
|
{
|
||||||
|
$ul = new HtmlElement('ul');
|
||||||
|
|
||||||
|
foreach ($values as $value) {
|
||||||
|
$ul->add(new HtmlElement('li', null, new InputElement(null, [
|
||||||
|
'value' => $value,
|
||||||
|
'type' => 'button',
|
||||||
|
'tabindex' => -1
|
||||||
|
])));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ul;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue