filamentphp / filament

A collection of beautiful full-stack components for Laravel. The perfect starting point for your next app. Using Livewire, Alpine.js and Tailwind CSS.
https://filamentphp.com
MIT License
19.47k stars 2.97k forks source link

Repeater's schema method does not bring the current record #14679

Open josevictor-ultrahaus opened 3 weeks ago

josevictor-ultrahaus commented 3 weeks ago

Package

filament/filament

Package Version

3.2.115

Laravel Version

11.9

Livewire Version

3.0

PHP Version

8.2.16

Problem description

It is not possible to access the current item within the schema method in the Repeater, and the entire Repeater state of all items is returned.

->itemLabel(function (array $state) {
                        return new HtmlString(
                            view('filament.components.service-repeater-item')
                                ->with('state', $state)
                                ->render()
                        );
                    })

If you print the $state inside the itemLabel method, you will see something like:

array:3 [▼ // app/Livewire/Opportunity/OpportunityQuote.php:39
  "icon" => "heroicon-m-archive-box"
  "name" => "Move"
  "description" => "Sea, Air, Road, Storage"
]

Expected behavior

When using:

->schema(function (array $state) {
        dd($state);

The idea was that only the current item would be returned so that it could be used in dynamic components, or that at least the uuid of the current item would be included, so that it could be accessed.

If you print $state, you will see something like:

array:1 [▼ // app/Livewire/Opportunity/OpportunityQuote.php:46
  "efa34400-a95d-4410-a695-e293184ecd3b" => array:3 [▼
    "icon" => "fas-paw"
    "name" => "Pet Transportation"
    "description" => "Dog, Cat, etc..."
  ]
]

So, I need to somehow do the following action:

->schema(function (array $state) {
                        return [
                            // Livewire::make(OpportunityQuoteItem::class, [
                            //     'item' => $state
                            // ]),
                        ];
                    })

Or, do we have some other way to send the data to a custom Livewire component within Repeater?

In the documentation https://filamentphp.com/docs/3.x/forms/advanced#injecting-the-current-state-of-a-field it says that the array $state would give me access to the item current , not the entire state.

Steps to reproduce

Crie um Repeater assim:

Repeater::make('quote_services_repeater')
                    ->label('Serviços Adicionados')
                    ->itemLabel(function (array $state) {
                        dump($state);
                        return new HtmlString(
                            view('filament.components.service-repeater-item')
                                ->with('state', $state)
                                ->render()
                        );
                    })
                    ->schema(function (array $state) {
                        dump($state);

                        return [

                            // Livewire::make(OpportunityQuoteItem::class, [
                            //     'item' => $state
                            // ]),
                        ];
                    })

Tente acessar a última linha adicionada dentro do método schema da forma correta, para que funcione durante a renderização etc

Reproduction repository (issue will be closed if this is not valid)

https://github.com/stuartcusackie/filament-wizard-header-scroll-issue

Relevant log output

No response

Donate 💰 to fund this issue

Fund with Polar

github-actions[bot] commented 3 weeks ago

Hey @josevictor-ultrahaus! We're sorry to hear that you've hit this issue. 💛

However, it looks like you forgot to fill in the reproduction repository URL. Can you edit your original post and then we'll look at your issue?

We need a public GitHub repository which contains a Laravel app with the minimal amount of Filament code to reproduce the problem. Please do not link to your actual project, what we need instead is a minimal reproduction in a fresh project without any unnecessary code. This means it doesn't matter if your real project is private / confidential, since we want a link to a separate, isolated reproduction. That would allow us to download it and review your bug much easier, so it can be fixed quicker. Please make sure to include a database seeder with everything we need to set the app up quickly.

github-actions[bot] commented 3 weeks ago

Thank you for providing reproduction steps! Reopening the issue now.