Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/spatie/nova-tags-field
A tags field to use in your Nova apps
https://github.com/spatie/nova-tags-field
field laravel nova php tags
Last synced: 4 days ago
JSON representation
A tags field to use in your Nova apps
- Host: GitHub
- URL: https://github.com/spatie/nova-tags-field
- Owner: spatie
- License: mit
- Created: 2018-08-24T09:49:45.000Z (over 6 years ago)
- Default Branch: main
- Last Pushed: 2024-12-30T10:19:41.000Z (24 days ago)
- Last Synced: 2025-01-12T11:03:10.706Z (11 days ago)
- Topics: field, laravel, nova, php, tags
- Language: PHP
- Homepage: https://freek.dev/a-tags-field-for-nova-apps
- Size: 2.25 MB
- Stars: 303
- Watchers: 7
- Forks: 107
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
Awesome Lists containing this project
README
# A tags field for Nova apps
[![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/nova-tags-field.svg?style=flat-square)](https://packagist.org/packages/spatie/nova-tags-field)
![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/spatie/nova-tags-field/run-tests.yml)
[![Total Downloads](https://img.shields.io/packagist/dt/spatie/nova-tags-field.svg?style=flat-square)](https://packagist.org/packages/spatie/nova-tags-field)This package contains a Nova field to add tags to resources. Under the hood it uses the [spatie/laravel-tags](https://docs.spatie.be/laravel-tags) package.
## Support us
[](https://spatie.be/github-ad-click/nova-tags-field)
We invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us).
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards).
## Requirements
This Nova field requires MySQL 5.7.8 or higher.
## Installation
First you must install [spatie/laravel-tags](https://github.com/spatie/laravel-tags) into your Laravel app. Here are [the installation instructions](https://spatie.be/docs/laravel-tags/v4/installation-and-setup) for that package.
Next, you can install this package in to a Laravel app that uses [Nova](https://nova.laravel.com) via composer:
```bash
composer require spatie/nova-tags-field
```## Usage
To make an Eloquent model taggable just add the `\Spatie\Tags\HasTags` trait to it:
```php
class BlogPost extends \Illuminate\Database\Eloquent\Model
{
use \Spatie\Tags\HasTags;
...
}
```Next you can use the `Spatie\TagsField\Tags` field in your Nova resource:
```php
namespace App\Nova;use Spatie\TagsField\Tags;
class BlogPost extends Resource
{
// ...
public function fields(NovaRequest $request)
{
return [
// ...
Tags::make('Tags'),// ...
];
}
}
```Now you can view and add tags on the blog posts screen in your Nova app. All tags will be saved in the `tags` table.
## Limiting suggestions
By default a tags field will display a maximum of 5 suggestions when typing into it. If you don't want to display any suggestions, tag on `withoutSuggestions()`.
```php
Tags::make('Tags')->withoutSuggestions(),
```You can change the number of suggestions with `limitSuggestions()`.
```php
Tags::make('Tags')->limitSuggestions($maxNumberOfSuggestions),
```## Limiting tags
By default a tags field will let you add unlimited tags. You can limit tags with `limit()`.
```php
Tags::make('Tags')->limit($maxNumberOfTags),
```## Using types
The [underlying tags package](https://github.com/spatie/laravel-tags) has support for [tag types](https://docs.spatie.be/laravel-tags/v2/advanced-usage/using-types). To make your tags field save tags of a certain type just tack on the name of type when adding the field to your Nova resource.
```php
// in your Nova resourcepublic function fields(NovaRequest $request)
{
return [
// ...
Tags::make('Tags')->type('my-special-type'),// ...
];
}
```## Allowing only one tag
If the user is only allowed to select one tag for your resource you can call the `single` method.
```php
// in your Nova resourcepublic function fields(NovaRequest $request)
{
return [
// ...
Tags::make('Tags')->single(),// ...
];
}
```The field will be rendered as a select form element. It will be populated by the names of the tags already saved.
If you want to be able to deselect a tag, you can call the `canBeDeselected` method.
```php
// in your Nova resourcepublic function fields(NovaRequest $request)
{
return [
// ...
Tags::make('Tags')->single()->canBeDeselected(),// ...
];
}
```## Use a different placeholder
You can use the `withMeta` method [documented here](https://nova.laravel.com/docs/3.0/customization/fields.html#field-options) to change the placeholder from the default, which is `__('Add tags...')`.
```php
// in your Nova resourcepublic function fields(NovaRequest $request)
{
return [
// ...
Tags::make('Categories', 'tags')->withMeta(['placeholder' => 'Add categories...']),// ...
];
}
```## Working with tags
For more info on how to work with the saved tags, head over to [the docs of spatie/laravel-tags](https://docs.spatie.be/laravel-tags/).
## Administering tags in Nova
If you want to perform crud actions on the save tags, just create a Nova resource for it. Here's an example.
```php
namespace App\Nova;use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Spatie\Tags\Tag as TagModel;class Tag extends Resource
{
public static $model = TagModel::class;public static $title = 'name';
public static $search = [
'name',
];public function fields(NovaRequest $request)
{
return [
Text::make('Name')->sortable(),
];
}
}
```### Show tags with a link to a Nova resource
When creating the field, you can use the `withLinkToTagResource` method.
Example:
```php
Tags::make('Tags')->withLinkToTagResource() // The resource App\Nova\Tag will be used
Tags::make('Tags')->withLinkToTagResource(\Custom\CustomTag::class) // The resource \Custom\CustomTag will be used
```### Testing
``` bash
composer test
```### Changelog
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
## Contributing
Please see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details.
### Security
If you've found a bug regarding security please mail [[email protected]](mailto:[email protected]) instead of using the issue tracker.
## Credits
- [Freek Van der Herten](https://github.com/freekmurze)
The Vue components that render the tags are based upon the tag Vue components created by [Adam Wathan](https://twitter.com/adamwathan) as shown in [his excellent Advanced Vue Component Design course](https://adamwathan.me/advanced-vue-component-design/).
## License
The MIT License (MIT). Please see [License File](LICENSE.md) for more information.