diff --git a/app/Http/Controllers/Admin/ContentController.php b/app/Http/Controllers/Admin/ContentController.php
index 9a5d4fc..3b90c41 100644
--- a/app/Http/Controllers/Admin/ContentController.php
+++ b/app/Http/Controllers/Admin/ContentController.php
@@ -85,6 +85,10 @@ class ContentController extends Controller
'footer_shipping_text',
'footer_copyright',
'footer_payment_text',
+
+ // Offline / Maintenance Mode
+ 'shop_offline_title',
+ 'shop_offline_message',
];
// Handle checkbox toggles that aren't present if unchecked
@@ -92,6 +96,10 @@ class ContentController extends Controller
Setting::set('announcement_enabled', '0');
}
+ if ($request->has('shop_offline_submitted')) {
+ Setting::set('shop_offline', $request->boolean('shop_offline') ? '1' : '0');
+ }
+
foreach ($fields as $field) {
if ($request->has($field)) {
$value = $request->input($field);
@@ -168,4 +176,20 @@ class ContentController extends Controller
->with('error', "Fout bij verzenden van e-mail via {$defaultMailer}: ".$e->getMessage());
}
}
+
+ /**
+ * Toggle the webshop offline / online status.
+ */
+ public function toggleOffline(Request $request): RedirectResponse
+ {
+ $current = Setting::get('shop_offline', '0') === '1';
+ $new = ! $current;
+ Setting::set('shop_offline', $new ? '1' : '0');
+ Setting::flushCache();
+
+ $statusText = $new ? 'OFFLINE gezet' : 'weer ONLINE gezet';
+
+ return redirect()->back()
+ ->with('success', "De webshop is direct {$statusText}!");
+ }
}
diff --git a/app/Http/Middleware/CheckWebshopOffline.php b/app/Http/Middleware/CheckWebshopOffline.php
new file mode 100644
index 0000000..4cce8e5
--- /dev/null
+++ b/app/Http/Middleware/CheckWebshopOffline.php
@@ -0,0 +1,75 @@
+user() && $request->user()->isAdmin()) {
+ return $next($request);
+ }
+
+ // Keep admin, auth, health check and asset routes accessible
+ if ($this->isExemptRoute($request)) {
+ return $next($request);
+ }
+
+ // Otherwise, render the large red offline maintenance screen
+ $title = Setting::get('shop_offline_title', 'Aan deze webshop wordt hard gewerkt! 🛠️');
+ $message = Setting::get('shop_offline_message', 'Onze 3D printers worden momenteel opnieuw gekalibreerd en we bouwen aan nieuwe toffe prints en functies. We zijn heel snel weer online!');
+
+ return response()->view('errors.offline', [
+ 'offlineTitle' => $title,
+ 'offlineMessage' => $message,
+ ], 503);
+ }
+
+ /**
+ * Check if the current route is exempt from offline mode.
+ */
+ protected function isExemptRoute(Request $request): bool
+ {
+ $exemptPatterns = [
+ 'admin',
+ 'admin/*',
+ 'inloggen',
+ 'login',
+ 'uitloggen',
+ 'logout',
+ 'registreren',
+ 'register',
+ 'wachtwoord-*',
+ 'up',
+ 'health-debug',
+ 'images/*',
+ 'storage/*',
+ 'build/*',
+ 'favicon.ico',
+ ];
+
+ foreach ($exemptPatterns as $pattern) {
+ if ($request->is($pattern)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/bootstrap/app.php b/bootstrap/app.php
index 7f30e4e..8d87bdb 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -1,5 +1,6 @@
withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: '*');
+ $middleware->web(append: [
+ CheckWebshopOffline::class,
+ ]);
$middleware->alias([
'admin' => EnsureUserIsAdmin::class,
]);
diff --git a/resources/views/admin/content/index.blade.php b/resources/views/admin/content/index.blade.php
index 6de4e84..d1d16f8 100644
--- a/resources/views/admin/content/index.blade.php
+++ b/resources/views/admin/content/index.blade.php
@@ -107,6 +107,16 @@
7. E-mail & SMTP Testen
+
+
@@ -631,6 +641,95 @@
+
+
+
+
+
+
+
+
+
+
+
Webshop Offline Modus (Onderhoud)
+
+
+ Wanneer ingeschakeld, kunnen gewone bezoekers niets bestellen en zien zij direct de grote rode offline banner. Alleen ingelogde beheerders kunnen de website bekijken.
+
+
+
+
+
+
+
+
+
+
+
+
+ Status Webshop Bereikbaarheid
+
+ {{ setting('shop_offline', '0') === '1' ? 'De webshop is momenteel OFFLINE voor gewone bezoekers.' : 'De webshop is momenteel LIVE en open voor bestellingen.' }}
+
+
+
+
+
+
+
+
+
+
+
+
De grote rode hoofdtitel die bezoekers in beeld krijgen.
+
+
+
+
+
+
Uitleg over waarom de webshop tijdelijk offline staat en wanneer klanten terug kunnen komen.
+
+
+
+
+
+ Voorvertoning van de Offline Banner:
+
+
+ 🔴 Webshop Tijdelijk Offline
+
+
+ {{ setting('shop_offline_title', 'Aan deze webshop wordt hard gewerkt! 🛠️') }}
+
+
+ {{ setting('shop_offline_message', 'Onze 3D printers worden momenteel opnieuw gekalibreerd en we bouwen aan nieuwe toffe prints en functies. We zijn heel snel weer online voor bestellingen!') }}
+
+
+
+
+
+
+
diff --git a/resources/views/errors/offline.blade.php b/resources/views/errors/offline.blade.php
new file mode 100644
index 0000000..7681ffb
--- /dev/null
+++ b/resources/views/errors/offline.blade.php
@@ -0,0 +1,104 @@
+
+
+
+
+
+ Aan deze webshop wordt hard gewerkt! 🛠️ | Jouwdriedee.nl
+
+
+
+
+
+
+
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
+
+
+
+
+
+
+
+
+
+
+
+
+ Onderhoudsmodus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Webshop Tijdelijk Offline
+
+
+
+
+ 🖨️
+
+
+
+
+ {{ $offlineTitle ?? 'Aan deze webshop wordt hard gewerkt!' }}
+
+
+
+
+ {{ $offlineMessage ?? 'Onze 3D printers worden momenteel opnieuw gekalibreerd en we bouwen aan nieuwe toffe prints en functies. We zijn heel snel weer online voor bestellingen!' }}
+
+
+
+
+
+
🛠️
+
Printstudio Update
+
Finetunen van laagdiktes en toevoegen van nieuwe multi-color designs.
+
+
+
+
📦
+
Lopende Orders
+
Reeds geplaatste bestellingen worden gewoon geprint en verzonden via PostNL.
+
+ Offline Actief
+ De webshop staat momenteel OFFLINE voor bezoekers. Bezoekers zien de grote rode onderhoudsbanner. Alleen jij als beheerder kunt de website bezoeken.
+