Rewrite RecipeHistory without InteractsWithTable to fix 404
Deploy / deploy (push) Successful in 17s
Deploy / deploy (push) Successful in 17s
The Filament table boot lifecycle (bootedInteractsWithTable) fires before mount(), causing issues with typed $record properties on custom resource pages. Replaced with a plain Page + Blade view rendering recipes directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
dd710cb1c0
commit
6f78b22285
2 files changed
+55
-35
No files matched your search
@@ -7,29 +7,28 @@ use App\Models\Product;
|
|||||||
use App\Models\Recipe;
|
use App\Models\Recipe;
|
||||||
use Filament\Actions\Action;
|
use Filament\Actions\Action;
|
||||||
use Filament\Resources\Pages\Page;
|
use Filament\Resources\Pages\Page;
|
||||||
use Filament\Tables\Columns\IconColumn;
|
|
||||||
use Filament\Tables\Columns\TextColumn;
|
|
||||||
use Filament\Tables\Concerns\InteractsWithTable;
|
|
||||||
use Filament\Tables\Contracts\HasTable;
|
|
||||||
use Filament\Tables\Table;
|
|
||||||
|
|
||||||
class RecipeHistory extends Page implements HasTable
|
class RecipeHistory extends Page
|
||||||
{
|
{
|
||||||
use InteractsWithTable;
|
|
||||||
|
|
||||||
protected static string $resource = ProductResource::class;
|
protected static string $resource = ProductResource::class;
|
||||||
protected static string $view = 'filament.user.resources.product-resource.pages.recipe-history';
|
protected static string $view = 'filament.user.resources.product-resource.pages.recipe-history';
|
||||||
|
|
||||||
public Product $record;
|
public int $recordId;
|
||||||
|
public string $productTitle = '';
|
||||||
|
public int $currentRecipeId = 0;
|
||||||
|
|
||||||
public function mount(int|string $record): void
|
public function mount(int|string $record): void
|
||||||
{
|
{
|
||||||
$this->record = Product::with('recipe')->findOrFail($record);
|
$product = Product::findOrFail($record);
|
||||||
|
|
||||||
|
$this->recordId = $product->id;
|
||||||
|
$this->productTitle = $product->title;
|
||||||
|
$this->currentRecipeId = (int) $product->recipes_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
{
|
{
|
||||||
return 'Rezept-Versionen · ' . $this->record->title;
|
return 'Rezept-Versionen · ' . $this->productTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getHeaderActions(): array
|
protected function getHeaderActions(): array
|
||||||
@@ -39,34 +38,16 @@ class RecipeHistory extends Page implements HasTable
|
|||||||
->label('Zurück zum Produkt')
|
->label('Zurück zum Produkt')
|
||||||
->icon('heroicon-o-arrow-left')
|
->icon('heroicon-o-arrow-left')
|
||||||
->color('gray')
|
->color('gray')
|
||||||
->url(ProductResource::getUrl('edit', ['record' => $this->record])),
|
->url(fn () => ProductResource::getUrl('edit', ['record' => $this->recordId])),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function table(Table $table): Table
|
public function getRecipes(): \Illuminate\Support\Collection
|
||||||
{
|
{
|
||||||
return $table
|
return Recipe::query()
|
||||||
->query(fn () => Recipe::query()
|
->where('product_id', $this->recordId)
|
||||||
->where('product_id', $this->record->id)
|
|
||||||
->with('spices')
|
->with('spices')
|
||||||
->orderByDesc('version')
|
->orderByDesc('version')
|
||||||
)
|
->get();
|
||||||
->columns([
|
|
||||||
TextColumn::make('version')
|
|
||||||
->label('Version')
|
|
||||||
->formatStateUsing(fn ($state) => 'v' . $state)
|
|
||||||
->badge()
|
|
||||||
->color(fn (Recipe $recipe) => $recipe->id === $this->record->recipes_id ? 'success' : 'gray'),
|
|
||||||
TextColumn::make('spices_summary')
|
|
||||||
->label('Zutaten')
|
|
||||||
->state(fn (Recipe $recipe) =>
|
|
||||||
$recipe->spices->map(fn ($s) => $s->name . ' ' . $s->pivot->amount_in_percent . '%')->implode(' · ')
|
|
||||||
),
|
|
||||||
TextColumn::make('created_at')
|
|
||||||
->label('Erstellt am')
|
|
||||||
->dateTime('d.m.Y H:i')
|
|
||||||
->sortable(),
|
|
||||||
])
|
|
||||||
->paginated(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+40
-1
@@ -1,3 +1,42 @@
|
|||||||
<x-filament-panels::page>
|
<x-filament-panels::page>
|
||||||
{{ $this->table }}
|
<div class="fi-ta rounded-xl bg-white shadow-sm ring-1 ring-gray-950/5 dark:bg-gray-900 dark:ring-white/10">
|
||||||
|
<table class="w-full table-auto divide-y divide-gray-200 dark:divide-white/5 text-sm">
|
||||||
|
<thead>
|
||||||
|
<tr class="bg-gray-50 dark:bg-white/5">
|
||||||
|
<th class="px-4 py-3 text-left font-medium text-gray-600 dark:text-gray-400">Version</th>
|
||||||
|
<th class="px-4 py-3 text-left font-medium text-gray-600 dark:text-gray-400">Zutaten</th>
|
||||||
|
<th class="px-4 py-3 text-left font-medium text-gray-600 dark:text-gray-400">Erstellt am</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-100 dark:divide-white/5">
|
||||||
|
@forelse ($this->getRecipes() as $recipe)
|
||||||
|
<tr class="hover:bg-gray-50 dark:hover:bg-white/5">
|
||||||
|
<td class="px-4 py-3">
|
||||||
|
@if ($recipe->id === $this->currentRecipeId)
|
||||||
|
<span class="inline-flex items-center rounded-full bg-green-100 px-2 py-0.5 text-xs font-semibold text-green-700 dark:bg-green-500/20 dark:text-green-400">
|
||||||
|
v{{ $recipe->version }}
|
||||||
|
</span>
|
||||||
|
@else
|
||||||
|
<span class="inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-semibold text-gray-600 dark:bg-white/10 dark:text-gray-400">
|
||||||
|
v{{ $recipe->version }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
<td class="px-4 py-3 text-gray-700 dark:text-gray-300">
|
||||||
|
{{ $recipe->spices->map(fn ($s) => $s->name . ' ' . $s->pivot->amount_in_percent . '%')->implode(' · ') ?: '—' }}
|
||||||
|
</td>
|
||||||
|
<td class="px-4 py-3 text-gray-500 dark:text-gray-400">
|
||||||
|
{{ $recipe->created_at->format('d.m.Y H:i') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="3" class="px-4 py-8 text-center text-gray-400">
|
||||||
|
Keine Rezeptversionen vorhanden.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</x-filament-panels::page>
|
</x-filament-panels::page>
|
||||||
Reference in new issue
Block a user