diff --git a/src/Twig/AppExtension.php b/src/Twig/AppExtension.php index 6389e00..e7dcb37 100644 --- a/src/Twig/AppExtension.php +++ b/src/Twig/AppExtension.php @@ -31,6 +31,7 @@ class AppExtension extends AbstractExtension return [ new TwigFunction('icon', [AppRuntime::class, 'renderIcon'], ['needs_environment' => true, 'is_safe' => ['html']]), new TwigFunction('is_current_route', [AppRuntime::class, 'isCurrentRoute']), + new TwigFunction('is_maintenance_mode', [AppRuntime::class, 'isMaintenanceMode']), new TwigFunction('return_url', [AppRuntime::class, 'getEncodedReturnUrl']), new TwigFunction('forwarded_return_url', [AppRuntime::class, 'getForwardedReturnUrl']), new TwigFunction('qa_attribute', [AppRuntime::class, 'renderQaAttribute'], ['is_safe' => ['html']]), diff --git a/src/Twig/AppRuntime.php b/src/Twig/AppRuntime.php index 8d1acc0..13d39b7 100644 --- a/src/Twig/AppRuntime.php +++ b/src/Twig/AppRuntime.php @@ -180,6 +180,14 @@ class AppRuntime implements RuntimeExtensionInterface return $requestedRoute === $route; } + /** + * The attribute is set by MaintenanceModeListener, on the ip whitelist branch only. + */ + public function isMaintenanceMode(): bool + { + return true === $this->requestStack->getMainRequest()?->attributes->get('_maintenance_mode_allowed'); + } + public function getEncodedReturnUrl(): string { $masterRequest = $this->requestStack->getMainRequest(); diff --git a/templates/_partials/_maintenance_banner.html.twig b/templates/_partials/_maintenance_banner.html.twig new file mode 100644 index 0000000..3b0a70b --- /dev/null +++ b/templates/_partials/_maintenance_banner.html.twig @@ -0,0 +1,6 @@ +{% if is_maintenance_mode() %} +
+ {{ icon('alert', 'w-5 h-5 flex-shrink-0') }} + Wartungsmodus — das Portal ist für andere Benutzer gesperrt. +
+{% endif %} diff --git a/templates/base.html.twig b/templates/base.html.twig index 9a4d9fb..2003fe1 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -16,6 +16,7 @@ {% endblock %} + {% include '_partials/_maintenance_banner.html.twig' %} {% block body %}{% endblock %} {% include '_partials/_flashes.html.twig' %} diff --git a/tests/Twig/MaintenanceModeTest.php b/tests/Twig/MaintenanceModeTest.php new file mode 100644 index 0000000..cb17e6b --- /dev/null +++ b/tests/Twig/MaintenanceModeTest.php @@ -0,0 +1,48 @@ +requestStack = self::getContainer()->get(RequestStack::class); + $this->appRuntime = self::getContainer()->get(AppRuntime::class); + } + + public function testMaintenanceModeIsReportedWhenTheListenerMarkedTheRequest(): void + { + $request = Request::create('/administrative/assignment'); + $request->attributes->set('_maintenance_mode_allowed', true); + $this->requestStack->push($request); + + self::assertTrue($this->appRuntime->isMaintenanceMode()); + } + + public function testNoMaintenanceModeOnAnUnmarkedRequest(): void + { + $this->requestStack->push(Request::create('/administrative/assignment')); + + self::assertFalse($this->appRuntime->isMaintenanceMode()); + } + + /** + * Rendering outside a request, an email or a console command, must not blow up. + */ + public function testNoMaintenanceModeWithoutARequest(): void + { + self::assertFalse($this->appRuntime->isMaintenanceMode()); + } +}