Skip to content

Commit 3f3cd52

Browse files
authored
Merge pull request #281 from dotkernel/issue-280
Issue #280: Admin logins page as bootstrap (simple) table.
2 parents 821facb + 3d9f41d commit 3f3cd52

File tree

15 files changed

+956
-20
lines changed

15 files changed

+956
-20
lines changed

src/Admin/src/ConfigProvider.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Admin\Admin\Form\AdminForm;
1515
use Admin\Admin\Form\ChangePasswordForm;
1616
use Admin\Admin\Form\LoginForm;
17+
use Admin\Admin\Repository\AdminLoginRepository;
1718
use Admin\Admin\Repository\AdminRepository;
1819
use Admin\Admin\Repository\AdminRoleRepository;
1920
use Admin\Admin\Service\AdminService;
@@ -53,6 +54,7 @@ public function getDependencies(): array
5354
AdminService::class => AttributedServiceFactory::class,
5455
AdminRepository::class => AttributedRepositoryFactory::class,
5556
AdminRoleRepository::class => AttributedRepositoryFactory::class,
57+
AdminLoginRepository::class => AttributedRepositoryFactory::class,
5658
AdminForm::class => ElementFactory::class,
5759
AuthenticationService::class => AuthenticationServiceFactory::class,
5860
AuthenticationAdapter::class => AttributedServiceFactory::class,

src/Admin/src/Controller/AdminController.php

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
use Admin\App\Common\ServerRequestAwareTrait;
2020
use Admin\App\Exception\IdentityException;
2121
use Admin\App\Message;
22+
use Admin\App\Pagination;
2223
use Admin\App\Plugin\FormsPlugin;
24+
use Admin\Setting\Entity\Setting;
25+
use Admin\Setting\Service\SettingService;
2326
use Doctrine\ORM\NonUniqueResultException;
2427
use Dot\Controller\AbstractActionController;
2528
use Dot\DependencyInjection\Attribute\Inject;
@@ -52,7 +55,8 @@ class AdminController extends AbstractActionController
5255
FlashMessengerInterface::class,
5356
FormsPlugin::class,
5457
AdminForm::class,
55-
"dot-log.default_logger"
58+
SettingService::class,
59+
"dot-log.default_logger",
5660
)]
5761
public function __construct(
5862
protected AdminServiceInterface $adminService,
@@ -62,7 +66,8 @@ public function __construct(
6266
protected FlashMessengerInterface $messenger,
6367
protected FormsPlugin $forms,
6468
protected AdminForm $adminForm,
65-
protected Logger $logger
69+
protected SettingService $settingService,
70+
protected Logger $logger,
6671
) {
6772
}
6873

@@ -409,6 +414,48 @@ public function listLoginsAction(): ResponseInterface
409414
return new JsonResponse($result);
410415
}
411416

417+
public function simpleLoginsAction(): ResponseInterface
418+
{
419+
$params = [
420+
'offset' => $this->getQueryParam('offset', 0, 'int'),
421+
'limit' => $this->getQueryParam('limit', 10, 'int'),
422+
'sort' => $this->getQueryParam('sort', 'created'),
423+
'order' => $this->getQueryParam('order', 'desc'),
424+
'identity' => $this->getQueryParam('identity'),
425+
'status' => $this->getQueryParam('status'),
426+
];
427+
428+
$logins = $this->adminService->getAdminLogins(
429+
$params['offset'],
430+
$params['limit'],
431+
$params['sort'],
432+
$params['order'],
433+
[
434+
'identity' => $params['identity'],
435+
'status' => $params['status'],
436+
]
437+
);
438+
439+
$settings = $this->settingService->findOneBy([
440+
'admin' => $this->adminService->getAdminRepository()->findOneBy([
441+
'identity' => $this->authenticationService->getIdentity()->getIdentity(),
442+
]),
443+
'identifier' => Setting::IDENTIFIER_TABLE_ADMIN_LIST_LOGINS_SELECTED_COLUMNS,
444+
]);
445+
446+
return new HtmlResponse(
447+
$this->template->render('admin::simple-logins', [
448+
'params' => $params,
449+
'logins' => $logins['rows'],
450+
'settings' => $settings?->getValue() ?? [],
451+
'statuses' => [AdminLogin::LOGIN_FAIL, AdminLogin::LOGIN_SUCCESS],
452+
'identities' => $this->adminService->getAdminLoginIdentities(),
453+
'identifier' => Setting::IDENTIFIER_TABLE_ADMIN_LIST_LOGINS_SELECTED_COLUMNS,
454+
'pagination' => new Pagination($logins['total'], $params['offset'], $params['limit']),
455+
])
456+
);
457+
}
458+
412459
private function logErrors(Throwable $e, string $message): void
413460
{
414461
$this->logger->err($message, [

src/Admin/src/Repository/AdminLoginRepository.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,19 @@
88
use Admin\App\Repository\AbstractRepository;
99
use Dot\DependencyInjection\Attribute\Entity;
1010

11+
use function array_column;
12+
1113
#[Entity(AdminLogin::class)]
1214
class AdminLoginRepository extends AbstractRepository
1315
{
16+
public function getAdminLoginIdentities(): array
17+
{
18+
$results = $this->getQueryBuilder()
19+
->select('DISTINCT adminLogin.identity')
20+
->from(AdminLogin::class, 'adminLogin')
21+
->orderBy('adminLogin.identity', 'ASC')
22+
->getQuery()->getResult();
23+
24+
return array_column($results, 'identity');
25+
}
1426
}

src/Admin/src/Repository/AdminRepository.php

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,24 @@ public function getAdminLogins(
8383
int $offset = 0,
8484
int $limit = 30,
8585
string $sort = 'created',
86-
string $order = 'desc'
86+
string $order = 'desc',
87+
array $filters = []
8788
): array {
88-
return $this->getQueryBuilder()
89+
$qb = $this->getQueryBuilder()
8990
->select('adminLogin')
90-
->from(AdminLogin::class, 'adminLogin')
91+
->from(AdminLogin::class, 'adminLogin');
92+
93+
if (! empty($filters['identity'])) {
94+
$qb->andWhere($qb->expr()->like('adminLogin.identity', ':identity'))
95+
->setParameter('identity', $filters['identity']);
96+
}
97+
98+
if (! empty($filters['status'])) {
99+
$qb->andWhere($qb->expr()->like('adminLogin.loginStatus', ':status'))
100+
->setParameter('status', $filters['status']);
101+
}
102+
103+
return $qb
91104
->setFirstResult($offset)
92105
->setMaxResults($limit)
93106
->setCacheable(true)
@@ -129,11 +142,23 @@ protected function countAllAdmins(): mixed
129142
/**
130143
* @throws NonUniqueResultException
131144
*/
132-
public function countAdminLogins(): mixed
145+
public function countAdminLogins(array $filters = []): mixed
133146
{
134-
return $this->getQueryBuilder()
147+
$qb = $this->getQueryBuilder()
135148
->select('count(adminLogin)')
136-
->from(AdminLogin::class, 'adminLogin')
149+
->from(AdminLogin::class, 'adminLogin');
150+
151+
if (! empty($filters['identity'])) {
152+
$qb->andWhere($qb->expr()->like('adminLogin.identity', ':identity'))
153+
->setParameter('identity', $filters['identity']);
154+
}
155+
156+
if (! empty($filters['status'])) {
157+
$qb->andWhere($qb->expr()->like('adminLogin.loginStatus', ':status'))
158+
->setParameter('status', $filters['status']);
159+
}
160+
161+
return $qb
137162
->getQuery()
138163
->getSingleScalarResult();
139164
}

src/Admin/src/Service/AdminService.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Admin\Admin\Entity\Admin;
88
use Admin\Admin\Entity\AdminLogin;
99
use Admin\Admin\Entity\AdminRole;
10+
use Admin\Admin\Repository\AdminLoginRepository;
1011
use Admin\Admin\Repository\AdminRepository;
1112
use Admin\Admin\Repository\AdminRoleRepository;
1213
use Admin\App\Exception\IdentityException;
@@ -29,11 +30,13 @@ class AdminService implements AdminServiceInterface
2930
LocationServiceInterface::class,
3031
AdminRepository::class,
3132
AdminRoleRepository::class,
33+
AdminLoginRepository::class,
3234
)]
3335
public function __construct(
3436
protected LocationServiceInterface $locationService,
3537
protected AdminRepository $adminRepository,
3638
protected AdminRoleRepository $adminRoleRepository,
39+
protected AdminLoginRepository $adminLoginRepository,
3740
) {
3841
}
3942

@@ -92,14 +95,15 @@ public function getAdminLogins(
9295
int $offset = 0,
9396
int $limit = 30,
9497
string $sort = 'created',
95-
string $order = 'desc'
98+
string $order = 'desc',
99+
array $filters = []
96100
): array {
97101
$result = [
98102
'rows' => [],
99-
'total' => $this->getAdminRepository()->countAdminLogins(),
103+
'total' => $this->getAdminRepository()->countAdminLogins($filters),
100104
];
101105

102-
$logins = $this->getAdminRepository()->getAdminLogins($offset, $limit, $sort, $order);
106+
$logins = $this->getAdminRepository()->getAdminLogins($offset, $limit, $sort, $order, $filters);
103107
foreach ($logins as $login) {
104108
$result['rows'][] = [
105109
'uuid' => $login->getUuid()->toString(),
@@ -127,6 +131,11 @@ public function getAdminLogins(
127131
return $result;
128132
}
129133

134+
public function getAdminLoginIdentities(): array
135+
{
136+
return $this->adminLoginRepository->getAdminLoginIdentities();
137+
}
138+
130139
public function createAdmin(array $data): Admin
131140
{
132141
if ($this->exists($data['identity'])) {

src/Admin/src/Service/AdminServiceInterface.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ public function getAdminLogins(
3535
int $offset = 0,
3636
int $limit = 30,
3737
string $sort = 'created',
38-
string $order = 'desc'
38+
string $order = 'desc',
39+
array $filters = []
3940
): array;
4041

42+
public function getAdminLoginIdentities(): array;
43+
4144
/**
4245
* @throws NonUniqueResultException
4346
* @throws ORMException

0 commit comments

Comments
 (0)