nova-settings
nova-settings copied to clipboard
This Laravel Nova settings tool based on env, using nativ nova fields and resources
Nova Settings

Description
This Laravel Nova settings tool based on env, using nativ nova fields and resources
Features
- Using native Nova resources
- Fully responsive
- Dark mode support
- Support all packages. Like nova-tabs, activity-log, etc.
- Different settings depending on the current Env
- Separation of settings into different classes
- Customizable model and resource
Requirements
php: >=8.0laravel/nova: ^4.0
Installation
# Install the package
composer require stepanenko3/nova-settings
Publish the config file:
php artisan vendor:publish --provider="Stepanenko3\NovaSettings\ToolServiceProvider" --tag="config"
Publish the migration file:
php artisan vendor:publish --provider="Stepanenko3\NovaSettings\ToolServiceProvider" --tag="migrations"
And run php artisan migrate
Next up, you must register the tool with Nova. This is typically done in the tools method of the NovaServiceProvider.
// in app/Providers/NovaServiceProvder.php
// ...
public function tools()
{
return [
// ...
new \Stepanenko3\NovaSettings\NovaSettingsTool(),
];
}
Create your own configuration classes in app/Nova/Settings
// in app/Nova/Settings/Demo.php
<?php
namespace App\Nova\Settings;
use Laravel\Nova\Fields\Boolean;
use Stepanenko3\NovaSettings\Types\AbstractType;
class Demo extends AbstractType
{
public function fields(): array
{
return [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
];
}
}
With Tabs
If you want to use eminiarts/nova-tabs
composer require eminiarts/nova-tabs
// in app/Nova/Settings/Demo.php
<?php
namespace App\Nova\Settings;
use Eminiarts\Tabs\Tab;
use Eminiarts\Tabs\Tabs;
use Laravel\Nova\Fields\Boolean;
use Stepanenko3\NovaSettings\Types\AbstractType;
class Demo extends AbstractType
{
public function fields(): array
{
return [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
new Tabs('Tabs 1', [
new Tab('Tab 1', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
new Tab('Tab 2', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
new Tab('Tab 3', [
Boolean::make('Param 1', 'param_1'),
Boolean::make('Param 2', 'param_2'),
Boolean::make('Param 3', 'param_3'),
]),
]),
];
}
}
Delcare your settings class in config/nova-settings.php
<?php
return [
'model' => \Stepanenko3\NovaSettings\Models\Settings::class,
'resource' => \Stepanenko3\NovaSettings\Resources\Settings::class,
'types' => [
\App\Nova\Settings\Demo::class, // Add this line
],
];
Usage
Click on the "Settings" menu item in your Nova app to see the tool.
Use helper function for access the settings
// settings(string|null $section, string|null $key = null, string|null $default = null, string|null $env = null)
settings('demo', 'key', 'defaultValue', config('app.env'))
Get cart_link value from General settings in current Env
settings('general', 'cart_link')
Get all General settings
settings('general')
Get cart_link value from General settings in specific Env with default value
settings(
section: 'general',
key: 'cart_link',
default: true,
env: 'production'
);
// OR
settings('general', 'cart_link', true, 'production');
Configuration
All the configuration is managed from a single configuration file located in config/nova-settings.php
Extends default model
Create your own model that will extends \Stepanenko3\NovaSettings\Models\Settings
// in app/Models/Settings.php
<?php
namespace App\Models;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;
class Settings extends \Stepanenko3\NovaSettings\Models\Settings
{
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logFillable()
->logOnlyDirty();
}
}
Declare your model 'model' => \App\Models\Settings::class, in config/nova-settings.php
Extends default Nova resource
Create your own resource that will extends \Stepanenko3\NovaSettings\Resources\Settings
// in app/Nova/Settings.php
<?php
namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\HasMany;
class Settings extends \Stepanenko3\NovaSettings\Resources\Settings
{
public function fields(Request $request)
{
return array_merge(parent::fields($request), [
HasMany::make('Activities', 'activities', 'App\Nova\ActivityLog'),
]);
}
}
Declare your resource 'resource' => \App\Nova\Settings::class, in config/nova-settings.php
Don't forget to create App\Nova\ActivityLog
Using dependsOn with out package
Use the settings-> prefix in the attribute parameter of the dependsOn method.
It is also necessary to get data from FormData with settings-> prefix
Select::make('Purchase Type', 'type')
->options([
'personal' => 'Personal',
'gift' => 'Gift',
]),
Text::make('Recipient')
->readonly()
->dependsOn(
['settings->type'],
function (Text $field, NovaRequest $request, FormData $formData) {
if ($formData->{'settings->type'} === 'gift') {
$field->readonly(false)->rules(['required', 'email']);
}
}
),
Screenshots

Credits
Contributing
Thank you for considering contributing to this package! Please create a pull request with your contributions with detailed explanation of the changes you are proposing.
License
This package is open-sourced software licensed under the MIT license.