Skip to content

Commit b6b7c82

Browse files
committed
Add package link pages for dependents and suggesters
1 parent 3a82df1 commit b6b7c82

File tree

8 files changed

+121
-17
lines changed

8 files changed

+121
-17
lines changed

src/Controller/Dashboard/DashboardPackagesController.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
namespace CodedMonkey\Dirigent\Controller\Dashboard;
44

55
use CodedMonkey\Dirigent\Attribute\IsGrantedAccess;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\Dependent;
67
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
78
use CodedMonkey\Dirigent\Doctrine\Entity\PackageFetchStrategy;
9+
use CodedMonkey\Dirigent\Doctrine\Entity\Suggester;
810
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
911
use CodedMonkey\Dirigent\EasyAdmin\PackagePaginator;
1012
use CodedMonkey\Dirigent\Form\PackageAddMirroringFormType;
@@ -74,10 +76,16 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
7476
$version = $package->getLatestVersion();
7577
}
7678

79+
$dependentCount = $this->entityManager->getRepository(Dependent::class)->count(['dependentPackageName' => $package->getName()]);
80+
$suggesterCount = $this->entityManager->getRepository(Suggester::class)->count(['suggestedPackageName' => $package->getName()]);
81+
7782
return $this->render('dashboard/packages/package_info.html.twig', [
7883
'package' => $package,
7984
'latestVersion' => $latestVersion,
8085
'version' => $version,
86+
87+
'dependentCount' => $dependentCount,
88+
'suggesterCount' => $suggesterCount,
8189
]);
8290
}
8391

@@ -96,6 +104,32 @@ public function versions(string $packageName): Response
96104
]);
97105
}
98106

107+
#[Route('/dashboard/packages/dependents/{packageName}', name: 'dashboard_packages_dependents', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
108+
#[IsGrantedAccess]
109+
public function dependents(string $packageName): Response
110+
{
111+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
112+
$dependents = $this->entityManager->getRepository(Dependent::class)->findBy(['dependentPackageName' => $package->getName()]);
113+
114+
return $this->render('dashboard/packages/package_dependents.html.twig', [
115+
'package' => $package,
116+
'dependents' => $dependents,
117+
]);
118+
}
119+
120+
#[Route('/dashboard/packages/suggesters/{packageName}', name: 'dashboard_packages_suggesters', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
121+
#[IsGrantedAccess]
122+
public function suggesters(string $packageName): Response
123+
{
124+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
125+
$suggesters = $this->entityManager->getRepository(Suggester::class)->findBy(['suggestedPackageName' => $package->getName()]);
126+
127+
return $this->render('dashboard/packages/package_suggesters.html.twig', [
128+
'package' => $package,
129+
'suggesters' => $suggesters,
130+
]);
131+
}
132+
99133
#[Route('/dashboard/packages/statistics/{packageName}', name: 'dashboard_packages_statistics', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
100134
#[IsGrantedAccess]
101135
public function statistics(string $packageName): Response
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{% extends 'dashboard/packages/package_base.html.twig' %}
2+
3+
{% block page_title %}{{ package.name }} <small>{{ 'Dependents'|trans }}</small>{% endblock %}
4+
5+
{% block page_content %}
6+
{% include 'dashboard/packages/package_header.html.twig' with {currentPage: 'dependents'} %}
7+
8+
<div class="list-group list-group-flush mb-3">
9+
{% for dependent in dependents %}
10+
{% set packageVersionInfoUrl = dashboard_path('dashboard_packages_info', {packageName: dependent.package.name}) %}
11+
<a href="{{ packageVersionInfoUrl }}" class="list-group-item">
12+
{{ dependent.package.name }}
13+
</a>
14+
{% endfor %}
15+
</div>
16+
{% endblock %}

templates/dashboard/packages/package_header.html.twig

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@
22

33
<ul class="nav nav-pills nav-justified d-grid d-md-flex gap-1 pb-3 mb-3 border-bottom">
44
<li class="nav-item">
5-
{% set packageInfoUrl = ea_url()
6-
.setRoute('dashboard_packages_info', {packageName: package.name}) %}
5+
{% set packageInfoUrl = dashboard_path('dashboard_packages_info', {packageName: package.name}) %}
76
<a {% if currentPage == 'info' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageInfoUrl }}">{{ 'Info'|trans }}</a>
87
</li>
98
<li class="nav-item">
10-
{% set packageVersionsUrl = ea_url()
11-
.setRoute('dashboard_packages_versions', {packageName: package.name}) %}
9+
{% set packageVersionsUrl = dashboard_path('dashboard_packages_versions', {packageName: package.name}) %}
1210
<a {% if currentPage == 'versions' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageVersionsUrl }}">{{ 'Versions'|trans }}</a>
1311
</li>
1412
<li class="nav-item">
15-
<span class="nav-link disabled">{{ 'Dependants'|trans }}</span>
13+
{% set packageDependentsUrl = dashboard_path('dashboard_packages_dependents', {packageName: package.name}) %}
14+
<a {% if currentPage == 'dependents' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageDependentsUrl }}">{{ 'Dependents'|trans }}</a>
1615
</li>
1716
<li class="nav-item">
18-
{% set packageVersionsUrl = ea_url()
19-
.setRoute('dashboard_packages_statistics', {packageName: package.name}) %}
20-
<a {% if currentPage == 'statistics' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageVersionsUrl }}">{{ 'Statistics'|trans }}</a>
17+
{% set packageStatisticsUrl = dashboard_path('dashboard_packages_statistics', {packageName: package.name}) %}
18+
<a {% if currentPage == 'statistics' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageStatisticsUrl }}">{{ 'Statistics'|trans }}</a>
2119
</li>
2220
</ul>

templates/dashboard/packages/package_info.html.twig

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
<div><a href="{{ version.source.url }}">Source</a></div>
4646
{% endif %}
4747
<div>Installs: {{ package.installations.total }}</div>
48+
{% set packageDependentsUrl = dashboard_path('dashboard_packages_dependents', {packageName: package.name}) %}
49+
<div><a href="{{ packageDependentsUrl }}">{{ 'Dependents'|trans }}</a>: {{ dependentCount }}</div>
50+
{% set packageSuggestersUrl = dashboard_path('dashboard_packages_suggesters', {packageName: package.name}) %}
51+
<div><a href="{{ packageSuggestersUrl }}">{{ 'Suggesters'|trans }}</a>: {{ suggesterCount }}</div>
4852
{% if version.license %}
4953
<div>License: {{ version.license|join(', ') }}</div>
5054
{% else %}
@@ -83,10 +87,10 @@
8387

8488
<ul>
8589
{% for link in links %}
86-
{% if link.packageName is existing_package %}
87-
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.packageName}) }}">{{ link.packageName }}</a>: {{ link.packageVersion }}</li>
90+
{% if link.linkedPackageName is existing_package %}
91+
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.linkedPackageName}) }}">{{ link.linkedPackageName }}</a>: {{ link.linkedVersionConstraint }}</li>
8892
{% else %}
89-
<li>{{ link.packageName }}: {{ link.packageVersion }}</li>
93+
<li>{{ link.linkedPackageName }}: {{ link.linkedVersionConstraint }}</li>
9094
{% endif %}
9195
{% else %}
9296
<li>None</li>
@@ -101,10 +105,10 @@
101105

102106
<ul>
103107
{% for link in links %}
104-
{% if link.packageName is existing_package %}
105-
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.packageName}) }}">{{ link.packageName }}</a>: {{ link.packageVersion }}</li>
108+
{% if link.linkedPackageName is existing_package %}
109+
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.linkedPackageName}) }}">{{ link.linkedPackageName }}</a>: {{ link.linkedVersionConstraint }}</li>
106110
{% else %}
107-
<li>{{ link.packageName }}: {{ link.packageVersion }}</li>
111+
<li>{{ link.linkedPackageName }}: {{ link.linkedVersionConstraint }}</li>
108112
{% endif %}
109113
{% else %}
110114
<li>None</li>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{% extends 'dashboard/packages/package_base.html.twig' %}
2+
3+
{% block page_title %}{{ package.name }} <small>{{ 'Suggesters'|trans }}</small>{% endblock %}
4+
5+
{% block page_content %}
6+
{% include 'dashboard/packages/package_header.html.twig' %}
7+
8+
<div class="list-group list-group-flush mb-3">
9+
{% for suggester in suggesters %}
10+
{% set packageVersionInfoUrl = dashboard_path('dashboard_packages_info', {packageName: suggester.package.name}) %}
11+
<a href="{{ packageVersionInfoUrl }}" class="list-group-item">
12+
{{ suggester.package.name }}
13+
</a>
14+
{% endfor %}
15+
</div>
16+
{% endblock %}

templates/dashboard/packages/package_versions.html.twig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88
<div class="list-group list-group-flush mb-3">
99
{% for version in versions %}
10-
{% set packageVersionInfoUrl = ea_url()
11-
.setRoute('dashboard_packages_info', {packageName: package.name, packageVersion: version.version}) %}
10+
{% set packageVersionInfoUrl = dashboard_path('dashboard_packages_info', {packageName: package.name, packageVersion: version.version}) %}
1211
<a href="{{ packageVersionInfoUrl }}" class="list-group-item">
1312
<div class="d-flex justify-content-between">
1413
<span>

tests/FunctionalTests/DashboardPackagesControllerTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,42 @@
99

1010
class DashboardPackagesControllerTest extends WebTestCase
1111
{
12+
public function testDependents(): void
13+
{
14+
$client = static::createClient();
15+
16+
/** @var UserRepository $userRepository */
17+
$userRepository = $client->getContainer()->get(UserRepository::class);
18+
19+
/** @var User $user */
20+
$user = $userRepository->findOneByUsername('user');
21+
$client->loginUser($user);
22+
23+
$client->request('GET', '/?routeName=dashboard_packages_dependents&routeParams[packageName]=psr/log');
24+
25+
$this->assertResponseStatusCodeSame(200);
26+
27+
$this->assertAnySelectorTextSame('h1 small', 'Dependents');
28+
}
29+
30+
public function testSuggesters(): void
31+
{
32+
$client = static::createClient();
33+
34+
/** @var UserRepository $userRepository */
35+
$userRepository = $client->getContainer()->get(UserRepository::class);
36+
37+
/** @var User $user */
38+
$user = $userRepository->findOneByUsername('user');
39+
$client->loginUser($user);
40+
41+
$client->request('GET', '/?routeName=dashboard_packages_suggesters&routeParams[packageName]=psr/log');
42+
43+
$this->assertResponseStatusCodeSame(200);
44+
45+
$this->assertAnySelectorTextSame('h1 small', 'Suggesters');
46+
}
47+
1248
public function testStatistics(): void
1349
{
1450
$client = static::createClient();

translations/messages.en.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ Account: Account
22
Administration: Administration
33
Credits: Credits
44
Dashboard: Dashboard
5-
Dependants: Dependants
5+
Dependents: Dependents
66
Documentation: Documentation
77
Info: Info
88
Packages: Packages
99
Personal: Personal
1010
Sign out: Sign out
1111
Statistics: Statistics
12+
Suggesters: Suggesters
1213
Usage: Usage
1314

1415
Access token: Access token

0 commit comments

Comments
 (0)