Fix sort roles by name (#5285)

fixes #4789
This commit is contained in:
Johannes Meyer 2024-11-05 09:19:04 +01:00 committed by GitHub
commit 9f6450999d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 50 additions and 20 deletions

View File

@ -25,8 +25,6 @@ use ipl\Web\Widget\Link;
/**
* Manage user permissions and restrictions based on roles
*
* @TODO(el): Rename to RolesController: https://dev.icinga.com/issues/10015
*/
class RoleController extends AuthBackendController
{
@ -53,8 +51,6 @@ class RoleController extends AuthBackendController
/**
* List roles
*
* @TODO(el): Rename to indexAction()
*/
public function listAction()
{
@ -63,22 +59,25 @@ class RoleController extends AuthBackendController
->select();
$sortAndFilterColumns = [
'name' => $this->translate('Name'),
'users' => $this->translate('Users'),
'groups' => $this->translate('Groups'),
'permissions' => $this->translate('Permissions')
'name' => $this->translate('Name'),
'users' => $this->translate('Users'),
'groups' => $this->translate('Groups'),
'parent' => $this->translate('Inherits From')
];
$this->setupFilterControl($this->view->roles, $sortAndFilterColumns, ['name']);
$this->setupFilterControl(
$this->view->roles,
$sortAndFilterColumns + [
'permissions' => $this->translate('Permissions')
]
);
$this->setupLimitControl();
$this->setupPaginationControl($this->view->roles);
$this->setupSortControl($sortAndFilterColumns, $this->view->roles, ['name']);
$this->setupSortControl($sortAndFilterColumns, $this->view->roles);
}
/**
* Create a new role
*
* @TODO(el): Rename to newAction()
*/
public function addAction()
{
@ -93,8 +92,6 @@ class RoleController extends AuthBackendController
/**
* Update a role
*
* @TODO(el): Rename to updateAction()
*/
public function editAction()
{

View File

@ -8,6 +8,8 @@ use Icinga\Repository\IniRepository;
class RolesConfig extends IniRepository
{
protected $sortRules = ['name' => ['order' => 'asc']];
protected $configs = [
'roles' => [
'name' => 'roles',

View File

@ -196,7 +196,16 @@ class ArrayDatasource implements Selectable
$filter = $query->getFilter();
$offset = $query->hasOffset() ? $query->getOffset() : 0;
$limit = $query->hasLimit() ? $query->getLimit() : 0;
$data = $this->data;
$data = [];
foreach ($this->data as $key => $row) {
if ($this->keyColumn !== null && ! isset($row->{$this->keyColumn})) {
$row = clone $row; // Make sure that this won't affect the actual data
$row->{$this->keyColumn} = $key;
}
$data[$key] = $row;
}
if ($query->hasOrder()) {
uasort($data, [$query, 'compare']);
@ -206,11 +215,6 @@ class ArrayDatasource implements Selectable
$result = [];
$skipped = 0;
foreach ($data as $key => $row) {
if ($this->keyColumn !== null && !isset($row->{$this->keyColumn})) {
$row = clone $row; // Make sure that this won't affect the actual data
$row->{$this->keyColumn} = $key;
}
if (! $filter->matches($row)) {
continue;
} elseif ($skipped < $offset) {

View File

@ -132,4 +132,31 @@ class ArrayDatasourceTest extends BaseTestCase
'ArrayDatasource does not sort limited queries correctly'
);
}
public function testOrderByKeyColumnIsCorrect()
{
$result = (new ArrayDatasource([
'a' => (object) [
'foo' => 'bar',
'baz' => 'qux'
],
'b' => (object) [
'foo' => 'bar',
'baz' => 'qux'
],
'c' => (object) [
'foo' => 'bar',
'baz' => 'qux'
]
]))->setKeyColumn('name')
->select()
->order('name', 'desc')
->fetchAll();
$this->assertSame(
['c', 'b', 'a'],
array_keys($result),
'ArrayDatasource does not sort queries correctly by key column'
);
}
}