refactor(addressbook): remove factory, extract filter-chip builder, split CSS

Remove AddressBookServicesFactory — all 8 dependencies already registered
in DI container individually. Update container registrar to wire directly.
Extract 42-line filter-chip builder from index().php into
AddressBookService::buildCustomFieldChipMeta(). Split 576-line CSS file
into functional layout (76 lines) and decorative banner animation (500
lines) with separate asset registration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 12:24:06 +01:00
parent 8f6c9951c1
commit 4bf871b640
9 changed files with 330 additions and 602 deletions

View File

@@ -5,25 +5,28 @@ namespace MintyPHP\Module\AddressBook;
use MintyPHP\App\AppContainer;
use MintyPHP\App\Container\ContainerRegistrar;
use MintyPHP\Module\AddressBook\Service\AddressBookService;
use MintyPHP\Module\AddressBook\Service\AddressBookServicesFactory;
use MintyPHP\Service\CustomField\CustomFieldServicesFactory;
use MintyPHP\Service\Directory\DirectoryServicesFactory;
use MintyPHP\Service\Access\RoleService;
use MintyPHP\Service\CustomField\UserCustomFieldValueService;
use MintyPHP\Service\Org\DepartmentService;
use MintyPHP\Service\Tenant\TenantScopeService;
use MintyPHP\Service\User\UserServicesFactory;
use MintyPHP\Service\Tenant\TenantService;
use MintyPHP\Service\User\UserAccountService;
use MintyPHP\Service\User\UserAssignmentService;
use MintyPHP\Service\User\UserAvatarService;
final class AddressBookContainerRegistrar implements ContainerRegistrar
{
public function register(AppContainer $container): void
{
$container->set(AddressBookServicesFactory::class, static fn (AppContainer $c): AddressBookServicesFactory => new AddressBookServicesFactory(
$c->get(UserServicesFactory::class),
$c->get(DirectoryServicesFactory::class),
$c->get(CustomFieldServicesFactory::class),
$c->get(TenantScopeService::class)
$container->set(AddressBookService::class, static fn (AppContainer $c): AddressBookService => new AddressBookService(
$c->get(UserAccountService::class),
$c->get(UserAssignmentService::class),
$c->get(TenantService::class),
$c->get(DepartmentService::class),
$c->get(RoleService::class),
$c->get(TenantScopeService::class),
$c->get(UserCustomFieldValueService::class),
$c->get(UserAvatarService::class)
));
$container->set(AddressBookService::class, static fn (AppContainer $c): AddressBookService => $c
->get(AddressBookServicesFactory::class)
->createAddressBookService());
}
}

View File

@@ -312,6 +312,61 @@ class AddressBookService
];
}
/**
* Transform custom field filter definitions into chip metadata for the grid UI.
*
* @param list<array<string, mixed>> $definitions
* @return list<array<string, mixed>>
*/
public function buildCustomFieldChipMeta(array $definitions): array
{
$chips = [];
foreach ($definitions as $definition) {
$uuid = strtolower(trim((string) ($definition['uuid'] ?? '')));
$type = strtolower(trim((string) ($definition['type'] ?? '')));
$label = trim((string) ($definition['label'] ?? ''));
$options = is_array($definition['options'] ?? null) ? $definition['options'] : [];
if ($uuid === '' || $type === '' || $label === '') {
continue;
}
if (in_array($type, ['select', 'boolean'], true)) {
$optionMap = gridOptionMapFromItems($options);
if ($type === 'boolean') {
$optionMap = ['1' => t('Yes'), '0' => t('No')];
}
$chips[] = [
'type' => 'scalar',
'param' => 'cf_' . $uuid,
'label' => $label,
'options' => $optionMap,
];
continue;
}
if ($type === 'multiselect') {
$chips[] = [
'type' => 'multi_csv',
'param' => 'cfm_' . $uuid,
'label' => $label,
'options' => gridOptionMapFromItems($options),
];
continue;
}
if ($type === 'date') {
$chips[] = [
'type' => 'date_range',
'label' => $label,
'from_param' => 'cfd_' . $uuid . '_from',
'to_param' => 'cfd_' . $uuid . '_to',
];
}
}
return $chips;
}
private function splitCommaValues($value): array
{
return array_values(array_filter(

View File

@@ -1,41 +0,0 @@
<?php
namespace MintyPHP\Module\AddressBook\Service;
use MintyPHP\Service\CustomField\CustomFieldServicesFactory;
use MintyPHP\Service\Directory\DirectoryServicesFactory;
use MintyPHP\Service\Tenant\TenantScopeService;
use MintyPHP\Service\User\UserServicesFactory;
class AddressBookServicesFactory
{
private ?AddressBookService $addressBookService = null;
public function __construct(
private readonly UserServicesFactory $userServicesFactory,
private readonly DirectoryServicesFactory $directoryServicesFactory,
private readonly CustomFieldServicesFactory $customFieldServicesFactory,
private readonly TenantScopeService $tenantScopeService
) {
}
public function createAddressBookService(): AddressBookService
{
if ($this->addressBookService !== null) {
return $this->addressBookService;
}
$userFactory = $this->userServicesFactory;
$directoryFactory = $this->directoryServicesFactory;
return $this->addressBookService = new AddressBookService(
$userFactory->createUserAccountService(),
$userFactory->createUserAssignmentService(),
$directoryFactory->createTenantService(),
$directoryFactory->createDepartmentService(),
$directoryFactory->createRoleService(),
$this->tenantScopeService,
$this->customFieldServicesFactory->createUserCustomFieldValueService(),
$userFactory->createUserAvatarService()
);
}
}