PHPackages                             coolsam/nested-comments - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. coolsam/nested-comments

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

coolsam/nested-comments
=======================

Add Nested comments/replies to filament forms, infolists and resources

v1.1.1(11mo ago)3110.0k↓28.6%13[6 PRs](https://github.com/coolsam726/nested-comments/pulls)MITPHPPHP ^8.2CI passing

Since Apr 22Pushed 2mo ago2 watchersCompare

[ Source](https://github.com/coolsam726/nested-comments)[ Packagist](https://packagist.org/packages/coolsam/nested-comments)[ Docs](https://github.com/coolsam/nested-comments)[ GitHub Sponsors](https://github.com/coolsam)[ RSS](/packages/coolsam-nested-comments/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (3)Dependencies (13)Versions (7)Used By (0)

Filament Nested Comments &amp; Emoji Reactions
==============================================

[](#filament-nested-comments--emoji-reactions)

[![Latest Version on Packagist](https://camo.githubusercontent.com/0acaea4f0aabbdb57b2446b67c37be0281154772598b05423ae822253449a5b1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f636f6f6c73616d2f6e65737465642d636f6d6d656e74732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/coolsam/nested-comments)[![GitHub Tests Action Status](https://camo.githubusercontent.com/fa831f3dde532756da721931448e2ac584655bdf5a46d47ccf35d1811116ff02/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f636f6f6c73616d3732362f6e65737465642d636f6d6d656e74732f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/coolsam726/nested-comments/actions?query=workflow%3Arun-tests+branch%3Amain)[![GitHub Code Style Action Status](https://camo.githubusercontent.com/96fd8dcbdf1d6fb3b9c2d39b1e71eeacf784d6447b671b38e37e4dc8a53a53a3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f636f6f6c73616d3732362f6e65737465642d636f6d6d656e74732f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/coolsam726/nested-comments/actions?query=workflow%3A%22Fix+PHP+Code+Styling%22+branch%3Amain)[![GitHub PHPStan Action Status](https://camo.githubusercontent.com/82fcdc634be3bf61ed2fc8874d95fa8df5ba0ba5378b97b6b7a54842feb2b824/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f636f6f6c73616d3732362f6e65737465642d636f6d6d656e74732f7068707374616e2e796d6c3f6272616e63683d6d61696e266c6162656c3d7068707374616e267374796c653d666c61742d737175617265)](https://github.com/coolsam726/nested-comments/actions?query=workflow%3APHPStan+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/be9f52cff263c45acbd4639ddf8bd673f345a53c4ff0bc86f1ab1834efd2db52/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f636f6f6c73616d2f6e65737465642d636f6d6d656e74732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/coolsam/nested-comments)

This package allows you to incorporate comments and replies in your Filament forms, infolists, pages, widgets etc, or even simply in your livewire components. Comment replies can be nested as deep as you want, using the Nested Set data structure. Additionally, the package comes with a Reactions feature to enable your users to react to any of your models (e.g comments or posts) with selected emoji reactions.

[![image](https://private-user-images.githubusercontent.com/5610289/435968398-2900e2a4-9ad2-40e2-8819-2650b6d70803.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk2ODM5OC0yOTAwZTJhNC05YWQyLTQwZTItODgxOS0yNjUwYjZkNzA4MDMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjQwMDE2M2VlNTQ5ZDc0ZjhhZDc0YTgxZDVjY2U3MjQwNjIyNGRhZjdhNWViZDY3NmY5MzEyM2ZhMmZkMmQ1NSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Hoqvq36jYN4BhYZCRcw-bES3fkLSiVdXJpGc49qkgwg)](https://private-user-images.githubusercontent.com/5610289/435968398-2900e2a4-9ad2-40e2-8819-2650b6d70803.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk2ODM5OC0yOTAwZTJhNC05YWQyLTQwZTItODgxOS0yNjUwYjZkNzA4MDMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjQwMDE2M2VlNTQ5ZDc0ZjhhZDc0YTgxZDVjY2U3MjQwNjIyNGRhZjdhNWViZDY3NmY5MzEyM2ZhMmZkMmQ1NSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Hoqvq36jYN4BhYZCRcw-bES3fkLSiVdXJpGc49qkgwg)

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require coolsam/nested-comments
```

Run the installation command and follow the prompts:

```
php artisan nested-comments:install
```

During the installation, you will be asked if you would like to publish and replace the config file. This is important especially if you are upgrading the package to a newer version in which the config file structure has changed. No worries, if you have customizations in your config file that you would like to keep, your current config file will be backed up to `config/nested-comments.php.bak` before the new config file is published.

You will also be asked if you would like to re-publish the package's assets. This is also important in case the package's styles and scripts have changed in the new version.

Adjust the configuration file as necessary, then run migrations.

`That's it! You are now ready to add nested comments

Usage: Comments
---------------

[](#usage-comments)

At the very basic level, this package is simply a Livewire Component that takes in a model record which is commentable. Follow the following steps to prepare your model to be commentable or reactable:

1. Add the `HasComments` trait to your model

```
use Coolsam\NestedComments\Concerns\HasComments;

class Conference extends Model
{
    use HasComments;

    // ...
}
```

2. If you would like to be able to react to your model directly as well, add the `HasReactions` trait to your model

```
use Coolsam\NestedComments\Concerns\HasReactions;

class Conference extends Model
{
    use HasReactions;

    // ...
}
```

3. You can now access the comments and reactions of your model in the following ways

### Using the Comments Infolist Entry

[](#using-the-comments-infolist-entry)

```
public static function infolist(Infolist $infolist): Infolist
    {
        return $infolist
            ->schema([
                Section::make('Basic Details')
                    ->schema([
                        TextEntry::make('name'),
                        TextEntry::make('start_date')
                            ->dateTime(),
                        TextEntry::make('end_date')
                            ->dateTime(),
                        TextEntry::make('created_at')
                            ->dateTime(),
                    ]),

                // Add the comments entry
                \Coolsam\NestedComments\Filament\Infolists\CommentsEntry::make('comments'),
            ]);
    }
```

[![image](https://private-user-images.githubusercontent.com/5610289/435956537-da84b49e-66c7-4453-b5d4-b7b18f204bba.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1NjUzNy1kYTg0YjQ5ZS02NmM3LTQ0NTMtYjVkNC1iN2IxOGYyMDRiYmEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTg4MDNlNmY1N2YzZjE5ZmY2YTMwMDMwMTkyMjI0MDczZjk1MWYxZTk5MjJhYmE1NjI0MGQ2ZGEwZGU3ZTU4ZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Uc4gSYRUspQ2O9fiX3rnIQJtIdQKuYV4BRYWc8Sf1Go)](https://private-user-images.githubusercontent.com/5610289/435956537-da84b49e-66c7-4453-b5d4-b7b18f204bba.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1NjUzNy1kYTg0YjQ5ZS02NmM3LTQ0NTMtYjVkNC1iN2IxOGYyMDRiYmEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTg4MDNlNmY1N2YzZjE5ZmY2YTMwMDMwMTkyMjI0MDczZjk1MWYxZTk5MjJhYmE1NjI0MGQ2ZGEwZGU3ZTU4ZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Uc4gSYRUspQ2O9fiX3rnIQJtIdQKuYV4BRYWc8Sf1Go)

### Using the Comments Widget inside a Resource Page (e.g EditRecord)

[](#using-the-comments-widget-inside-a-resource-page-eg-editrecord)

As long as the resource page interacts with the record, the CommentsWidget will resolve the record automatically.

```
class EditConference extends EditRecord
{
    protected static string $resource = ConferenceResource::class;

    protected function getHeaderActions(): array
    {
        return [
            Actions\ViewAction::make(),
            Actions\DeleteAction::make(),
        ];
    }

    protected function getFooterWidgets(): array
    {
        return [
            \Coolsam\NestedComments\Filament\Widgets\CommentsWidget::class,
        ];
    }
}
```

[![image](https://private-user-images.githubusercontent.com/5610289/435958740-bd56d52d-b791-4f24-a202-b0948574d811.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1ODc0MC1iZDU2ZDUyZC1iNzkxLTRmMjQtYTIwMi1iMDk0ODU3NGQ4MTEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZTAxYWE5NDE5NmU1NzhmMjMwNzhkM2U4ODI5OGYxYjlkZjg5Zjk2MmQ1MzQzMGRhMjk4ZWRkYjQ1ZmY3NGM3NSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.LFPg5Keby_To4DIZ_4h9RHW8w2IVwM1PGscKtOH4rH0)](https://private-user-images.githubusercontent.com/5610289/435958740-bd56d52d-b791-4f24-a202-b0948574d811.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1ODc0MC1iZDU2ZDUyZC1iNzkxLTRmMjQtYTIwMi1iMDk0ODU3NGQ4MTEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZTAxYWE5NDE5NmU1NzhmMjMwNzhkM2U4ODI5OGYxYjlkZjg5Zjk2MmQ1MzQzMGRhMjk4ZWRkYjQ1ZmY3NGM3NSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.LFPg5Keby_To4DIZ_4h9RHW8w2IVwM1PGscKtOH4rH0)

### Using the Comments Widget in a custom Filament Page (You have to pass $record manually)

[](#using-the-comments-widget-in-a-custom-filament-page-you-have-to-pass-record-manually)

```
// NOTE: It's up to you how to get your record, as long as you pass it to the widget
public function getRecord(): ?Conference
{
    return Conference::latest()->first();
}

protected function getFooterWidgets(): array
{
    return [
        CommentsWidget::make(['record' => $this->getRecord()])
    ];
}
```

### Using the Comments Page Action in a Resource Page (which interacts with $record)

[](#using-the-comments-page-action-in-a-resource-page-which-interacts-with-record)

```
namespace App\Filament\Resources\ConferenceResource\Pages;

use App\Filament\Resources\ConferenceResource;
use Coolsam\NestedComments\Filament\Actions\CommentsAction;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
use Illuminate\Database\Eloquent\Model;

class ViewConference extends ViewRecord
{
    protected static string $resource = ConferenceResource::class;

    protected function getHeaderActions(): array
    {
        return [
            CommentsAction::make()
                ->badgeColor('danger')
                ->badge(fn(Model $record) => $record->getAttribute('comments_count')),
            Actions\EditAction::make(),
        ];
    }
}
```

[![image](https://private-user-images.githubusercontent.com/5610289/435959741-678d3f1e-b3f9-4a77-b263-af5538c72e2b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1OTc0MS02NzhkM2YxZS1iM2Y5LTRhNzctYjI2My1hZjU1MzhjNzJlMmIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NWU0YjU2YzE3MjMxN2Q0OGQ5NDVkMzdjMDJlNDJiMDdlNjJiMWM1YzliMDM5NmJjNTUxYjhjNmQxYTY2NWUyOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.N9e6_RQ4O9U_1kMJsbrFbnm2U-xykH8M330zHh_POiw)](https://private-user-images.githubusercontent.com/5610289/435959741-678d3f1e-b3f9-4a77-b263-af5538c72e2b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1OTc0MS02NzhkM2YxZS1iM2Y5LTRhNzctYjI2My1hZjU1MzhjNzJlMmIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NWU0YjU2YzE3MjMxN2Q0OGQ5NDVkMzdjMDJlNDJiMDdlNjJiMWM1YzliMDM5NmJjNTUxYjhjNmQxYTY2NWUyOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.N9e6_RQ4O9U_1kMJsbrFbnm2U-xykH8M330zHh_POiw)

[![image](https://private-user-images.githubusercontent.com/5610289/435959967-372c6390-ea4e-4d19-8943-784506126cc1.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1OTk2Ny0zNzJjNjM5MC1lYTRlLTRkMTktODk0My03ODQ1MDYxMjZjYzEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OGRiYWI5YTRmOWRhYWM4ZjEzYzVlODQ4YzBjMzExYTg5NWEyMTU5MzgxZDU4ZDI3MjQzZmE4ZmY3NjQ2ZmViMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.HwH2R0pNFXbZTPSStYuZoFcyiPSIH7pU04LNFG8coE8)](https://private-user-images.githubusercontent.com/5610289/435959967-372c6390-ea4e-4d19-8943-784506126cc1.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk1OTk2Ny0zNzJjNjM5MC1lYTRlLTRkMTktODk0My03ODQ1MDYxMjZjYzEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OGRiYWI5YTRmOWRhYWM4ZjEzYzVlODQ4YzBjMzExYTg5NWEyMTU5MzgxZDU4ZDI3MjQzZmE4ZmY3NjQ2ZmViMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.HwH2R0pNFXbZTPSStYuZoFcyiPSIH7pU04LNFG8coE8)

### Using the Comments Page Action in a custom Filament Page (You have to pass $record manually)

[](#using-the-comments-page-action-in-a-custom-filament-page-you-have-to-pass-record-manually)

In this case you will have to pass the record attribute manually.

```
protected function getHeaderActions(): array
{
    return [
        CommentsAction::make()
            ->record($this->getRecord()) // Define the logic for getting your record e.g in $this->getRecord()
            ->badgeColor('danger')
            ->badge(fn(Model $record) => $record->getAttribute('comments_count')),
        Actions\EditAction::make(),
    ];
}
```

### Using the Comments Table Action

[](#using-the-comments-table-action)

```
public static function table(Table $table): Table
{
    return $table
        ->columns([
            // ... Columns
        ])
        ->actions([
            \Coolsam\NestedComments\Filament\Tables\Actions\CommentsAction::make()
                ->button()
                ->badgeColor('danger')
                ->badge(fn(Conference $record) => $record->getAttribute('comments_count')),
            // ... Other actions
        ]);
}
```

[![image](https://private-user-images.githubusercontent.com/5610289/435960433-27eead51-c237-4865-b185-3245629cabe4.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk2MDQzMy0yN2VlYWQ1MS1jMjM3LTQ4NjUtYjE4NS0zMjQ1NjI5Y2FiZTQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MTBiYTMyZDI2MzZiNTgxNTdiM2MxNWIxNTQ5ZDA5NGQ2MGUxYjQ4NjUzZTFlMzMzMDhjMGVjM2YzNjMyZWRkNCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Q14EA1ZxrOAF7bQbBrVV5wnWauVRctWZfFxoYLCAimg)](https://private-user-images.githubusercontent.com/5610289/435960433-27eead51-c237-4865-b185-3245629cabe4.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNTk2MDQzMy0yN2VlYWQ1MS1jMjM3LTQ4NjUtYjE4NS0zMjQ1NjI5Y2FiZTQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MTBiYTMyZDI2MzZiNTgxNTdiM2MxNWIxNTQ5ZDA5NGQ2MGUxYjQ4NjUzZTFlMzMzMDhjMGVjM2YzNjMyZWRkNCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.Q14EA1ZxrOAF7bQbBrVV5wnWauVRctWZfFxoYLCAimg)

### Using the Comments Blade Component ANYWHERE!

[](#using-the-comments-blade-component-anywhere)

This unlocks incredible possibilities. It allows you to render your comments even in your own frontend blade page. All you have to do is simply pass the commentable `$record` to the blade component

```
$record = Conference::find(1); // Get your record from the database then,

```

Alternatively, you could use the Livewire component if you prefer.

```
$record = Conference::find(1); // Get your record from the database then,

```

### Mentions

[](#mentions)

The package uses Filament TipTap Editor which supports mentions. You can mention users in your comments by typing `@` followed by the user's name. In the future, the package will support sending notifications to the mentioned users via database notifications if supported. For more on how to customize the mentions, see the [Package Customization](#customize-how-to-get-the-mention-items) section below.

[![image](https://private-user-images.githubusercontent.com/5610289/436032326-bd7a395a-fc32-4057-b6bc-24763132f555.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAzMjMyNi1iZDdhMzk1YS1mYzMyLTQwNTctYjZiYy0yNDc2MzEzMmY1NTUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NWM3ODJjNjRhNGJjN2QzNzdiZTQzNzFmOGJmNWJiODIyNzBiMTYzZWVmYjdkMjlmODY5NWYxOTRhYTUyZWFlZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.tVFeCJMwA7tqI1wxXoBfoZBM66ylt5kS0ZwsNyp0C_E)](https://private-user-images.githubusercontent.com/5610289/436032326-bd7a395a-fc32-4057-b6bc-24763132f555.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAzMjMyNi1iZDdhMzk1YS1mYzMyLTQwNTctYjZiYy0yNDc2MzEzMmY1NTUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NWM3ODJjNjRhNGJjN2QzNzdiZTQzNzFmOGJmNWJiODIyNzBiMTYzZWVmYjdkMjlmODY5NWYxOTRhYTUyZWFlZCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.tVFeCJMwA7tqI1wxXoBfoZBM66ylt5kS0ZwsNyp0C_E)

Usage: Emoji Reactions
----------------------

[](#usage-emoji-reactions)

This package also allows you to add emoji reactions to your models. You can use the `HasReactions` trait to add reactions to any model. The reactions are stored in a separate table, and you can customize the reactions that are available via the configuration file. The Comments model that powers the comments feature described above already uses emoji reactions.

In order to start using reactions for your model, add the `HasReactions` trait to your model. You can then use the `reactions` method to get the reactions for the model.

```
use Coolsam\NestedComments\Concerns\HasReactions;

class Conference extends Model
{
    use HasReactions;

    // ...
}
```

The above trait adds the `react()` method to your model, allowing you to toggle a reaction for the model. You can also use the `reactions` method to get the reactions for the model.

```
$conference = Conference::find(1);
$comference->react('👍'); // React to the conference with a thumbs up emoji
```

You can also use the `reactions` method to get the reactions for the model.

```
$conference = Conference::find(1);
$reactions = $conference->reactions; // Get the reactions for the conference
```

Other useful methods include

```
/**
* @var \Illuminate\Database\Eloquent\Model&\Coolsam\NestedComments\Concerns\HasReactions $conference
 */
$conference = Conference::find(1);
$conference->total_reactions; // Get the total number of reactions for the conference
$conference->reactions_counts; // Get the no of reactions for each emoji for the model
$conference->my_reactions; // Get the reactions for the current user
$conference->emoji_reactors // Get the list of users who reacted to the model, grouped by emoji
$conference->isAllowed('👍') // check if the app allows the user to react with the specified emoji
$conference->reactions_map // return the map of all the reactions for the model, grouped by emoji. This tells you the number of reactions for each emoji, and whether the current user has reacted with that emoji
```

To interact with the methods above with ease within and even outside Filament, this package comes with the following handy components:

### Reactions Infolist Entry

[](#reactions-infolist-entry)

```
use Coolsam\NestedComments\Filament\Infolists\ReactionsEntry;

public static function infolist(Infolist $infolist): Infolist
{
    return $infolist
        ->schema([
            Section::make('Basic Details')
                ->schema([
                    TextEntry::make('name'),
                    TextEntry::make('start_date')
                        ->dateTime(),
                    TextEntry::make('end_date')
                        ->dateTime(),
                    TextEntry::make('created_at')
                        ->dateTime(),
                        // Add the reactions entry
                    ReactionsEntry::make('reactions')->columnSpanFull(),
                ])->columns(4),
        ]);
}
```

[![image](https://private-user-images.githubusercontent.com/5610289/436026064-06ae7e76-1668-4e92-9a4f-a125f7d94b03.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAyNjA2NC0wNmFlN2U3Ni0xNjY4LTRlOTItOWE0Zi1hMTI1ZjdkOTRiMDMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWRkNjcxZjI3NzQ0MWRkNjhlODVhYzA1MjRmYzZlMTYzMzhjODVhNjc3MDJiYTU0NTY3YThiNmMxMTA5MjU0YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.eh1Ng-moX158PlzLkfsdmxHDJ2eYfhycJE_e4i2lT4A)](https://private-user-images.githubusercontent.com/5610289/436026064-06ae7e76-1668-4e92-9a4f-a125f7d94b03.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAyNjA2NC0wNmFlN2U3Ni0xNjY4LTRlOTItOWE0Zi1hMTI1ZjdkOTRiMDMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWRkNjcxZjI3NzQ0MWRkNjhlODVhYzA1MjRmYzZlMTYzMzhjODVhNjc3MDJiYTU0NTY3YThiNmMxMTA5MjU0YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.eh1Ng-moX158PlzLkfsdmxHDJ2eYfhycJE_e4i2lT4A)

### Reactions Blade Component

[](#reactions-blade-component)

Just include the blade component anywhere in your blade file and pass the model record to it.

```
$record = Conference::find(1); // Get your record from the database then,
```

In your view:

```

```

### Reactions Livewire Component

[](#reactions-livewire-component)

Similar to the blade component, you can use the Livewire component anywhere in your Livewire component and pass the model record to it.

```
$record = Conference::find(1); // Get your record from the database then,
```

In your view:

```

```

The two components can be used anywhere, in resource pages, custom pages, actions, form fields, widgets, livewire components or just plain blade views. Here is a sample screenshot of how the components will be rendered: [![image](https://private-user-images.githubusercontent.com/5610289/436031959-0162f294-0477-454c-ae5c-67424edc207f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAzMTk1OS0wMTYyZjI5NC0wNDc3LTQ1NGMtYWU1Yy02NzQyNGVkYzIwN2YucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NjViMGNmOTMyZmEyYTJkZDQxM2ZiOGVhNjZlZDk2Y2JlYzE4ZmViODVmNWViYzNkN2NmZDUwODZmNTU3ZTc4MyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.o6D86p4F9F9hl_iouMSZn-iBndOPmAQzA_s-prL-GCw)](https://private-user-images.githubusercontent.com/5610289/436031959-0162f294-0477-454c-ae5c-67424edc207f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ3MzQ2MjQsIm5iZiI6MTc3NDczNDMyNCwicGF0aCI6Ii81NjEwMjg5LzQzNjAzMTk1OS0wMTYyZjI5NC0wNDc3LTQ1NGMtYWU1Yy02NzQyNGVkYzIwN2YucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjhUMjE0NTI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NjViMGNmOTMyZmEyYTJkZDQxM2ZiOGVhNjZlZDk2Y2JlYzE4ZmViODVmNWViYzNkN2NmZDUwODZmNTU3ZTc4MyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.o6D86p4F9F9hl_iouMSZn-iBndOPmAQzA_s-prL-GCw)

Package Customization
---------------------

[](#package-customization)

You can customize the package by changing most of the default values in the config file after publishing it. Additionally, you can customize how the package interacts with your models by overriding some methods in your commentable model.

### Customize how to get the Comment Author's Name

[](#customize-how-to-get-the-comment-authors-name)

You can customize how to get the comment author's name by overriding the `getUserName` method in your commentable model. By default, the package uses the `name` attribute of the user model, but you can change this to any other attribute or method that returns a string.

This name will be displayed in the comment card, and it will also be used to mention the user in the comment text.

```
// e.g in your Post model or any other model that uses the HasComments trait
use Coolsam\NestedComments\Concerns\HasComments;

public function getUserName(Model|Authenticatable|null $user): string
{
    return $user?->getAttribute('username') ?? $user?->getAttribute('guest_name') ?? 'Guest';
}
```

### Customize the User's Avatar

[](#customize-the-users-avatar)

You can customize the user's avatar by overriding the `getUserAvatar` method in your commentable model.

By default, the package uses [ui-avatars](https://ui-avatars.com) to generate the avatar based on the user's name, but you can change this to any other method that returns a URL to the user's avatar image.

```
// e.g in your Post model or any other model that uses the HasComments trait
use Coolsam\NestedComments\Concerns\HasComments;

public function getUserAvatar(Model|Authenticatable|string|null $user): ?string
{
//    return 'https://yourprofile.url.png';
    return $user->getAttribute('profile_url') // get your user's profile url here, assuming you have defined it in your user's model.
}
```

### Customize how to get the Mention Items

[](#customize-how-to-get-the-mention-items)

You can customize how to get the mention items by overriding and changing the `getMentionsQuery` method in your commentable model. By default, the package gets mention items from all users in your database. For example, if you would only like to mention users who have commented on the current thread, you can do so by changing the method to return only those users. There is a handy method included in the default class to achieve this. Alternatively, you can go wild and mention fruits instead of users! The choice is within your freedom.

```
// e.g in your Post model or any other model that uses the HasComments trait
use Coolsam\NestedComments\Concerns\HasComments;

public function getMentionsQuery(string $query): Builder
{
    return app(NestedComments::class)->getCurrentThreadUsersQuery($query, $this);
}
```

### Customize the Supported Emoji Reactions

[](#customize-the-supported-emoji-reactions)

You can customize the supported emoji reactions by changing the `reactions` array in the config file. Decent defaults are provided, but you can change them to any emojis you prefer.

```
return [
    '👍',
    '❤️',
    '😂',
    '😮',
    '😢',
    '😡',
];
```

Testing
-------

[](#testing)

```
composer test
```

Open Source Dependencies
------------------------

[](#open-source-dependencies)

This package uses the following awesome open source packages, among many others under the hood:

- [Filament](https://filamentphp.com/)
- [Livewire](https://livewire.laravel.com/)
- [Laravel](https://laravel.com/)
- [AlpineJS](https://alpinejs.dev/)
- [Laravel NestedSet](https://github.com/lazychaser/laravel-nestedset)
- [Filament Tiptap Editor](https://github.com/awcodes/filament-tiptap-editor)

I am grateful for the work that has been put into these packages. They have made it possible to build this package in a short time.

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Please review [our security policy](../../security/policy) on how to report security vulnerabilities.

Credits
-------

[](#credits)

- [Sam Maosa](https://github.com/coolsam726)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

47

—

FairBetter than 94% of packages

Maintenance71

Regular maintenance activity

Popularity37

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 93.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~24 days

Total

3

Last Release

343d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5610289?v=4)[Sam Maosa](/maintainers/coolsam726)[@coolsam726](https://github.com/coolsam726)

---

Top Contributors

[![coolsam726](https://avatars.githubusercontent.com/u/5610289?v=4)](https://github.com/coolsam726 "coolsam726 (109 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (4 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (3 commits)")[![yagrasdemonde](https://avatars.githubusercontent.com/u/35835849?v=4)](https://github.com/yagrasdemonde "yagrasdemonde (1 commits)")

---

Tags

laravelcoolsamnested-comments

###  Code Quality

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/coolsam-nested-comments/health.svg)

```
[![Health](https://phpackages.com/badges/coolsam-nested-comments/health.svg)](https://phpackages.com/packages/coolsam-nested-comments)
```

###  Alternatives

[guava/calendar

Adds support for vkurko/calendar to Filament PHP.

298241.0k3](/packages/guava-calendar)[bezhansalleh/filament-google-analytics

Google Analytics integration for FilamentPHP

205144.8k5](/packages/bezhansalleh-filament-google-analytics)[coolsam/flatpickr

Flatpickr input for Filamentphp

96205.9k2](/packages/coolsam-flatpickr)[jibaymcs/filament-tour

Bring the power of DriverJs to your Filament panels and start a tour !

12247.8k](/packages/jibaymcs-filament-tour)[marcelweidum/filament-expiration-notice

Customize the livewire expiration notice

9169.0k4](/packages/marcelweidum-filament-expiration-notice)[hydrat/filament-table-layout-toggle

Filament plugin adding a toggle button to tables, allowing user to switch between Grid and Table layouts.

6292.3k1](/packages/hydrat-filament-table-layout-toggle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
