Nested Builder Form Field plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Nested Builder Form Field

Add nested Builder to your forms

Tags: Form Field
Supported versions:
3.x
Georges OLIVARES avatar Author: Georges OLIVARES

Documentation

Preview

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Filament V3 Form plugin. Add a new feature for Nested Builder.

#Installation

You can install the package via composer:

composer require thiktak/filament-nested-builder-form

#Usage

On any Form :

  1. Call NestedBuilder instead of Builder
  2. All all your Builder configuration inside nestedConfiguration(Closure).
  3. Use nestedSchema(Closure) instad of schema(Closure | array)

Use $builder->getLevel() of NestedSubBuilder to know where you are (level 1 to n)

Note:

  • NestedBuilder like Builder works with an array/json data.

use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

        NestedBuilder::make('array_configuration')
            // Add configuration to Builder & sub-builder
            ->nestedConfiguration(function (NestedSubBuilder $builder) {
                // Apply only for the root level
                $builder->blockNumbers($builder->getLevel() == 1);

                // Apply for all others levels
                $builder->columnSpanFull(); // full width
            })

            // Replace schema() by nestedSchema
            ->nestedSchema(function (NestedSubBuilder $builder) { // Closure is mandatory
                return [
                    Block::make('group')
                        ->schema([
                            Select::make('title')
                                ->required(),

                            // Call builder importer and call it children
                            $builder->importNestedBlocks('children'),
                        ]),

                    Block::make('rule')
                        ->schema([
                            TextInput::make('field')
                                ->required(),
                        ])
                ];
            });

image

#Example

One concrete example of this package, allow you to create a nested AND/OR field/condition/value like complexe group SQL queries.

use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

        NestedBuilder::make('array_configuration')
            ->nestedConfiguration(function (NestedSubBuilder $builder) {
                $builder->blockNumbers($builder->getLevel() == 1);
                $builder->columnSpanFull(); // full width
            })
            ->nestedSchema(function (NestedSubBuilder $builder) {
                return [
                    Block::make('group')
                        ->label(sprintf('Group (%s)', $builder->getLevel()))
                        ->schema([
                            Select::make('condition')
                                ->options(['and' => 'AND', 'or' => 'OR'])
                                ->default('and')
                                ->required(),

                            $builder->importNestedBlocks('children'),
                        ])
                        ->columns(1),

                    Block::make('rule')
                        ->label(sprintf('Rule (%s)', $builder->getLevel()))
                        ->schema([
                            TextInput::make('field')
                                ->required()
                                ->columnSpan(2),

                            Select::make('sign')
                                ->options(['=', '<>', '>', '<', 'in(,)'])
                                ->default('=')
                                ->required(),

                            TextInput::make('value')
                                ->columnSpan(3),
                        ])
                        ->columns(6)
                ];
            });

image

#Example of advanced usage of this package:

image

#How it work ?

You can achieve the same behavior with few lines of code.

  1. Create a function with your builder ($nested = fn($builder) => [...];)
  2. On your schema, pass the function that call itself inside a lambda function (fn() => $nested($nested)).
  3. On you builder function, add a new Builder with identical logic (Builder::make()->schema(fn() => $builder($builder)))

Example:

use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedBuilder;
use Thiktak\FilamentNestedBuilderForm\Forms\Components\NestedSubBuilder;
// ...

    public static function form(Form $form): Form
    {
        $nested = function ($builder) {
            return [
                Block::make('group')
                    ->schema([
                        Select::make('condition')
                            ->options(['and' => 'AND', 'or' => 'OR'])
                            ->default('and')
                            ->required(),

                        \Filament\Forms\Components\Builder::make('children')
                            ->schema(fn () => $builder($builder))
                    ])
                    ->columns(1),

                Block::make('rule')
                    ->schema([
                        TextInput::make('field')
                            ->required()
                            ->columnSpan(2),

                        Select::make('sign')
                            ->options(['=', '<>', '>', '<', 'in(,)'])
                            ->default('=')
                            ->required(),

                        TextInput::make('value')
                            ->columnSpan(3),
                    ])
                    ->columns(6)
            ];
        };

        
        return $form
            ->schema([
                \Filament\Forms\Components\Builder::make('array_configuration')
                    ->schema(fn () => $nested($nested))
            ]);
    }

Use thiktak/filament-nested-builder-form if you want to implement a rich SQL selector & query builder.

#Testing

composer test

#Changelog

Please see CHANGELOG for more information on what has changed recently.

#Contributing

Please see CONTRIBUTING for details.

#Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

#Credits

#License

The MIT License (MIT). Please see License File for more information.

The author

Georges OLIVARES avatar Author: Georges OLIVARES

Thiktak is a SAP software developer also passionate about PHP and Laravel.

Plugins
2
Stars
19

From the same author