Andrew Wallo 9 months ago
parent
commit
8ddb628c44

+ 10
- 1
app/Filament/Company/Resources/Sales/InvoiceResource.php View File

@@ -296,6 +296,15 @@ class InvoiceResource extends Resource
296 296
     {
297 297
         return $table
298 298
             ->defaultSort('due_date')
299
+            ->modifyQueryUsing(function (Builder $query, Tables\Contracts\HasTable $livewire) {
300
+                $recurringInvoiceId = $livewire->recurringInvoice;
301
+
302
+                if (! empty($recurringInvoiceId)) {
303
+                    $query->where('recurring_invoice_id', $recurringInvoiceId);
304
+                }
305
+
306
+                return $query;
307
+            })
299 308
             ->columns([
300 309
                 Tables\Columns\TextColumn::make('id')
301 310
                     ->label('ID')
@@ -358,7 +367,7 @@ class InvoiceResource extends Resource
358 367
                     ])
359 368
                     ->native(false)
360 369
                     ->query(function (Builder $query, array $data) {
361
-                        $sourceType = $data['value'];
370
+                        $sourceType = $data['value'] ?? null;
362 371
 
363 372
                         return match ($sourceType) {
364 373
                             DocumentType::Estimate->value => $query->whereNotNull('estimate_id'),

+ 62
- 0
app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ListInvoices.php View File

@@ -5,13 +5,21 @@ namespace App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
5 5
 use App\Enums\Accounting\InvoiceStatus;
6 6
 use App\Filament\Company\Resources\Sales\InvoiceResource;
7 7
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
8
+use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages\ViewRecurringInvoice;
8 9
 use App\Models\Accounting\Invoice;
10
+use App\Models\Accounting\RecurringInvoice;
11
+use CodeWithDennis\SimpleAlert\Components\Infolists\SimpleAlert;
9 12
 use Filament\Actions;
13
+use Filament\Infolists\Components\Actions\Action;
14
+use Filament\Infolists\Infolist;
10 15
 use Filament\Pages\Concerns\ExposesTableToWidgets;
11 16
 use Filament\Resources\Components\Tab;
12 17
 use Filament\Resources\Pages\ListRecords;
13 18
 use Filament\Support\Enums\MaxWidth;
14 19
 use Illuminate\Database\Eloquent\Builder;
20
+use Illuminate\Support\Facades\Blade;
21
+use Illuminate\Support\HtmlString;
22
+use Livewire\Attributes\Url;
15 23
 
16 24
 class ListInvoices extends ListRecords
17 25
 {
@@ -19,6 +27,54 @@ class ListInvoices extends ListRecords
19 27
 
20 28
     protected static string $resource = InvoiceResource::class;
21 29
 
30
+    #[Url(except: '')]
31
+    public string $recurringInvoice = '';
32
+
33
+    protected static string $view = 'filament.company.resources.sales.invoice-resource.pages.list-invoices';
34
+
35
+    public function infolist(Infolist $infolist): Infolist
36
+    {
37
+        return $infolist
38
+            ->schema([
39
+                SimpleAlert::make('recurringInvoiceFilter')
40
+                    ->info()
41
+                    ->title(function () {
42
+                        if (empty($this->recurringInvoice)) {
43
+                            return null;
44
+                        }
45
+
46
+                        $recurringInvoice = RecurringInvoice::find($this->recurringInvoice);
47
+
48
+                        $clientName = $recurringInvoice?->client?->name;
49
+
50
+                        if (! $clientName) {
51
+                            return 'You are currently viewing invoices created from a recurring invoice';
52
+                        }
53
+
54
+                        $recurringInvoiceUrl = ViewRecurringInvoice::getUrl([
55
+                            'record' => $recurringInvoice,
56
+                        ]);
57
+
58
+                        $link = Blade::render('filament::components.link', [
59
+                            'href' => $recurringInvoiceUrl,
60
+                            'slot' => 'a recurring invoice for ' . $clientName,
61
+                        ]);
62
+
63
+                        return new HtmlString(
64
+                            "You are currently viewing invoices created from {$link}"
65
+                        );
66
+                    })
67
+                    ->visible(fn () => ! empty($this->recurringInvoice))
68
+                    ->actions([
69
+                        Action::make('clearFilter')
70
+                            ->label('Clear Filter')
71
+                            ->button()
72
+                            ->outlined()
73
+                            ->action('clearFilter'),
74
+                    ]),
75
+            ]);
76
+    }
77
+
22 78
     protected function getHeaderActions(): array
23 79
     {
24 80
         return [
@@ -33,6 +89,12 @@ class ListInvoices extends ListRecords
33 89
         ];
34 90
     }
35 91
 
92
+    public function clearFilter(): void
93
+    {
94
+        $this->recurringInvoice = '';
95
+        $this->tableFilters = []; // Refresh widgets/table
96
+    }
97
+
36 98
     public function getMaxContentWidth(): MaxWidth | string | null
37 99
     {
38 100
         return 'max-w-8xl';

+ 32
- 0
app/Filament/Company/Resources/Sales/RecurringInvoiceResource/Pages/ListRecurringInvoices.php View File

@@ -2,9 +2,14 @@
2 2
 
3 3
 namespace App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages;
4 4
 
5
+use App\Enums\Accounting\RecurringInvoiceStatus;
5 6
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource;
7
+use App\Models\Accounting\RecurringInvoice;
6 8
 use Filament\Actions;
9
+use Filament\Resources\Components\Tab;
7 10
 use Filament\Resources\Pages\ListRecords;
11
+use Filament\Support\Enums\MaxWidth;
12
+use Illuminate\Database\Eloquent\Builder;
8 13
 
9 14
 class ListRecurringInvoices extends ListRecords
10 15
 {
@@ -16,4 +21,31 @@ class ListRecurringInvoices extends ListRecords
16 21
             Actions\CreateAction::make(),
17 22
         ];
18 23
     }
24
+
25
+    public function getMaxContentWidth(): MaxWidth | string | null
26
+    {
27
+        return 'max-w-8xl';
28
+    }
29
+
30
+    public function getTabs(): array
31
+    {
32
+        return [
33
+            'all' => Tab::make()
34
+                ->label('All'),
35
+
36
+            'active' => Tab::make()
37
+                ->label('Active')
38
+                ->modifyQueryUsing(function (Builder $query) {
39
+                    $query->where('status', RecurringInvoiceStatus::Active);
40
+                })
41
+                ->badge(RecurringInvoice::where('status', RecurringInvoiceStatus::Active)->count()),
42
+
43
+            'draft' => Tab::make()
44
+                ->label('Draft')
45
+                ->modifyQueryUsing(function (Builder $query) {
46
+                    $query->where('status', RecurringInvoiceStatus::Draft);
47
+                })
48
+                ->badge(RecurringInvoice::where('status', RecurringInvoiceStatus::Draft)->count()),
49
+        ];
50
+    }
19 51
 }

+ 3
- 10
app/Filament/Company/Resources/Sales/RecurringInvoiceResource/Pages/ViewRecurringInvoice.php View File

@@ -108,16 +108,9 @@ class ViewRecurringInvoice extends ViewRecord
108 108
                                     ->color('primary')
109 109
                                     ->weight(FontWeight::SemiBold)
110 110
                                     ->suffix(fn (RecurringInvoice $record) => Str::of(' invoice')->plural($record->occurrences_count))
111
-                                    ->url(static fn (RecurringInvoice $record) => ListInvoices::getUrl([
112
-                                        'tableFilters' => [
113
-                                            'client' => [
114
-                                                'value' => $record->client_id,
115
-                                            ],
116
-                                            'source_type' => [
117
-                                                'value' => DocumentType::RecurringInvoice->value,
118
-                                            ],
119
-                                        ],
120
-                                    ]), true),
111
+                                    ->url(static function (RecurringInvoice $record) {
112
+                                        return ListInvoices::getUrl(['recurringInvoice' => $record->id]);
113
+                                    }),
121 114
                                 TextEntry::make('end_date')
122 115
                                     ->label('Ends On')
123 116
                                     ->date()

+ 18
- 0
resources/views/filament/company/resources/sales/invoice-resource/pages/list-invoices.blade.php View File

@@ -0,0 +1,18 @@
1
+<x-filament-panels::page
2
+    @class([
3
+        'fi-resource-list-records-page',
4
+        'fi-resource-' . str_replace('/', '-', $this->getResource()::getSlug()),
5
+    ])
6
+>
7
+    <div class="flex flex-col gap-y-6">
8
+        {{ $this->infolist }}
9
+
10
+        <x-filament-panels::resources.tabs />
11
+
12
+        {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_BEFORE, scopes: $this->getRenderHookScopes()) }}
13
+
14
+        {{ $this->table }}
15
+
16
+        {{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_AFTER, scopes: $this->getRenderHookScopes()) }}
17
+    </div>
18
+</x-filament-panels::page>

Loading…
Cancel
Save