[ 'label' => t('Address book'), 'permission' => 'address_book.view', 'count_sql' => "select count(*) from users where active = 1 and (first_name like ? escape '\\\\' or last_name like ? escape '\\\\' or email like ? escape '\\\\') {{tenantFilter}}", 'preview_sql' => "select uuid, first_name, last_name, email from users where active = 1 and (first_name like ? escape '\\\\' or last_name like ? escape '\\\\' or email like ? escape '\\\\') {{tenantFilter}} order by last_name, first_name limit ?", 'result_sql' => "select uuid, first_name, last_name, email from users where active = 1 and (first_name like ? escape '\\\\' or last_name like ? escape '\\\\' or email like ? escape '\\\\') {{tenantFilter}} order by last_name, first_name", 'tenant_filter' => 'and exists (select 1 from user_tenants ut where ut.user_id = users.id and ut.tenant_id in (???))', ], ]; } public function mapResultItem(string $resourceKey, array $row): ?array { if ($resourceKey !== 'address-book') { return null; } $title = trim(($row['first_name'] ?? '') . ' ' . ($row['last_name'] ?? '')); $subtitle = (string) ($row['email'] ?? ''); $uuid = (string) ($row['uuid'] ?? ''); if ($title === '' && $subtitle === '') { return null; } return [ 'title' => $title !== '' ? $title : $subtitle, 'subtitle' => $subtitle, 'url' => lurl('address-book/view/' . $uuid), 'icon' => 'bi-people', ]; } public function listUrl(string $resourceKey, string $encodedSearch): string { if ($resourceKey !== 'address-book') { return ''; } return lurl('address-book') . '?search=' . $encodedSearch; } }