From f4dbb458d1ce3921bb060ef00c90255e3741d641 Mon Sep 17 00:00:00 2001
From: SajjadMahmoody <117562560+SajjadMahmoody@users.noreply.github.com>
Date: Tue, 2 Jun 2026 16:10:52 +0330
Subject: [PATCH] feat: add bulk download button to image lightbox
---
app/Providers/Filament/AdminPanelProvider.php | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php
index 62cf172..00a9848 100644
--- a/app/Providers/Filament/AdminPanelProvider.php
+++ b/app/Providers/Filament/AdminPanelProvider.php
@@ -309,6 +309,11 @@ function fixGalleryItems() {
->renderHook(
PanelsRenderHook::BODY_END,
fn (): string => <<<'HTML'
+
![]()
@@ -322,6 +327,7 @@ function fixGalleryItems() {
+
1 / 1
@@ -339,6 +345,7 @@ function fixGalleryItems() {
var lbPrev = document.getElementById('fi-lb-prev');
var lbNext = document.getElementById('fi-lb-next');
var lbClose = document.getElementById('fi-lb-close');
+ var lbDownload = document.getElementById('fi-lb-download');
var lbCaption = document.getElementById('fi-lb-caption');
var lbCapBody = document.getElementById('fi-lb-cap-body');
var lbCapClose = document.getElementById('fi-lb-cap-close');
@@ -486,6 +493,30 @@ function onKey(e) {
lbWrap.addEventListener('click', function (e) { if (e.target === lbWrap) hideLightbox(); });
lbClose.addEventListener('click', hideLightbox);
+ if (lbDownload) lbDownload.addEventListener('click', function () {
+ var toDownload = images.slice();
+ toDownload.forEach(function (url, i) {
+ setTimeout(function () {
+ fetch(url)
+ .then(function (r) {
+ if (!r.ok) throw new Error('fetch failed');
+ return r.blob();
+ })
+ .then(function (blob) {
+ var objUrl = URL.createObjectURL(blob);
+ var a = document.createElement('a');
+ var ext = (url.split('?')[0].split('.').pop() || 'jpg').toLowerCase();
+ a.href = objUrl;
+ a.download = 'image-' + (i + 1) + '.' + ext;
+ document.body.appendChild(a);
+ a.click();
+ document.body.removeChild(a);
+ setTimeout(function () { URL.revokeObjectURL(objUrl); }, 10000);
+ })
+ .catch(function () { window.open(url, '_blank'); });
+ }, i * 700);
+ });
+ });
lbPrev.addEventListener('click', function () { navigate(-1); });
lbNext.addEventListener('click', function () { navigate(1); });
if (lbCapClose) lbCapClose.addEventListener('click', function () {