c9d400fd6e
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) <noreply@anthropic.com>
102 lines
4.5 KiB
PHP
102 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Tenant\Resources\WorkOrderResource\Pages;
|
|
|
|
use App\Filament\Tenant\Resources\WorkOrderResource;
|
|
use App\Models\Tenant\WorkOrder;
|
|
use Filament\Actions;
|
|
use Filament\Resources\Pages\EditRecord;
|
|
|
|
class EditWorkOrder extends EditRecord
|
|
{
|
|
protected static string $resource = WorkOrderResource::class;
|
|
|
|
/** Manopere / Piese / Subcontract / Plăți se afișează SUS ca taburi, apoi antetul. */
|
|
public function hasCombinedRelationManagerTabsWithContent(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function getContentTabLabel(): ?string
|
|
{
|
|
return 'ⓘ ' . __('Info & antet');
|
|
}
|
|
|
|
public function getContentTabPosition(): ?\Filament\Resources\Pages\Enums\ContentTabPosition
|
|
{
|
|
// Puts the form (content) AFTER all relation manager tabs
|
|
return \Filament\Resources\Pages\Enums\ContentTabPosition::After;
|
|
}
|
|
|
|
protected function getHeaderActions(): array
|
|
{
|
|
return [
|
|
Actions\Action::make('dashboard')
|
|
->label(__('Vizualizare dashboard'))
|
|
->icon('heroicon-m-squares-2x2')
|
|
->color('info')
|
|
->url(fn () => \App\Filament\Tenant\Pages\WorkOrderDashboard::getUrl(
|
|
parameters: ['wo' => $this->record->id],
|
|
panel: 'tenant',
|
|
)),
|
|
Actions\Action::make('apply_template')
|
|
->label(__('Aplică șablon'))
|
|
->icon('heroicon-m-clipboard-document-list')
|
|
->color('gray')
|
|
->schema([
|
|
\Filament\Forms\Components\Select::make('template_id')
|
|
->label(__('Șablon serviciu'))
|
|
->options(fn () => \App\Models\Tenant\ServiceTemplate::where('is_active', true)->pluck('name', 'id'))
|
|
->searchable()
|
|
->required(),
|
|
])
|
|
->action(function (array $data) {
|
|
$template = \App\Models\Tenant\ServiceTemplate::with('items')->find($data['template_id']);
|
|
if (! $template) return;
|
|
$r = app(\App\Services\ServiceComposer::class)->applyTemplate($this->record, $template);
|
|
$this->fillForm();
|
|
\Filament\Notifications\Notification::make()
|
|
->title(__('Șablon aplicat') . ": {$r['labor']} " . __('manopere') . ", {$r['parts']} " . __('piese'))
|
|
->success()->send();
|
|
}),
|
|
Actions\Action::make('ai_diagnose')
|
|
->label(__('AI: sugerează diagnostic'))
|
|
->icon('heroicon-m-sparkles')
|
|
->color('primary')
|
|
->visible(fn () => ! empty($this->record->complaint))
|
|
->modalHeading(__('Diagnostic AI bazat pe plângerea clientului'))
|
|
->modalSubmitAction(false)
|
|
->modalCancelActionLabel(__('Închide'))
|
|
->modalContent(function () {
|
|
[$reply, $meta] = app(\App\Services\Ai\AiAssistantService::class)
|
|
->suggestDiagnosis($this->record);
|
|
return view('filament.tenant.ai-reply', ['reply' => $reply, 'meta' => $meta]);
|
|
}),
|
|
Actions\Action::make('tracking')
|
|
->label(__('Link client (QR)'))
|
|
->icon('heroicon-m-qr-code')
|
|
->color('primary')
|
|
->modalHeading(fn () => __('Tracking client') . ' — WO #' . $this->record->number)
|
|
->modalSubmitAction(false)
|
|
->modalCancelActionLabel(__('Închide'))
|
|
->modalWidth('lg')
|
|
->modalContent(fn () => view('filament.tenant.tracking-qr', [
|
|
'wo' => $this->record,
|
|
])),
|
|
Actions\Action::make('pdf')
|
|
->label(__('Vizualizare PDF'))
|
|
->icon('heroicon-m-document-magnifying-glass')
|
|
->color('gray')
|
|
->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(),
|
|
];
|
|
}
|
|
}
|