wsmallnews / filament-nestedset
Filament nestedset build on kalnoy/nestedset
Fund package maintenance!
Wsmallnews
Requires
- php: ^8.1
- filament/filament: ^3.0
- kalnoy/nestedset: ^6.0
- spatie/laravel-package-tools: ^1.15.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.9
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.0
- pestphp/pest: ^2.1
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/laravel-ray: ^1.26
This package is auto-updated.
Last update: 2025-08-18 14:56:50 UTC
README
Filament tree build on kalnoy/nestedset, support multi language. support Multi-tenancy
Installation
You can install the package via composer:
composer require wsmallnews/filament-nestedset
You can publish the config file with:
php artisan vendor:publish --tag="filament-nestedset-config"
Optionally, you can publish the views using
php artisan vendor:publish --tag="filament-nestedset-views"
Multi language support, you can publish the language files using
php artisan vendor:publish --tag=sn-filament-nestedset-lang
This is the contents of the published config file:
return [ /** * Restrict deletion of nodes with children */ 'allow_delete_parent' => false, /* * Restrict deletion of root nodes, even if 'allow_delete_parent' is true, root nodes can be deleted. */ 'allow_delete_root' => false, ];
Prepare your model
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Kalnoy\Nestedset\NodeTrait; ... class YouModel extends Model { use NodeTrait; ... }
You should add fields to your model. replacing your_model_table
with the name of your model table
Add fields in the new model
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('your_model_table', function (Blueprint $table) { ... $table->nestedSet(); ... }); } };
Add fields to an existing model
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::table('your_model_table', function (Blueprint $table) { $table->nestedSet(); }); } };
And run the migration
php artisan migrate
Usage
Create the nestedset page
php artisan make:filament-nestedset-page
Please define attribute name of the nodes in your tree, eg. title or name
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static string $recordTitleAttribute = 'name'; ... }
Define form schema
If the schema for create and edit are the same, you can define the schema method.
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected function schema(array $arguments): array { return [ // ]; } ... }
If the schema for create and edit are different, you can define createSchema and editSchema methods separately.
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected function createSchema(array $arguments): array { return [ // ]; } protected function editSchema(array $arguments): array { return [ // ]; } ... }
Define the prompt text when the tree is empty
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... public string $emptyLabel = 'no test data'; ... }
Other customizable properties
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static ?string $model = NavigationModel::class; protected static ?string $modelLabel = 'Test Management'; protected static ?string $title = 'Page Title'; protected static ?string $navigationLabel = 'Test Navigation'; protected static ?string $navigationGroup = 'Test Group'; protected static ?string $slug = 'tests'; protected static string $recordTitleAttribute = 'name'; protected static ?string $pluralModelLabel = 'Test Management'; protected static ?int $navigationSort = 1; ... }
Display additional attributes
You can define additional attributes to display in each row through the infolistSchema method
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected function infolistSchema(): array { return []; } ... }
By default, the infolist will be displayed at the md
breakpoint and above. You can change the display breakpoint by setting $infolistHiddenEndpoint
.
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static string $infolistHiddenEndpoint = 'lg'; ... }
By default, the infolist will be right-aligned. You can change the alignment by setting $infolistAlignment
.
<?php namespace App\Filament\Pages; use Filament\Support\Enums\Alignment; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static Alignment $infolistAlignment = Alignment::Left; ... }
Advanced features
Multi-tenancy support
Multi-tenancy features is supported by default. If your filament panel supports multi-tenancy, you need to add the getScopeAttributes method to your model and add the team_id field.
Multi-tenancy features is implemented based on kalnoy/nestedset
scoped feature. You can view detailed documentation here
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; ... class YouModel extends Model { ... public function getScopeAttributes(): array { return ['team_id', ...]; } ... }
If your filament panel supports multi-tenancy, but the current page doesn't need to distinguish tenancy, just set $isScopedToTenant = false
in the page.
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static bool $isScopedToTenant = false; ... }
Tabs support
Tabs are implemented based on kalnoy/nestedset
scoped feature. You can view detailed documentation here
Set the associated tab field name using tabFieldName. And setting tabs array, you don't need to add the current tab condition on the tab, as the tab condition will be automatically appended to kalnoy/nestedset
scoping parameters.
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... protected static ?string $tabFieldName = 'type'; public function getTabs(): array { return [ 'web' => Tab::make()->label('Website Navigation'), 'shop' => Tab::make()->label('Shop Navigation') ]; } ... }
You need to add the getScopeAttributes method to your model and add the field set by tabFieldName (type
in this case).
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; ... class YouModel extends Model { ... public function getScopeAttributes(): array { return ['type', ...]; } ... }
Additional scope parameters
If you need to set additional scope parameters for kalnoy/nestedset
scoping
Define the nestedScoped
method
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... public function nestedScoped() { return ['category_id' => 5]; } ... }
You need to add the getScopeAttributes method to your model and add the field set.
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; ... class YouModel extends Model { ... public function getScopeAttributes(): array { return ['category_id', ...]; } ... }
Add custom eloquent query conditions
<?php namespace App\Filament\Pages; use Wsmallnews\FilamentNestedset\Pages\NestedsetPage; class Test extends NestedsetPage { ... public function getEloquentQuery($query) { return $query->where('status', 'normal'); } ... }
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.