Skip to content

Commit 0ed7eb4

Browse files
committed
Add package link pages for providers and implementations
1 parent 27937bc commit 0ed7eb4

File tree

6 files changed

+95
-7
lines changed

6 files changed

+95
-7
lines changed

src/Controller/Dashboard/DashboardPackagesInfoController.php

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
4545
}
4646

4747
$dependentCount = $this->entityManager->getRepository(Dependent::class)->count(['dependentPackageName' => $package->getName()]);
48-
$implementationCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName() . '-implementation']);
49-
$providerCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName()]);
48+
$implementationCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName(), 'implementation' => true]);
49+
$providerCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName(), 'implementation' => false]);
5050
$suggesterCount = $this->entityManager->getRepository(Suggester::class)->count(['suggestedPackageName' => $package->getName()]);
5151

5252
return $this->render('dashboard/packages/package_info.html.twig', [
@@ -102,6 +102,60 @@ public function dependents(Request $request, string $packageName): Response
102102
]);
103103
}
104104

105+
#[Route('/dashboard/packages/implementations/{packageName}', name: 'dashboard_packages_implementations', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
106+
#[IsGrantedAccess]
107+
public function implementations(Request $request, string $packageName): Response
108+
{
109+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
110+
111+
$providerRepository = $this->entityManager->getRepository(Provider::class);
112+
$queryBuilder = $providerRepository->createQueryBuilder('provider');
113+
$queryBuilder
114+
->leftJoin('provider.package', 'package')
115+
->andWhere('provider.providedPackageName = :packageName')
116+
->andWhere('provider.implementation = true')
117+
->setParameter('packageName', $package->getName())
118+
->addOrderBy('package.name', 'ASC');
119+
120+
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
121+
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
122+
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
123+
$providers = $paginator->getResults();
124+
125+
return $this->render('dashboard/packages/package_implementations.html.twig', [
126+
'package' => $package,
127+
'providers' => $providers,
128+
'paginator' => $paginator,
129+
]);
130+
}
131+
132+
#[Route('/dashboard/packages/providers/{packageName}', name: 'dashboard_packages_providers', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
133+
#[IsGrantedAccess]
134+
public function providers(Request $request, string $packageName): Response
135+
{
136+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
137+
138+
$providerRepository = $this->entityManager->getRepository(Provider::class);
139+
$queryBuilder = $providerRepository->createQueryBuilder('provider');
140+
$queryBuilder
141+
->leftJoin('provider.package', 'package')
142+
->andWhere('provider.providedPackageName = :packageName')
143+
->andWhere('provider.implementation = false')
144+
->setParameter('packageName', $package->getName())
145+
->addOrderBy('package.name', 'ASC');
146+
147+
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
148+
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
149+
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
150+
$providers = $paginator->getResults();
151+
152+
return $this->render('dashboard/packages/package_providers.html.twig', [
153+
'package' => $package,
154+
'providers' => $providers,
155+
'paginator' => $paginator,
156+
]);
157+
}
158+
105159
#[Route('/dashboard/packages/suggesters/{packageName}', name: 'dashboard_packages_suggesters', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
106160
#[IsGrantedAccess]
107161
public function suggesters(Request $request, string $packageName): Response

src/Doctrine/Entity/ProvideLink.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,14 @@ class ProvideLink extends PackageLink
1010
#[ORM\ManyToOne(targetEntity: Version::class, inversedBy: 'provide')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Version $version;
13+
14+
public function isImplementation(): string
15+
{
16+
return str_ends_with($this->getLinkedPackageName(), '-implementation');
17+
}
18+
19+
public function getImplementedPackageName(): string
20+
{
21+
return substr($this->getLinkedPackageName(), 0, -15);
22+
}
1323
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends 'dashboard/packages/package_base.html.twig' %}
2+
3+
{% block page_title %}{{ package.name }} <small>{{ 'Implementations'|trans }}</small>{% endblock %}
4+
5+
{% block page_content %}
6+
{% include 'dashboard/packages/package_header.html.twig' with {currentPage: 'implementations'} %}
7+
8+
{% include 'dashboard/packages/_package_list.html.twig' with {packages: providers|map(provider => provider.package)} %}
9+
{% endblock %}

templates/dashboard/packages/package_info.html.twig

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@
4949
<div><a href="{{ packageDependentsUrl }}">{{ 'Dependents'|trans }}</a>: {{ dependentCount }}</div>
5050
{% set packageSuggestersUrl = dashboard_path('dashboard_packages_suggesters', {packageName: package.name}) %}
5151
<div><a href="{{ packageSuggestersUrl }}">{{ 'Suggesters'|trans }}</a>: {{ suggesterCount }}</div>
52-
<div>{{ 'Providers'|trans }}: {{ providerCount }}</div>
53-
<div>{{ 'Implementations'|trans }}: {{ implementationCount }}</div>
52+
{% set packageImplementationsUrl = dashboard_path('dashboard_packages_implementations', {packageName: package.name}) %}
53+
<div><a href="{{ packageImplementationsUrl }}">{{ 'Implementations'|trans }}</a>: {{ implementationCount }}</div>
54+
{% set packageProvidersUrl = dashboard_path('dashboard_packages_providers', {packageName: package.name}) %}
55+
<div><a href="{{ packageProvidersUrl }}">{{ 'Providers'|trans }}</a>: {{ providerCount }}</div>
5456
{% if version.license %}
5557
<div>License: {{ version.license|join(', ') }}</div>
5658
{% else %}
@@ -70,8 +72,8 @@
7072
<div class="row border-bottom pb-3 mb-3">
7173
{{ _self.linkBlock("requires", version.require) }}
7274
{{ _self.linkBlock("requires (dev)", version.devRequire) }}
73-
{{ _self.linkBlock("provides", version.provide) }}
74-
{{ _self.suggestBlock("suggests", version.suggest) }}
75+
{{ _self.provideBlock("provides", version.provide) }}
76+
{{ _self.linkBlock("suggests", version.suggest) }}
7577
{{ _self.linkBlock("conflicts", version.conflict) }}
7678
{{ _self.linkBlock("replaces", version.replace) }}
7779
</div>
@@ -101,14 +103,16 @@
101103
</div>
102104
{% endmacro %}
103105

104-
{% macro suggestBlock(title, links) %}
106+
{% macro provideBlock(title, links) %}
105107
<div class="col-md-6 col-lg-4">
106108
<div class="h5">{{ title }}</div>
107109

108110
<ul>
109111
{% for link in links %}
110112
{% if link.linkedPackageName is existing_package %}
111113
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.linkedPackageName}) }}">{{ link.linkedPackageName }}</a>: {{ link.linkedVersionConstraint }}</li>
114+
{% elseif link.implementation and link.implementedPackageName is existing_package %}
115+
<li><a href="{{ dashboard_path('dashboard_packages_info', {packageName: link.implementedPackageName}) }}">{{ link.linkedPackageName }}</a>: {{ link.linkedVersionConstraint }}</li>
112116
{% else %}
113117
<li>{{ link.linkedPackageName }}: {{ link.linkedVersionConstraint }}</li>
114118
{% endif %}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends 'dashboard/packages/package_base.html.twig' %}
2+
3+
{% block page_title %}{{ package.name }} <small>{{ 'Providers'|trans }}</small>{% endblock %}
4+
5+
{% block page_content %}
6+
{% include 'dashboard/packages/package_header.html.twig' with {currentPage: 'providers'} %}
7+
8+
{% include 'dashboard/packages/_package_list.html.twig' with {packages: providers|map(provider => provider.package)} %}
9+
{% endblock %}

translations/messages.en.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ Credits: Credits
44
Dashboard: Dashboard
55
Dependents: Dependents
66
Documentation: Documentation
7+
Implementations: Implementations
78
Info: Info
89
Packages: Packages
910
Personal: Personal
11+
Providers: Providers
1012
Sign out: Sign out
1113
Statistics: Statistics
1214
Suggesters: Suggesters

0 commit comments

Comments
 (0)