Skip to content

Commit aa91405

Browse files
authored
Add quick revision visibility reset button (#843)
1 parent 8844caf commit aa91405

File tree

4 files changed

+114
-3
lines changed

4 files changed

+114
-3
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace DR\Review\Controller\App\Revision;
5+
6+
use DR\Review\Controller\AbstractController;
7+
use DR\Review\Controller\App\Review\ReviewController;
8+
use DR\Review\Entity\Review\CodeReview;
9+
use DR\Review\Repository\Revision\RevisionVisibilityRepository;
10+
use DR\Review\Security\Role\Roles;
11+
use DR\Review\Service\CodeReview\CodeReviewRevisionService;
12+
use DR\Review\Service\Revision\RevisionVisibilityService;
13+
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
14+
use Symfony\Component\HttpFoundation\RedirectResponse;
15+
use Symfony\Component\Routing\Annotation\Route;
16+
use Symfony\Component\Security\Http\Attribute\IsGranted;
17+
18+
class ResetRevisionVisibilityController extends AbstractController
19+
{
20+
public function __construct(
21+
private readonly RevisionVisibilityService $visibilityService,
22+
private readonly RevisionVisibilityRepository $visibilityRepository,
23+
private readonly CodeReviewRevisionService $revisionService
24+
) {
25+
}
26+
27+
#[Route('app/reviews/{id<\d+>}/revision-visibility/reset', name: self::class, methods: 'POST')]
28+
#[IsGranted(Roles::ROLE_USER)]
29+
public function __invoke(#[MapEntity] CodeReview $review): RedirectResponse
30+
{
31+
$revisions = $this->revisionService->getRevisions($review);
32+
$visibilities = $this->visibilityService->getRevisionVisibilities($review, $revisions, $this->getUser());
33+
34+
// set all visible
35+
foreach ($visibilities as $visibility) {
36+
$visibility->setVisible(true);
37+
}
38+
$this->visibilityRepository->saveAll($visibilities, true);
39+
40+
return $this->refererRedirect(ReviewController::class, ['review' => $review]);
41+
}
42+
}

templates/app/review/review.sidebar.html.twig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@
2121
{% endif %}
2222
</a>
2323
</li>
24+
{% if reviewModel.visibleRevisionCount != reviewModel.revisions|length %}
25+
<li class="nav-item" title="{{ 'show.all.revisions'|trans }}">
26+
<form method="post"
27+
action="{{ path('DR\\Review\\Controller\\App\\Revision\\ResetRevisionVisibilityController', {id: review.id}) }}">
28+
<button type="submit" class="nav-link" {{ stimulus_controller('button') }}>
29+
<i class="bi-eye-fill"></i> {{ 'all'|trans }}
30+
</button>
31+
</form>
32+
</li>
33+
{% endif %}
2434
</ul>
2535
</div>
2636

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace DR\Review\Tests\Unit\Controller\App\Revision;
5+
6+
use DR\Review\Controller\AbstractController;
7+
use DR\Review\Controller\App\Review\ReviewController;
8+
use DR\Review\Controller\App\Revision\ResetRevisionVisibilityController;
9+
use DR\Review\Entity\Review\CodeReview;
10+
use DR\Review\Entity\Revision\Revision;
11+
use DR\Review\Entity\Revision\RevisionVisibility;
12+
use DR\Review\Entity\User\User;
13+
use DR\Review\Repository\Revision\RevisionVisibilityRepository;
14+
use DR\Review\Service\CodeReview\CodeReviewRevisionService;
15+
use DR\Review\Service\Revision\RevisionVisibilityService;
16+
use DR\Review\Tests\AbstractControllerTestCase;
17+
use PHPUnit\Framework\Attributes\CoversClass;
18+
use PHPUnit\Framework\MockObject\MockObject;
19+
20+
#[CoversClass(ResetRevisionVisibilityController::class)]
21+
class ResetRevisionVisibilityControllerTest extends AbstractControllerTestCase
22+
{
23+
private RevisionVisibilityService&MockObject $visibilityService;
24+
private RevisionVisibilityRepository&MockObject $visibilityRepository;
25+
private CodeReviewRevisionService&MockObject $revisionService;
26+
27+
protected function setUp(): void
28+
{
29+
$this->visibilityService = $this->createMock(RevisionVisibilityService::class);
30+
$this->visibilityRepository = $this->createMock(RevisionVisibilityRepository::class);
31+
$this->revisionService = $this->createMock(CodeReviewRevisionService::class);
32+
parent::setUp();
33+
}
34+
35+
public function testInvoke(): void
36+
{
37+
$review = new CodeReview();
38+
$revision = new Revision();
39+
$visibility = (new RevisionVisibility())->setVisible(false);
40+
$user = new User();
41+
42+
$this->expectGetUser($user);
43+
$this->revisionService->expects(self::once())->method('getRevisions')->with($review)->willReturn([$revision]);
44+
$this->visibilityService->expects(self::once())->method('getRevisionVisibilities')
45+
->with($review, [$revision], $user)
46+
->willReturn([$visibility]);
47+
$this->visibilityRepository->expects(self::once())->method('saveAll')->with([$visibility], true);
48+
$this->expectRefererRedirect(ReviewController::class, ['review' => $review]);
49+
50+
($this->controller)($review);
51+
static::assertTrue($visibility->isVisible());
52+
}
53+
54+
public function getController(): AbstractController
55+
{
56+
return new ResetRevisionVisibilityController($this->visibilityService, $this->visibilityRepository, $this->revisionService);
57+
}
58+
}

translations/messages+intl-icu.en.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
'ignore.space.at.eol' => 'Ignore space at end-of-line',
139139
'ignore.space.change' => 'Ignore space changes',
140140
'ignore.whitespaces' => 'Ignore whitespaces',
141+
'ignore.whitespaces.and.empty.lines' => 'Ignore whitespaces and empty lines',
141142
'in.review' => 'In review',
142143
'inactive' => 'Inactive',
143144
'include.commits' => 'Include commits',
@@ -164,6 +165,7 @@
164165
'login.not.successful' => 'The log in was not successful',
165166
'login.unable.to.validate.login.attempt' => 'Unable to validate the login attempt. Please retry',
166167
'logout' => 'Logout',
168+
'logs' => 'Logs',
167169
'mail.comment.resolved.subject' => '[Resolved discussion] {reviewId}: {reviewTitle}',
168170
'mail.comment.was.resolved.on' => 'Comment was resolved by {userName} on',
169171
'mail.configure.settings' => 'Configure notification settings.',
@@ -176,6 +178,7 @@
176178
'mail.unsubscribe.footer' => 'If you don\'t want to receive these emails from {app_name} in the future, please unsubscribe.',
177179
'mail.updated.comment.subject' => '[Updated discussion] {reviewId}: {reviewTitle}',
178180
'main.branch' => 'Main branch',
181+
'mark.all.as.read' => 'Mark all as read',
179182
'merged' => 'merged',
180183
'name' => 'Name',
181184
'never' => 'Never',
@@ -281,6 +284,7 @@
281284
'settings' => 'Settings',
282285
'settings.save.successfully' => 'Settings successfully saved',
283286
'show' => 'show',
287+
'show.all.revisions' => 'Show all revisions',
284288
'sign.in' => 'Sign in',
285289
'sign.up' => 'Sign up',
286290
'subject' => 'Subject',
@@ -346,7 +350,4 @@
346350
'webhooks' => 'Webhooks',
347351
'yes' => 'Yes',
348352
'you' => 'You',
349-
'logs' => 'Logs',
350-
'mark.all.as.read' => 'Mark all as read',
351-
'ignore.whitespaces.and.empty.lines' => 'Ignore whitespaces and empty lines',
352353
];

0 commit comments

Comments
 (0)