From b657cc8a0705349e80a9c1f7ccb8c1440510fa4c Mon Sep 17 00:00:00 2001 From: Tim Goudriaan Date: Mon, 13 Apr 2026 12:19:00 +0200 Subject: [PATCH 1/2] Add preliminary revision history UI --- assets/stylesheets/dashboard-theme.css | 5 + .../DashboardPackagesInfoController.php | 48 ++++-- .../Repository/MetadataRepository.php | 15 ++ .../packages/_package_header.html.twig | 8 +- .../dashboard/packages/package_info.html.twig | 138 +++++++++++------- .../package_version_revisions.html.twig | 38 +++++ .../DashboardPackagesInfoControllerTest.php | 10 ++ translations/messages.en.yaml | 8 + 8 files changed, 207 insertions(+), 63 deletions(-) create mode 100644 templates/dashboard/packages/package_version_revisions.html.twig diff --git a/assets/stylesheets/dashboard-theme.css b/assets/stylesheets/dashboard-theme.css index 21921fdb..b6a14bf1 100644 --- a/assets/stylesheets/dashboard-theme.css +++ b/assets/stylesheets/dashboard-theme.css @@ -77,3 +77,8 @@ body.ea-dark-scheme img.img-light { body:not(.ea-dark-scheme) img.img-dark { display: none; } + +.text-monospace { + font-family: var(--font-family-monospace); + font-size: 13px; +} diff --git a/src/Controller/Dashboard/DashboardPackagesInfoController.php b/src/Controller/Dashboard/DashboardPackagesInfoController.php index d2763a4a..db91ed57 100644 --- a/src/Controller/Dashboard/DashboardPackagesInfoController.php +++ b/src/Controller/Dashboard/DashboardPackagesInfoController.php @@ -4,7 +4,6 @@ use CodedMonkey\Dirigent\Attribute\IsGrantedAccess; use CodedMonkey\Dirigent\Attribute\MapPackage; -use CodedMonkey\Dirigent\Doctrine\Entity\Metadata; use CodedMonkey\Dirigent\Doctrine\Entity\Package; use CodedMonkey\Dirigent\Doctrine\Entity\PackageProvideLink; use CodedMonkey\Dirigent\Doctrine\Entity\PackageRequireLink; @@ -31,7 +30,7 @@ public function __construct( */ #[Route('/packages/{package}', name: 'dashboard_packages_info', requirements: ['package' => MapPackage::PACKAGE_REGEX])] #[IsGrantedAccess] - public function info(#[MapPackage] Package $package): Response + public function info(Request $request, #[MapPackage] Package $package, MetadataRepository $metadataRepository): Response { $version = $package->getLatestVersion(); @@ -39,16 +38,29 @@ public function info(#[MapPackage] Package $package): Response return $this->redirectToRoute('dashboard_packages_versions', ['package' => $package->getName()]); } - return $this->versionInfo($package, $version); + return $this->versionInfo($request, $package, $version, $metadataRepository); } #[Route('/packages/{package}/versions/{version}', name: 'dashboard_packages_version_info', requirements: ['package' => MapPackage::PACKAGE_REGEX, 'version' => '.*'])] #[IsGrantedAccess] - public function versionInfo(#[MapPackage] Package $package, #[MapPackage] Version $version): Response - { - /** @var MetadataRepository $metadataRepository */ - $metadataRepository = $this->entityManager->getRepository(Metadata::class); - $metadataRepository->fetchMetadataCollections($version->getCurrentMetadata()); + public function versionInfo( + Request $request, + #[MapPackage] Package $package, + #[MapPackage] Version $version, + MetadataRepository $metadataRepository, + ): Response { + $metadata = $version->getCurrentMetadata(); + $revision = $request->query->getInt('revision'); + if (0 !== $revision) { + $metadata = $metadataRepository->findOneBy(['version' => $version, 'revision' => $revision]); + } + if (null === $metadata) { + throw $this->createNotFoundException('The revision does not exist.'); + } + + $metadataRepository->fetchMetadataCollections($metadata); + + $metadataCount = $metadataRepository->getMetadataCountForVersion($version); $dependentCount = $this->entityManager->getRepository(PackageRequireLink::class)->count(['linkedPackageName' => $package->getName()]); $implementationCount = $this->entityManager->getRepository(PackageProvideLink::class)->count(['linkedPackageName' => $package->getName(), 'implementation' => true]); @@ -58,15 +70,33 @@ public function versionInfo(#[MapPackage] Package $package, #[MapPackage] Versio return $this->render('dashboard/packages/package_info.html.twig', [ 'package' => $package, 'version' => $version, - 'metadata' => $version->getCurrentMetadata(), + 'metadata' => $metadata, 'dependentCount' => $dependentCount, 'implementationCount' => $implementationCount, + 'metadataCount' => $metadataCount, 'providerCount' => $providerCount, 'suggesterCount' => $suggesterCount, ]); } + #[Route('/packages/{package}/revisions/{version}', name: 'dashboard_packages_version_metadata_list', requirements: ['package' => MapPackage::PACKAGE_REGEX, 'version' => '.*'])] + #[IsGrantedAccess] + public function versionMetadataList( + #[MapPackage] Package $package, + #[MapPackage] Version $version, + MetadataRepository $metadataRepository, + ): Response { + $metadataCollection = $metadataRepository->getMetadataCollectionForVersion($version); + + return $this->render('dashboard/packages/package_version_revisions.html.twig', [ + 'package' => $package, + 'version' => $version, + + 'metadataCollection' => $metadataCollection, + ]); + } + #[Route('/packages/{package}/versions', name: 'dashboard_packages_versions', requirements: ['package' => MapPackage::PACKAGE_REGEX])] #[IsGrantedAccess] public function versions(#[MapPackage] Package $package): Response diff --git a/src/Doctrine/Repository/MetadataRepository.php b/src/Doctrine/Repository/MetadataRepository.php index c1489785..0c3b92b1 100644 --- a/src/Doctrine/Repository/MetadataRepository.php +++ b/src/Doctrine/Repository/MetadataRepository.php @@ -3,8 +3,10 @@ namespace CodedMonkey\Dirigent\Doctrine\Repository; use CodedMonkey\Dirigent\Doctrine\Entity\Metadata; +use CodedMonkey\Dirigent\Doctrine\Entity\Version; use CodedMonkey\Dirigent\Entity\MetadataLinkType; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Collections\Order; use Doctrine\Persistence\ManagerRegistry; /** @@ -40,6 +42,19 @@ public function remove(Metadata $entity, bool $flush = false): void } } + public function getMetadataCountForVersion(Version $version): int + { + return $this->count(['version' => $version]); + } + + public function getMetadataCollectionForVersion(Version $version): array + { + return $this->findBy( + ['version' => $version], + ['revision' => Order::Descending->value], + ); + } + /** * Initializes all link and keyword collections for the given metadata. */ diff --git a/templates/dashboard/packages/_package_header.html.twig b/templates/dashboard/packages/_package_header.html.twig index d448e30d..958fbc4d 100644 --- a/templates/dashboard/packages/_package_header.html.twig +++ b/templates/dashboard/packages/_package_header.html.twig @@ -1,11 +1,15 @@ {% set currentPage = currentPage|default(null) %} +{% set currentVersion = currentVersion|default(null) %} {% set attrActive = 'class="nav-link active" aria-current="page"' %} {% set attr = 'class="nav-link text-primary"' %} -