From c9d400fd6eee5431a4c2fd7ef08f84af7c4fcbf9 Mon Sep 17 00:00:00 2001 From: Vasyka Date: Thu, 6 Aug 2026 05:47:07 +0000 Subject: [PATCH] feat(pdf): preview in Filament modal (iframe) instead of new tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All "Vizualizare PDF" actions now open a wide (7xl) Filament modal containing an iframe pointing at the inline PDF endpoint, with a top-right "Descarcă" and "Deschide în tab nou" fallback. - WorkOrder edit action + WO table row action - InjectorProtocol edit action + protocols table row action - Dashboard Docs tab preview button (Alpine.js overlay since it's a plain Blade view, not a Filament action) The underlying /pdf routes stay unchanged (Content-Disposition: inline, ?download=1 for attachment) — the iframe just loads the same URL. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Resources/InjectorProtocolResource.php | 10 +++++++-- .../Pages/EditInjectorProtocol.php | 10 +++++++-- .../Tenant/Resources/WorkOrderResource.php | 10 +++++++-- .../WorkOrderResource/Pages/EditWorkOrder.php | 10 +++++++-- lang/en.json | 2 ++ lang/ru.json | 2 ++ .../pages/work-order-dashboard.blade.php | 21 ++++++++++++++++--- .../filament/tenant/pdf-preview.blade.php | 14 +++++++++++++ 8 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 resources/views/filament/tenant/pdf-preview.blade.php diff --git a/app/Filament/Tenant/Resources/InjectorProtocolResource.php b/app/Filament/Tenant/Resources/InjectorProtocolResource.php index a693fd2..dbf6d53 100644 --- a/app/Filament/Tenant/Resources/InjectorProtocolResource.php +++ b/app/Filament/Tenant/Resources/InjectorProtocolResource.php @@ -266,8 +266,14 @@ class InjectorProtocolResource extends Resource ->label(__('PDF')) ->icon('heroicon-m-document-magnifying-glass') ->color('gray') - ->url(fn (InjectorProtocol $r) => route('tenant.injector-protocols.pdf', ['record' => $r->id])) - ->openUrlInNewTab(), + ->modalHeading(fn (InjectorProtocol $r) => __('Protocol') . ' ' . $r->protocol_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel(__('Închide')) + ->modalWidth('7xl') + ->modalContent(fn (InjectorProtocol $r) => view('filament.tenant.pdf-preview', [ + 'pdfUrl' => route('tenant.injector-protocols.pdf', ['record' => $r->id]), + 'downloadUrl' => route('tenant.injector-protocols.pdf', ['record' => $r->id, 'download' => 1]), + ])), Actions\EditAction::make(), Actions\DeleteAction::make(), ]) diff --git a/app/Filament/Tenant/Resources/InjectorProtocolResource/Pages/EditInjectorProtocol.php b/app/Filament/Tenant/Resources/InjectorProtocolResource/Pages/EditInjectorProtocol.php index 0cb1943..5780d49 100644 --- a/app/Filament/Tenant/Resources/InjectorProtocolResource/Pages/EditInjectorProtocol.php +++ b/app/Filament/Tenant/Resources/InjectorProtocolResource/Pages/EditInjectorProtocol.php @@ -18,8 +18,14 @@ class EditInjectorProtocol extends EditRecord ->label(__('Vizualizare PDF')) ->icon('heroicon-m-document-magnifying-glass') ->color('gray') - ->url(fn (InjectorProtocol $record) => route('tenant.injector-protocols.pdf', ['record' => $record->id])) - ->openUrlInNewTab(), + ->modalHeading(fn (InjectorProtocol $record) => __('Protocol') . ' ' . $record->protocol_number) + ->modalSubmitAction(false) + ->modalCancelActionLabel(__('Închide')) + ->modalWidth('7xl') + ->modalContent(fn (InjectorProtocol $record) => view('filament.tenant.pdf-preview', [ + 'pdfUrl' => route('tenant.injector-protocols.pdf', ['record' => $record->id]), + 'downloadUrl' => route('tenant.injector-protocols.pdf', ['record' => $record->id, 'download' => 1]), + ])), Actions\DeleteAction::make(), ]; } diff --git a/app/Filament/Tenant/Resources/WorkOrderResource.php b/app/Filament/Tenant/Resources/WorkOrderResource.php index 0cbb2df..5e87498 100644 --- a/app/Filament/Tenant/Resources/WorkOrderResource.php +++ b/app/Filament/Tenant/Resources/WorkOrderResource.php @@ -188,8 +188,14 @@ class WorkOrderResource extends Resource ->label(__('PDF')) ->icon('heroicon-m-document-magnifying-glass') ->color('gray') - ->url(fn (WorkOrder $r) => url('/app/work-orders/' . $r->id . '/pdf')) - ->openUrlInNewTab(), + ->modalHeading(fn (WorkOrder $r) => __('Factură') . ' — WO #' . $r->number) + ->modalSubmitAction(false) + ->modalCancelActionLabel(__('Închide')) + ->modalWidth('7xl') + ->modalContent(fn (WorkOrder $r) => view('filament.tenant.pdf-preview', [ + 'pdfUrl' => url('/app/work-orders/' . $r->id . '/pdf'), + 'downloadUrl' => url('/app/work-orders/' . $r->id . '/pdf?download=1'), + ])), Actions\EditAction::make(), Actions\DeleteAction::make(), ]) diff --git a/app/Filament/Tenant/Resources/WorkOrderResource/Pages/EditWorkOrder.php b/app/Filament/Tenant/Resources/WorkOrderResource/Pages/EditWorkOrder.php index 5e5e0ef..cb729ca 100644 --- a/app/Filament/Tenant/Resources/WorkOrderResource/Pages/EditWorkOrder.php +++ b/app/Filament/Tenant/Resources/WorkOrderResource/Pages/EditWorkOrder.php @@ -87,8 +87,14 @@ class EditWorkOrder extends EditRecord ->label(__('Vizualizare PDF')) ->icon('heroicon-m-document-magnifying-glass') ->color('gray') - ->url(fn () => url('/app/work-orders/' . $this->record->id . '/pdf')) - ->openUrlInNewTab(), + ->modalHeading(fn () => __('Factură') . ' — WO #' . $this->record->number) + ->modalSubmitAction(false) + ->modalCancelActionLabel(__('Închide')) + ->modalWidth('7xl') + ->modalContent(fn () => view('filament.tenant.pdf-preview', [ + 'pdfUrl' => url('/app/work-orders/' . $this->record->id . '/pdf'), + 'downloadUrl' => url('/app/work-orders/' . $this->record->id . '/pdf?download=1'), + ])), Actions\DeleteAction::make(), ]; } diff --git a/lang/en.json b/lang/en.json index dba2ecc..a50aaab 100644 --- a/lang/en.json +++ b/lang/en.json @@ -670,6 +670,7 @@ "Deschide fișă nouă": "Open new order", "Deschide panoul pe telefon și acceptă notificările întâi.": "Open the panel on the phone and accept notifications first.", "Deschide tenantul": "Deschide tenantul", + "Deschide în tab nou": "Open in new tab", "Deschide →": "Open →", "Deschidere ÎNAINTE": "Opening BEFORE", "Deschis": "Opened", @@ -1623,6 +1624,7 @@ "Progres": "Progress", "Progres etapă": "Stage progress", "Proprietar": "Owner", + "Protocol": "Protocol", "Protocol nou": "New protocol", "Provider implicit": "Default provider", "Provider:": "Provider:", diff --git a/lang/ru.json b/lang/ru.json index 2bbc087..260d6e9 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -670,6 +670,7 @@ "Deschide fișă nouă": "Открыть новый наряд", "Deschide panoul pe telefon și acceptă notificările întâi.": "Сначала откройте панель на телефоне и разрешите уведомления.", "Deschide tenantul": "Deschide tenantul", + "Deschide în tab nou": "Открыть в новой вкладке", "Deschide →": "Открыть →", "Deschidere ÎNAINTE": "Открытие ДО", "Deschis": "Открыт", @@ -1623,6 +1624,7 @@ "Progres": "Прогресс", "Progres etapă": "Прогресс этапа", "Proprietar": "Владелец", + "Protocol": "Протокол", "Protocol nou": "Новый протокол", "Provider implicit": "Провайдер по умолчанию", "Provider:": "Provider:", diff --git a/resources/views/filament/tenant/pages/work-order-dashboard.blade.php b/resources/views/filament/tenant/pages/work-order-dashboard.blade.php index aebdffc..d152fbd 100644 --- a/resources/views/filament/tenant/pages/work-order-dashboard.blade.php +++ b/resources/views/filament/tenant/pages/work-order-dashboard.blade.php @@ -687,13 +687,28 @@ {{-- ── DOCUMENTS TAB ── --}}
-
- +
+ ⬇️ {{ __('Descarcă factură (PDF)') }} + + {{-- PDF preview modal (Alpine.js overlay) --}} +
+
+
+ {{ __('Factură') }} — WO #{{ $wo->number }} + +
+ +
+
@php $signed = $wo->getMedia('signed_documents'); @endphp @if ($signed->isNotEmpty())
{{ __('Documente semnate') }}
diff --git a/resources/views/filament/tenant/pdf-preview.blade.php b/resources/views/filament/tenant/pdf-preview.blade.php new file mode 100644 index 0000000..eab9dcc --- /dev/null +++ b/resources/views/filament/tenant/pdf-preview.blade.php @@ -0,0 +1,14 @@ +{{-- Reusable PDF preview iframe (loaded inside a Filament action modal). + $pdfUrl — inline PDF endpoint (Content-Disposition: inline). + $downloadUrl — same URL with ?download=1, shown as a fallback link. --}} +