schema([ Forms\Components\TextInput::make('title') ->label('Name') ->required(), FileUpload::make('images') ->label('Bilder') ->multiple() ->image() ->maxFiles(15) ->directory('product-images') ->columnSpanFull(), Forms\Components\Textarea::make('description') ->label('Beschreibung'), Forms\Components\Textarea::make('package_content') ->label('Inhaltsangabe'), Forms\Components\Select::make('recipes_id') ->label('Rezept') ->native(false) ->searchable() ->relationship('recipe', 'name') ->required(), Repeater::make('sizes') ->schema([ TextInput::make('gtin') ->label('GTIN'), TextInput::make('description') ->label('Bezeichnung'), Select::make('packing_id') ->label('Verpackung') ->options(function () { return Packing::all()->mapWithKeys(function ($packing) { return [$packing->id => $packing->name . ' (' . $packing->size . ')']; }); }) ->searchable() ->required(), TextInput::make('price') ->label('Preis (in EUR)') ->numeric() ->required(), ]) ->label('Größen & Preise') ->columns(2) ->addActionLabel('Option hinzufügen') ->afterStateHydrated(function ($state, $set, $record) { if ($record) { // Load the spices relationship with pivot data $record->load('sizes'); // Map the spices and their pivot data to the format the repeater expects $sizesData = $record->sizes->map(function ($size) { return [ 'packing_id' => $size->id, 'price' => $size->pivot->price, 'description' => $size->pivot->description, ]; })->toArray(); // Set the state for the repeater field to the mapped spices data $set('sizes', $sizesData); } return $state; }), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\ImageColumn::make('images') ->label('Bild') ->limit(1), Tables\Columns\TextColumn::make('title') ->label('Name') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('recipe.name') ->label('Rezept'), ]); } public static function getPages(): array { return [ 'index' => Pages\ListProducts::route('/'), 'create' => Pages\CreateProduct::route('/create'), 'edit' => Pages\EditProduct::route('/{record}/edit'), ]; } public static function getPluralLabel(): string { return 'Produkte'; } protected function mutateFormDataBeforeCreate(array $data): array { if (isset($data['images'])) { $data['images'] = json_encode($data['images']); } return $data; } protected function mutateFormDataBeforeUpdate(array $data): array { if (isset($data['images'])) { $data['images'] = json_encode($data['images']); } return $data; } public static function getRecord($id) { return Product::with('sizes')->findOrFail($id); // Eager load spices relationship } public static function getTableRecordTitle() { return function ($record) { $images = json_decode($record->images, true); return implode(', ', $images); }; } public static function getActions(): array { return [ Actions\DeleteAction::make(), Action::make('deleteImage') ->action(function ($record, $data) { $images = json_decode($record->images, true); $index = array_search($data['image'], $images); if ($index !== false) { unset($images[$index]); $record->update(['images' => array_values($images)]); } }) ->form([ Forms\Components\Select::make('image') ->options(function ($record) { return array_combine($record->images, $record->images); }) ->required(), ]), ]; } }