Skip to content

Commit

Permalink
Add support of "priority" attribute in service tag definitions
Browse files Browse the repository at this point in the history
  • Loading branch information
tamcy authored and VincentLanglet committed Oct 20, 2022
1 parent 758b185 commit 3597a93
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,14 @@ public function process(ContainerBuilder $container): void
];
}

$groupDefaults[$resolvedGroupName]['priority'] = max($groupDefaults[$resolvedGroupName]['priority'] ?? 0, $attributes['priority'] ?? 0);
$groupDefaults[$resolvedGroupName]['items'][] = [
'admin' => $code,
'label' => $attributes['label'] ?? '', // NEXT_MAJOR: Remove this line.
'route' => '', // NEXT_MAJOR: Remove this line.
'route_params' => [],
'route_absolute' => false,
'priority' => $attributes['priority'] ?? 0,
];

if (isset($groupDefaults[$resolvedGroupName]['on_top']) && $groupDefaults[$resolvedGroupName]['on_top']
Expand All @@ -215,6 +217,8 @@ public function process(ContainerBuilder $container): void
$sortAdmins = $container->getParameter('sonata.admin.configuration.sort_admins');
\assert(\is_bool($sortAdmins));

$sortAdminsByPriority = true;

if ([] !== $dashboardGroupsSettings) {
$groups = $dashboardGroupsSettings;

Expand All @@ -237,6 +241,8 @@ public function process(ContainerBuilder $container): void

if (!isset($group['items']) || [] === $group['items']) {
$groups[$resolvedGroupName]['items'] = $groupDefaults[$resolvedGroupName]['items'];
} else {
$sortAdminsByPriority = false;
}

if (!isset($group['label']) || '' === $group['label']) {
Expand Down Expand Up @@ -299,8 +305,23 @@ static function (array $a, array $b): int {
*/
ksort($groups);
array_walk($groups, $elementSort);

$sortAdminsByPriority = false;
} else {
$groups = $groupDefaults;

uasort($groups, static fn (array $a, array $b): int => ($b['priority'] ?? 0) <=> ($a['priority'] ?? 0));
}

if ($sortAdminsByPriority) {
$elementSort = static function (array &$element): void {
usort(
$element['items'],
static fn (array $a, array $b): int => ($b['priority'] ?? 0) <=> ($a['priority'] ?? 0)
);
};

array_walk($groups, $elementSort);
}

$pool->replaceArgument(0, ServiceLocatorTagPass::register($container, $adminServices));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,77 @@ public function testMultipleDefaultAdmin(): void
$this->compile();
}

public function testProcessAdminItemPriorityDefinition(): void
{
$this->setUpContainer();

foreach ($this->container->findTaggedServiceIds('sonata.admin') as $id => $_) {
$this->container->removeDefinition($id);
}

$config = $this->getConfig();
$config['dashboard']['groups'] = [];

$this->extension->load([$config], $this->container);

$priorities = [200, 100, 450, 3000, 620, 330];
foreach ($priorities as $priority) {
$this->container
->register('sonata_admin_'.$priority)
->setPublic(true)
->setClass(CustomAdmin::class)
->addTag('sonata.admin', ['model_class' => NewsEntity::class, 'controller' => 'sonata.admin.controller.crud', 'group' => 'sonata_group_priority_1', 'label' => 'Entry', 'manager_type' => 'orm', 'priority' => $priority]);
}

$this->compile();

rsort($priorities);
$adminGroups = $this->container->findDefinition('sonata.admin.pool')->getArgument(2);
static::assertCount(\count($priorities), $adminGroups['sonata_group_priority_1']['items']);
foreach ($adminGroups['sonata_group_priority_1']['items'] as $item) {
$priority = array_shift($priorities);
static::assertSame('sonata_admin_'.$priority, $item['admin']);
}
}

public function testGroupOrderingWithAdminItemPriorityDefinition(): void
{
$this->setUpContainer();

foreach ($this->container->findTaggedServiceIds('sonata.admin') as $id => $_) {
$this->container->removeDefinition($id);
}

$config = $this->getConfig();
$config['dashboard']['groups'] = [];

$this->extension->load([$config], $this->container);

$this->container
->register('sonata_admin_1')
->setPublic(true)
->setClass(CustomAdmin::class)
->addTag('sonata.admin', ['model_class' => NewsEntity::class, 'controller' => 'sonata.admin.controller.crud', 'group' => 'sonata_group_priority_1', 'label' => 'Entry', 'manager_type' => 'orm', 'priority' => 1000]);

$this->container
->register('sonata_admin_2')
->setPublic(true)
->setClass(CustomAdmin::class)
->addTag('sonata.admin', ['model_class' => NewsEntity::class, 'controller' => 'sonata.admin.controller.crud', 'group' => 'sonata_group_priority_3', 'label' => 'Entry', 'manager_type' => 'orm', 'priority' => 3000]);

$this->container
->register('sonata_admin_3')
->setPublic(true)
->setClass(CustomAdmin::class)
->addTag('sonata.admin', ['model_class' => NewsEntity::class, 'controller' => 'sonata.admin.controller.crud', 'group' => 'sonata_group_priority_2', 'label' => 'Entry', 'manager_type' => 'orm', 'priority' => 4000]);

$this->compile();

$adminGroups = $this->container->findDefinition('sonata.admin.pool')->getArgument(2);
static::assertCount(3, $adminGroups);
static::assertSame(['sonata_group_priority_2', 'sonata_group_priority_3', 'sonata_group_priority_1'], array_keys($adminGroups));
}

public function testAdminCodeShouldBeInjectedToPool(): void
{
$this->setUpContainer();
Expand Down

0 comments on commit 3597a93

Please sign in to comment.