FilterEditor: Support queries implementing the FilterColumns interface
refs #9029
This commit is contained in:
parent
40dd094af0
commit
41b80efa0e
|
@ -4,6 +4,7 @@
|
|||
namespace Icinga\Web\Widget;
|
||||
|
||||
use Icinga\Data\Filterable;
|
||||
use Icinga\Data\FilterColumns;
|
||||
use Icinga\Data\Filter\Filter;
|
||||
use Icinga\Data\Filter\FilterExpression;
|
||||
use Icinga\Data\Filter\FilterChain;
|
||||
|
@ -232,19 +233,25 @@ class FilterEditor extends AbstractWidget
|
|||
if (strpos($search, '=') !== false) {
|
||||
list($k, $v) = preg_split('/=/', $search);
|
||||
$filter = $this->mergeRootExpression($filter, trim($k), '=', ltrim($v));
|
||||
} elseif (! empty($this->searchColumns)) {
|
||||
if (! $this->resetSearchColumns($filter)) {
|
||||
$filter = Filter::matchAll();
|
||||
}
|
||||
$filters = array();
|
||||
$search = ltrim($search);
|
||||
foreach ($this->searchColumns as $searchColumn) {
|
||||
$filters[] = Filter::expression($searchColumn, '=', "*$search*");
|
||||
}
|
||||
$filter = $filter->andFilter(new FilterOr($filters));
|
||||
} else {
|
||||
Notification::error(mt('monitoring', 'Cannot search here'));
|
||||
return $this;
|
||||
if ($this->searchColumns === null && $this->query instanceof FilterColumns) {
|
||||
$this->searchColumns = $this->query->getSearchColumns();
|
||||
}
|
||||
|
||||
if (! empty($this->searchColumns)) {
|
||||
if (! $this->resetSearchColumns($filter)) {
|
||||
$filter = Filter::matchAll();
|
||||
}
|
||||
$filters = array();
|
||||
$search = ltrim($search);
|
||||
foreach ($this->searchColumns as $searchColumn) {
|
||||
$filters[] = Filter::expression($searchColumn, '=', "*$search*");
|
||||
}
|
||||
$filter = $filter->andFilter(new FilterOr($filters));
|
||||
} else {
|
||||
Notification::error(mt('monitoring', 'Cannot search here'));
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
$url = $this->url()->setQueryString(
|
||||
|
@ -500,12 +507,14 @@ class FilterEditor extends AbstractWidget
|
|||
);
|
||||
}
|
||||
|
||||
protected function arrayForSelect($array)
|
||||
protected function arrayForSelect($array, $flip = false)
|
||||
{
|
||||
$res = array();
|
||||
foreach ($array as $k => $v) {
|
||||
if (is_int($k)) {
|
||||
$res[$v] = $v;
|
||||
$res[str_replace('_', ' ', ucfirst($v))] = $v;
|
||||
} elseif ($flip) {
|
||||
$res[$v] = $k;
|
||||
} else {
|
||||
$res[$k] = $v;
|
||||
}
|
||||
|
@ -576,20 +585,15 @@ class FilterEditor extends AbstractWidget
|
|||
);
|
||||
}
|
||||
|
||||
if ($this->cachedColumnSelect === null) {
|
||||
$this->cachedColumnSelect = $this->arrayForSelect($this->query->getColumns());
|
||||
if ($this->cachedColumnSelect === null && $this->query instanceof FilterColumns) {
|
||||
$this->cachedColumnSelect = $this->arrayForSelect($this->query->getFilterColumns(), true);
|
||||
asort($this->cachedColumnSelect);
|
||||
}
|
||||
$cols = $this->cachedColumnSelect;
|
||||
$seen = false;
|
||||
foreach ($cols as $k => & $v) {
|
||||
$v = str_replace('_', ' ', ucfirst($v));
|
||||
if ($k === $active) {
|
||||
$seen = true;
|
||||
}
|
||||
} elseif ($this->cachedColumnSelect === null) {
|
||||
throw new ProgrammingError('No columns set nor does the query provide any');
|
||||
}
|
||||
|
||||
if (!$seen) {
|
||||
$cols = $this->cachedColumnSelect;
|
||||
if (! isset($cols[$active])) {
|
||||
$cols[$active] = str_replace('_', ' ', ucfirst(ltrim($active, '_')));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue