Sometimes there is a need to create filters (result selection) and display them in the listing.
Tags were created for such situations.
    namespace App\MoonShine\Resources;
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
    protected function queryTags(): array
    {
        return [
            QueryTag::make(
                'Post with author',                 fn(Builder $query) => $query->whereNotNull('author_id')             )
        ];
    }
}
    
     namespaces
namespace App\MoonShine\Resources;
 
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
    // ...
 
    protected function queryTags(): array
    {
        return [
            QueryTag::make(
                'Post with author', // Tag title
                fn(Builder $query) => $query->whereNotNull('author_id') // Query builder
            )
        ];
    }
}
namespace App\MoonShine\Resources;
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
    // ...
    protected function queryTags(): array
    {
        return [
            QueryTag::make(
                'Post with author', // Tag title
                fn(Builder $query) => $query->whereNotNull('author_id') // Query builder
            )
        ];
    }
}
 namespaces
namespace App\MoonShine\Resources;
 
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
    // ...
 
    protected function queryTags(): array
    {
        return [
            QueryTag::make(
                'Post with author', // Tag title
                fn(Builder $query) => $query->whereNotNull('author_id') // Query builder
            )
        ];
    }
}
namespace App\MoonShine\Resources;
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
    // ...
    protected function queryTags(): array
    {
        return [
            QueryTag::make(
                'Post with author', // Tag title
                fn(Builder $query) => $query->whereNotNull('author_id') // Query builder
            )
        ];
    }
}
 

You can add an icon to the tag using the icon() method.
    use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post without an author',
    fn(Builder $query) => $query->whereNull('author_id')
)
    ->icon('users')
    
     namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Post without an author',
    fn(Builder $query) => $query->whereNull('author_id')
)
    ->icon('users')
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post without an author',
    fn(Builder $query) => $query->whereNull('author_id')
)
    ->icon('users')
 namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Post without an author',
    fn(Builder $query) => $query->whereNull('author_id')
)
    ->icon('users')
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post without an author',
    fn(Builder $query) => $query->whereNull('author_id')
)
    ->icon('users')
 
    
    
        
For more detailed information, please refer to the section Icons.
     
 
You can make a QueryTag active by default. To do this, use the default() method.
    default(Closure|bool|null $condition = null)
    
    default(Closure|bool|null $condition = null)
default(Closure|bool|null $condition = null)
default(Closure|bool|null $condition = null)
default(Closure|bool|null $condition = null)
 
    use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'All posts',
    fn(Builder $query) => $query
)
    ->default()
    
     namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'All posts',
    fn(Builder $query) => $query
)
    ->default()
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'All posts',
    fn(Builder $query) => $query
)
    ->default()
 namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'All posts',
    fn(Builder $query) => $query
)
    ->default()
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'All posts',
    fn(Builder $query) => $query
)
    ->default()
 
You might want to display tags only under certain conditions.
You can use the canSee() method, which requires you to pass a callback function that returns TRUE or FALSE.
    use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post with author',     fn(Builder $query) => $query->whereNotNull('author_id')
)
    ->canSee(fn() => auth()->user()->moonshine_user_role_id === 1)
    
     namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Post with author', // Tag title
    fn(Builder $query) => $query->whereNotNull('author_id')
)
    ->canSee(fn() => auth()->user()->moonshine_user_role_id === 1)
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post with author', // Tag title
    fn(Builder $query) => $query->whereNotNull('author_id')
)
    ->canSee(fn() => auth()->user()->moonshine_user_role_id === 1)
 namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Post with author', // Tag title
    fn(Builder $query) => $query->whereNotNull('author_id')
)
    ->canSee(fn() => auth()->user()->moonshine_user_role_id === 1)
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Post with author', // Tag title
    fn(Builder $query) => $query->whereNotNull('author_id')
)
    ->canSee(fn() => auth()->user()->moonshine_user_role_id === 1)
 
By default, the URL value is automatically generated from the label parameter.
All non-Latin alphabet characters are replaced with their corresponding transliteration, e.g., 'Заголовок' => 'zagolovok'.
The alias() method allows you to set a custom value for the URL.
    use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Archived Posts',
    fn(Builder $query) => $query->where('is_archived', true)
)
    ->alias('archive')
    
     namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Archived Posts',
    fn(Builder $query) => $query->where('is_archived', true)
)
    ->alias('archive')
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Archived Posts',
    fn(Builder $query) => $query->where('is_archived', true)
)
    ->alias('archive')
 namespaces
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
 
QueryTag::make(
    'Archived Posts',
    fn(Builder $query) => $query->where('is_archived', true)
)
    ->alias('archive')
use Illuminate\Database\Eloquent\Builder;
use MoonShine\Laravel\QueryTags\QueryTag;
QueryTag::make(
    'Archived Posts',
    fn(Builder $query) => $query->where('is_archived', true)
)
    ->alias('archive')
 
By default, all tag buttons are displayed in a line, but you can display them through a drop-down list.
To do this, change the $queryTagsInDropdown property in the resource.
    class PostResource extends ModelResource
{
    protected bool $queryTagsInDropdown = true;
    }
    
    class PostResource extends ModelResource
{
    protected bool $queryTagsInDropdown = true;
 
    // ...
}
class PostResource extends ModelResource
{
    protected bool $queryTagsInDropdown = true;
    // ...
}
class PostResource extends ModelResource
{
    protected bool $queryTagsInDropdown = true;
 
    // ...
}
class PostResource extends ModelResource
{
    protected bool $queryTagsInDropdown = true;
    // ...
}
 
Raising custom events after a successful data update:
    QueryTag::make('QueryTag', fn($q) => $q)->events([
    AlpineJs::event(
        JsEvent::FRAGMENT_UPDATED, 'custom-fragment'
    )
])
    
    QueryTag::make('QueryTag', fn($q) => $q)->events([
    AlpineJs::event(
        JsEvent::FRAGMENT_UPDATED, 'custom-fragment'
    )
])
QueryTag::make('QueryTag', fn($q) => $q)->events([
    AlpineJs::event(
        JsEvent::FRAGMENT_UPDATED, 'custom-fragment'
    )
])
QueryTag::make('QueryTag', fn($q) => $q)->events([
    AlpineJs::event(
        JsEvent::FRAGMENT_UPDATED, 'custom-fragment'
    )
])
QueryTag::make('QueryTag', fn($q) => $q)->events([
    AlpineJs::event(
        JsEvent::FRAGMENT_UPDATED, 'custom-fragment'
    )
])
 
    QueryTag::make('QueryTag', fn($q) => $q)
    ->modifyButton(fn(ActionButton $btn) => $btn)
    
    QueryTag::make('QueryTag', fn($q) => $q)
    ->modifyButton(fn(ActionButton $btn) => $btn)
QueryTag::make('QueryTag', fn($q) => $q)
    ->modifyButton(fn(ActionButton $btn) => $btn)
QueryTag::make('QueryTag', fn($q) => $q)
    ->modifyButton(fn(ActionButton $btn) => $btn)
QueryTag::make('QueryTag', fn($q) => $q)
    ->modifyButton(fn(ActionButton $btn) => $btn)