Skip to content

Create resources for "single" resources (key-value database structure), such as a settings table.

License

Notifications You must be signed in to change notification settings

Muetze42/nova-single-resource

Repository files navigation

Laravel Nova Single Resource

Create resources for "single" resources (key-value database structure), such as a settings table.

index detail

Install

composer require norman-huth/nova-single-resource

Usage

The following description refers to the Model Settings as an example....

You can create a resource with php artisan nova:single-resource Setting.
The table still requires a primary ID and this package is designed to allow the Value column to be nullable.

use NormanHuth\SingleResource\Traits\ResourceTrait;

class Setting extends Resource
{
    use ResourceTrait;  // required

    public function __construct($resource = null)
    {
        $this->bootResourceTrait(); // Required
        parent::__construct($resource);
    }

    protected static function sections(): array
    {
        return [
            'general-settings' => 
            [
                'name'   => __('General Settings'),
                'icon'   => 'eye',
            ],
            'system' => 
            [
                'name'   => __('System'),
                'faIcon' => 'fa-brands fa-laravel fa-fw',
            ],
        ];
    }

    /**
     * The model the resource corresponds to.
     *
     * @var string
     */
    public static string $model = \App\Models\Setting::class;

    public function getGeneralSettingsFields(NovaRequest $request): array
    {
        return [
            Currency::make('Price')->currency('EUR'),
            Text::make(__('Text'), 'text'),
            Boolean::make(__('Boolean'), 'boolean'),
        ];
    }

    public function getSystemFields(NovaRequest $request): array
    {
        return [
            Date::make(__('Date'), 'Date'),
            DateTime::make(__('DateTime'), 'DateTime'),
        ];
    }
}

Define the sections in sections()

'general-settings' => // Required: unique slug
[
    'name'   => 'My Settings' // Required: Display section name
    'icon'   => 'eye', // Optional: Heroicon icon https://heroicons.com/
    'faIcon' => 'fa-brands fa-laravel fa-fw', // Optional: FontAwesome Icon (not included!) https://fontawesome.com/
],

And add for every section fields.
Format: get'.Str::studly($slug).'Fields: getGeneralSettingsFields(NovaRequest $request)

Columns

By default, the columns key and value are used in the database.

If you want to use others. You must specify them in the model:

class Setting extends Model
{
    public static string $keyColumn = 'key';
    public static string $valueColumn = 'value';

Change cast of a field

Text::make(__('SMTP Password'), 'smtp_password')
    ->cast('encrypted'),

Single Resource Fields

In this resource must be used adjusted fields.

The following fields are already included:

Nova

Original Single Resource
Boolean NormanHuth\SingleResource\Fields\Boolean
BooleanGroup NormanHuth\SingleResource\Fields\BooleanGroup
Color NormanHuth\SingleResource\Fields\Color
Country NormanHuth\SingleResource\Fields\Country
Currency NormanHuth\SingleResource\Fields\Currency
Date NormanHuth\SingleResource\Fields\Date
DateTime NormanHuth\SingleResource\Fields\DateTime
KeyValue NormanHuth\SingleResource\Fields\KeyValue
Markdown NormanHuth\SingleResource\Fields\Markdown
MultiSelect NormanHuth\SingleResource\Fields\MultiSelect
Number NormanHuth\SingleResource\Fields\Number
Select NormanHuth\SingleResource\Fields\Select
Text NormanHuth\SingleResource\Fields\Text
Textarea NormanHuth\SingleResource\Fields\Textarea
Timezone NormanHuth\SingleResource\Fields\Timezone
Trix NormanHuth\SingleResource\Fields\Trix

File Fields

Original Single Resource
File NormanHuth\SingleResource\Fields\File
Image NormanHuth\SingleResource\Fields\Image
Avatar NormanHuth\SingleResource\Fields\Avatar

Package Fields (alphabetic)

Package Single Resource
flatroy/nova-progressbar-field NormanHuth\SingleResource\Fields\Flatroy\FieldProgressbar
murdercode/seo-title NormanHuth\SingleResource\Fields\Murdercode\SeoTitle
murdercode/nova4-seo-description NormanHuth\SingleResource\Fields\Murdercode\SeoDescription
murdercode/nova4-tinymce-editor NormanHuth\SingleResource\Fields\Murdercode\TinymceEditor
norman-huth/nova-bbcode-textarea NormanHuth\SingleResource\Fields\NormanHuth\BBCode
NormanHuth\SingleResource\Fields\NormanHuth\BB
norman-huth/nova-iframe-popup NormanHuth\SingleResource\Fields\NormanHuth\IframePopup
norman-huth/nova-secret-field NormanHuth\SingleResource\Fields\NormanHuth\SecretField
norman-huth/nova-values-field NormanHuth\SingleResource\Fields\NormanHuth\Values

Field Development Notices

  • Try this trait
  • Cast with protected string $cast. Example here. See protected function castValue in the trait

Todos


More Laravel Nova Packages

Stand With Ukraine

Woman. Life. Freedom.