Sum the values of all repeater rows
Validate the total against a maximum
Update another field automatically
return $form->schema([
// This field will display the calculated total
Forms\Components\TextInput::make('qnt_allocated')
->label('Total Quantity')
->required()
->numeric()
->suffix('Kg'),
// Repeater of groups
Forms\Components\Repeater::make('groups')
->label('groups:')
->relationship('groups')
->schema([
Forms\Components\TextInput::make('quantity')
->label('group quantity')
->required()
->numeric()
->reactive()
->rules([
fn (Get $get): \Closure => function (string $attribute, $value, \Closure $fail) use ($get) {
$total = collect($get('../../groups'))->sum('quantity');
if ($total > 7000) {
$fail("Total quantity for all groups cannot exceed 7000 kg (Current total: {$total})");
}
},
])
->afterStateUpdated(function ($state, callable $get, callable $set) {
$total = collect($get('../../groups'))->sum('quantity');
$set('../../qnt_allocated', $total);
})
->suffix('Kg'),
])
]);
Enter fullscreen mode
Exit fullscreen mode
Top comments (1)
Nice post! The Filament repeater sum validation is slick, a great solution for form validations.
Have you tried making it work with nested repeaters (repeaters inside repeaters) and how did validation behave?