Andrew Wallo 9 月之前
父節點
當前提交
b4e1e96613

+ 27
- 0
app/Concerns/HasTabSpecificColumnToggles.php 查看文件

1
+<?php
2
+
3
+namespace App\Concerns;
4
+
5
+trait HasTabSpecificColumnToggles
6
+{
7
+    public function getTableColumnToggleFormStateSessionKey(): string
8
+    {
9
+        $table = class_basename($this::class);
10
+        $tab = $this->activeTab;
11
+
12
+        return "tables.{$table}_{$tab}_toggled_columns";
13
+    }
14
+
15
+    public function updatedActiveTab(): void
16
+    {
17
+        parent::updatedActiveTab();
18
+
19
+        // Load saved state for new tab or fall back to defaults
20
+        $this->toggledTableColumns = session(
21
+            $this->getTableColumnToggleFormStateSessionKey(),
22
+            $this->getDefaultTableColumnToggleState()
23
+        );
24
+
25
+        $this->updatedToggledTableColumns();
26
+    }
27
+}

+ 1
- 1
app/Filament/Company/Resources/Sales/EstimateResource.php 查看文件

311
                 Tables\Columns\TextColumn::make('total')
311
                 Tables\Columns\TextColumn::make('total')
312
                     ->currencyWithConversion(static fn (Estimate $record) => $record->currency_code)
312
                     ->currencyWithConversion(static fn (Estimate $record) => $record->currency_code)
313
                     ->sortable()
313
                     ->sortable()
314
-                    ->toggleable(),
314
+                    ->alignEnd(),
315
             ])
315
             ])
316
             ->filters([
316
             ->filters([
317
                 Tables\Filters\SelectFilter::make('client')
317
                 Tables\Filters\SelectFilter::make('client')

+ 9
- 4
app/Filament/Company/Resources/Sales/InvoiceResource.php 查看文件

317
                 Tables\Columns\TextColumn::make('due_date')
317
                 Tables\Columns\TextColumn::make('due_date')
318
                     ->label('Due')
318
                     ->label('Due')
319
                     ->asRelativeDay()
319
                     ->asRelativeDay()
320
-                    ->sortable(),
320
+                    ->sortable()
321
+                    ->hideOnTabs(['draft']),
321
                 Tables\Columns\TextColumn::make('date')
322
                 Tables\Columns\TextColumn::make('date')
322
                     ->date()
323
                     ->date()
323
                     ->sortable(),
324
                     ->sortable(),
334
                 Tables\Columns\TextColumn::make('total')
335
                 Tables\Columns\TextColumn::make('total')
335
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
336
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
336
                     ->sortable()
337
                     ->sortable()
337
-                    ->toggleable(),
338
+                    ->toggleable()
339
+                    ->alignEnd(),
338
                 Tables\Columns\TextColumn::make('amount_paid')
340
                 Tables\Columns\TextColumn::make('amount_paid')
339
                     ->label('Amount Paid')
341
                     ->label('Amount Paid')
340
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
342
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
341
                     ->sortable()
343
                     ->sortable()
342
-                    ->toggleable(),
344
+                    ->alignEnd()
345
+                    ->showOnTabs(['unpaid']),
343
                 Tables\Columns\TextColumn::make('amount_due')
346
                 Tables\Columns\TextColumn::make('amount_due')
344
                     ->label('Amount Due')
347
                     ->label('Amount Due')
345
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
348
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
346
-                    ->sortable(),
349
+                    ->sortable()
350
+                    ->alignEnd()
351
+                    ->hideOnTabs(['draft']),
347
             ])
352
             ])
348
             ->filters([
353
             ->filters([
349
                 Tables\Filters\SelectFilter::make('client')
354
                 Tables\Filters\SelectFilter::make('client')

+ 2
- 0
app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ListInvoices.php 查看文件

2
 
2
 
3
 namespace App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
3
 namespace App\Filament\Company\Resources\Sales\InvoiceResource\Pages;
4
 
4
 
5
+use App\Concerns\HasTabSpecificColumnToggles;
5
 use App\Enums\Accounting\InvoiceStatus;
6
 use App\Enums\Accounting\InvoiceStatus;
6
 use App\Filament\Company\Resources\Sales\InvoiceResource;
7
 use App\Filament\Company\Resources\Sales\InvoiceResource;
7
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
8
 use App\Filament\Company\Resources\Sales\InvoiceResource\Widgets;
23
 class ListInvoices extends ListRecords
24
 class ListInvoices extends ListRecords
24
 {
25
 {
25
     use ExposesTableToWidgets;
26
     use ExposesTableToWidgets;
27
+    use HasTabSpecificColumnToggles;
26
 
28
 
27
     protected static string $resource = InvoiceResource::class;
29
     protected static string $resource = InvoiceResource::class;
28
 
30
 

+ 14
- 3
app/Filament/Company/Resources/Sales/RecurringInvoiceResource.php 查看文件

291
                     ->description(function (RecurringInvoice $record) {
291
                     ->description(function (RecurringInvoice $record) {
292
                         return $record->getTimelineDescription();
292
                         return $record->getTimelineDescription();
293
                     }),
293
                     }),
294
+                Tables\Columns\TextColumn::make('created_at')
295
+                    ->label('Created')
296
+                    ->date()
297
+                    ->sortable()
298
+                    ->showOnTabs(['draft']),
299
+                Tables\Columns\TextColumn::make('start_date')
300
+                    ->label('First Invoice')
301
+                    ->date()
302
+                    ->sortable()
303
+                    ->showOnTabs(['draft']),
294
                 Tables\Columns\TextColumn::make('last_date')
304
                 Tables\Columns\TextColumn::make('last_date')
295
                     ->label('Last Invoice')
305
                     ->label('Last Invoice')
296
                     ->date()
306
                     ->date()
297
                     ->sortable()
307
                     ->sortable()
298
-                    ->searchable(),
308
+                    ->hideOnTabs(['draft']),
299
                 Tables\Columns\TextColumn::make('next_date')
309
                 Tables\Columns\TextColumn::make('next_date')
300
                     ->label('Next Invoice')
310
                     ->label('Next Invoice')
301
                     ->date()
311
                     ->date()
302
                     ->sortable()
312
                     ->sortable()
303
-                    ->searchable(),
313
+                    ->hideOnTabs(['draft']),
304
                 Tables\Columns\TextColumn::make('total')
314
                 Tables\Columns\TextColumn::make('total')
305
                     ->currencyWithConversion(static fn (RecurringInvoice $record) => $record->currency_code)
315
                     ->currencyWithConversion(static fn (RecurringInvoice $record) => $record->currency_code)
306
                     ->sortable()
316
                     ->sortable()
307
-                    ->toggleable(),
317
+                    ->toggleable()
318
+                    ->alignEnd(),
308
             ])
319
             ])
309
             ->filters([
320
             ->filters([
310
                 Tables\Filters\SelectFilter::make('client')
321
                 Tables\Filters\SelectFilter::make('client')

+ 3
- 0
app/Filament/Company/Resources/Sales/RecurringInvoiceResource/Pages/ListRecurringInvoices.php 查看文件

2
 
2
 
3
 namespace App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages;
3
 namespace App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages;
4
 
4
 
5
+use App\Concerns\HasTabSpecificColumnToggles;
5
 use App\Enums\Accounting\RecurringInvoiceStatus;
6
 use App\Enums\Accounting\RecurringInvoiceStatus;
6
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource;
7
 use App\Filament\Company\Resources\Sales\RecurringInvoiceResource;
7
 use Filament\Actions;
8
 use Filament\Actions;
12
 
13
 
13
 class ListRecurringInvoices extends ListRecords
14
 class ListRecurringInvoices extends ListRecords
14
 {
15
 {
16
+    use HasTabSpecificColumnToggles;
17
+
15
     protected static string $resource = RecurringInvoiceResource::class;
18
     protected static string $resource = RecurringInvoiceResource::class;
16
 
19
 
17
     protected function getHeaderActions(): array
20
     protected function getHeaderActions(): array

+ 14
- 6
app/Models/Accounting/RecurringInvoice.php 查看文件

200
         return $this->start_date?->gte(today()) ?? false;
200
         return $this->start_date?->gte(today()) ?? false;
201
     }
201
     }
202
 
202
 
203
-    public function getScheduleDescription(): string
203
+    public function getScheduleDescription(): ?string
204
     {
204
     {
205
+        if (! $this->hasSchedule()) {
206
+            return null;
207
+        }
208
+
205
         $frequency = $this->frequency;
209
         $frequency = $this->frequency;
206
 
210
 
207
         return match (true) {
211
         return match (true) {
215
 
219
 
216
             $frequency->isCustom() => $this->getCustomScheduleDescription(),
220
             $frequency->isCustom() => $this->getCustomScheduleDescription(),
217
 
221
 
218
-            default => 'Not Configured',
222
+            default => null,
219
         };
223
         };
220
     }
224
     }
221
 
225
 
238
         return "Repeat every {$interval}{$dayDescription}";
242
         return "Repeat every {$interval}{$dayDescription}";
239
     }
243
     }
240
 
244
 
241
-    public function getEndDescription(): string
245
+    public function getEndDescription(): ?string
242
     {
246
     {
243
         if (! $this->end_type) {
247
         if (! $this->end_type) {
244
-            return 'Not configured';
248
+            return null;
245
         }
249
         }
246
 
250
 
247
         return match (true) {
251
         return match (true) {
251
 
255
 
252
             $this->end_type->isOn() && $this->end_date => 'On ' . $this->end_date->toDefaultDateFormat(),
256
             $this->end_type->isOn() && $this->end_date => 'On ' . $this->end_date->toDefaultDateFormat(),
253
 
257
 
254
-            default => 'Not configured'
258
+            default => null,
255
         };
259
         };
256
     }
260
     }
257
 
261
 
258
-    public function getTimelineDescription(): string
262
+    public function getTimelineDescription(): ?string
259
     {
263
     {
264
+        if (! $this->hasSchedule()) {
265
+            return null;
266
+        }
267
+
260
         $parts = [];
268
         $parts = [];
261
 
269
 
262
         if ($this->start_date) {
270
         if ($this->start_date) {

+ 4
- 0
app/Providers/FilamentCompaniesServiceProvider.php 查看文件

276
                 ->filtersFormWidth(MaxWidth::Small)
276
                 ->filtersFormWidth(MaxWidth::Small)
277
                 ->filtersTriggerAction(fn (Tables\Actions\Action $action) => $action->slideOver());
277
                 ->filtersTriggerAction(fn (Tables\Actions\Action $action) => $action->slideOver());
278
         }, isImportant: true);
278
         }, isImportant: true);
279
+
280
+        Tables\Columns\TextColumn::configureUsing(function (Tables\Columns\TextColumn $column): void {
281
+            $column->placeholder('–');
282
+        });
279
     }
283
     }
280
 
284
 
281
     /**
285
     /**

+ 17
- 0
app/Providers/MacroServiceProvider.php 查看文件

19
 use Filament\Forms\Components\TextInput;
19
 use Filament\Forms\Components\TextInput;
20
 use Filament\Infolists\Components\TextEntry;
20
 use Filament\Infolists\Components\TextEntry;
21
 use Filament\Tables\Columns\TextColumn;
21
 use Filament\Tables\Columns\TextColumn;
22
+use Filament\Tables\Contracts\HasTable;
22
 use Illuminate\Support\Carbon;
23
 use Illuminate\Support\Carbon;
23
 use Illuminate\Support\ServiceProvider;
24
 use Illuminate\Support\ServiceProvider;
24
 
25
 
113
                 });
114
                 });
114
         });
115
         });
115
 
116
 
117
+        TextColumn::macro('hideOnTabs', function (array $tabs): static {
118
+            $this->toggleable(isToggledHiddenByDefault: function (HasTable $livewire) use ($tabs) {
119
+                return in_array($livewire->activeTab, $tabs);
120
+            });
121
+
122
+            return $this;
123
+        });
124
+
125
+        TextColumn::macro('showOnTabs', function (array $tabs): static {
126
+            $this->toggleable(isToggledHiddenByDefault: function (HasTable $livewire) use ($tabs) {
127
+                return ! in_array($livewire->activeTab, $tabs);
128
+            });
129
+
130
+            return $this;
131
+        });
132
+
116
         TextColumn::macro('defaultDateFormat', function (): static {
133
         TextColumn::macro('defaultDateFormat', function (): static {
117
             $localization = Localization::firstOrFail();
134
             $localization = Localization::firstOrFail();
118
 
135
 

+ 9
- 0
resources/css/filament/company/theme.css 查看文件

18
     display: inline-flex;
18
     display: inline-flex;
19
 }
19
 }
20
 
20
 
21
+/* End Alignment sortable column enhancement */
22
+.fi-ta-header-cell:has(button.justify-end > svg.fi-ta-header-cell-sort-icon) {
23
+    padding-right: 0.25rem;
24
+}
25
+
26
+.fi-ta-cell:has(.fi-ta-col-wrp > .justify-end) {
27
+    padding-right: 1rem;
28
+}
29
+
21
 :not(.dark) .fi-body {
30
 :not(.dark) .fi-body {
22
     position: relative;
31
     position: relative;
23
     background-color: #E8E9EB;
32
     background-color: #E8E9EB;

Loading…
取消
儲存