Skip to content
This repository has been archived by the owner on Nov 5, 2021. It is now read-only.

Commit

Permalink
Final updates
Browse files Browse the repository at this point in the history
  • Loading branch information
jnbn committed Jul 28, 2020
1 parent 46add08 commit c4fb241
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 44 deletions.
2 changes: 1 addition & 1 deletion dist/js/tool.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

89 changes: 78 additions & 11 deletions src/Http/Controllers/SettingsController.php
Expand Up @@ -4,50 +4,117 @@

use Epigra\NovaSettings\NovaSettingsTool;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\ConditionallyLoadsAttributes;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Laravel\Nova\Contracts\Resolvable;
use Laravel\Nova\Fields\FieldCollection;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\ResolvesFields;

class SettingsController extends Controller
{
use ResolvesFields, ConditionallyLoadsAttributes;

public function get(Request $request)
{
$fields = collect(NovaSettingsTool::getSettingsFields());
$fields = $this->assignToPanels(__('Settings'), $this->availableFields());
$panels = $this->panelsWithDefaultLabel(__('Settings'), app(NovaRequest::class));

$fields->whereInstanceOf(Resolvable::class)->each(function (&$field) {
$addResolveCallback = function (&$field) {
if (! empty($field->attribute)) {
$field->resolve([$field->attribute => setting($field->attribute)]);
$setting = setting($field->attribute);
$field->resolve([$field->attribute => isset($setting) ? $setting : '']);
}

if (! empty($field->meta['fields'])) {
foreach ($field->meta['fields'] as $_field) {
$setting = setting($_field->attribute);
$_field->resolve([$_field->attribute => isset($setting) ? $setting : '']);
}
}
};

$fields->each(function (&$field) use ($addResolveCallback) {
$addResolveCallback($field);
});

return $fields;
return response()->json([
'panels' => $panels,
'fields' => $fields->map->jsonSerialize(),
], 200);
}

public function save(NovaRequest $request)
{
$fields = collect(NovaSettingsTool::getSettingsFields());
$fields = $this->availableFields();

// NovaDependencyContainer support
$fields = $fields->map(function ($field) {
if (! empty($field->attribute)) {
return $field;
}
if (! empty($field->meta['fields'])) {
return $field->meta['fields'];
}
})->filter()->flatten();

$rules = [];
foreach ($fields as $field) {
$fakeResource = new \stdClass;
$fakeResource->{$field->attribute} = setting($field->attribute);
$field->resolve($fakeResource, $field->attribute); // For nova-translatable support
$rules = array_merge($rules, $field->getUpdateRules($request));
}

Validator::make($request->all(), $rules)->validate();

$fields->whereInstanceOf(Resolvable::class)->each(function ($field) use ($request) {
if (empty($field->attribute)) {
return;
}
if ($field->isReadonly(app(NovaRequest::class))) {
return;
}

// For nova-translatable support
if (! empty($field->meta['translatable']['original_attribute'])) {
$field->attribute = $field->meta['translatable']['original_attribute'];
}

$tempResource = new \stdClass;
$field->fill($request, $tempResource);

if (property_exists($tempResource, $field->attribute)) {
setting([$field->attribute => $tempResource->{$field->attribute}]);
if (! property_exists($tempResource, $field->attribute)) {
return;
}

setting([$field->attribute => $tempResource->{$field->attribute}]);
});

setting()->save();

if (config('nova-settings.restart_queue', false)) {
Artisan::call('queue:restart');
if (config('nova-settings.reload_page_on_save', false) === true) {
return response()->json(['reload' => true]);
}

return response('', 204);
}

public function deleteImage(Request $request, $fieldName)
{
setting()->forget($fieldName);

return response('', 204);
}

protected function availableFields()
{
return new FieldCollection(($this->filter(NovaSettingsTool::getFields())));
}

protected function fields(Request $request)
{
return NovaSettingsTool::getFields();
}
}
39 changes: 23 additions & 16 deletions src/NovaSettingsTool.php
Expand Up @@ -7,13 +7,11 @@

class NovaSettingsTool extends Tool
{
protected static $settingsFields = [];
protected static $customFormatter;
protected static $fields = [];

public function boot()
{
Nova::script('nova-settings', __DIR__.'/../dist/js/tool.js');
Nova::style('nova-settings', __DIR__.'/../dist/css/tool.css');
}

public function renderNavigation()
Expand All @@ -22,24 +20,33 @@ public function renderNavigation()
}

/**
* Define settings fields and an optional custom format function.
* Define settings fields.
*
* @param array $settingsFields Array of Nova fields to be displayed.
* @param \Closure $customFormatter A function that takes key and value as arguments, formats and returns the value.
* @param array|callable $fields Array of fields/panels to be displayed or callable that returns an array.
**/
public static function setSettingsFields($settingsFields = [], $customFormatter = null)
public static function addSettingsFields($fields = [])
{
self::$settingsFields = $settingsFields;
self::$customFormatter = $customFormatter;
if (is_callable($fields)) {
$fields = [$fields];
}
self::$fields = array_merge(self::$fields, $fields ?? []);
}

public static function getSettingsFields()
public static function getFields()
{
return self::$settingsFields;
}

public static function getCustomFormatter()
{
return self::$customFormatter;
$rawFields = array_map(function ($fieldItem) {
return is_callable($fieldItem) ? call_user_func($fieldItem) : $fieldItem;
}, self::$fields);

$fields = [];
foreach ($rawFields as $rawField) {
if (is_array($rawField)) {
$fields = array_merge($fields, $rawField);
} else {
$fields[] = $rawField;
}
}

return $fields;
}
}
18 changes: 8 additions & 10 deletions src/Providers/NovaSettingsServiceProvider.php
Expand Up @@ -2,11 +2,11 @@

namespace Epigra\NovaSettings\Providers;

use Laravel\Nova\Nova;
use Epigra\NovaSettings\Http\Middleware\Authorize;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Epigra\NovaSettings\Http\Middleware\Authorize;
use Laravel\Nova\Nova;

class NovaSettingsServiceProvider extends ServiceProvider
{
Expand All @@ -17,16 +17,14 @@ class NovaSettingsServiceProvider extends ServiceProvider
*/
public function boot()
{
$this->loadViewsFrom(__DIR__ . '../Resources/views', 'nova-settings');
$this->loadTranslations();

$this->loadViewsFrom(__DIR__.'/../Resources/views', 'nova-settings');

$this->registerRoutes();

if ($this->app->runningInConsole()) {
// Publish config
$this->publishes([
__DIR__ . '/../Config/' => config_path(),
__DIR__.'/../Config/' => config_path(),
], 'config');
}
}
Expand All @@ -41,11 +39,11 @@ public function register()

protected function registerRoutes()
{
if ($this->app->routesAreCached()) return;
if ($this->app->routesAreCached()) {
return;
}

Route::middleware(['nova', Authorize::class])
->group(__DIR__ . '/../Routes/api.php');
->group(__DIR__.'/../Routes/api.php');
}


}
6 changes: 3 additions & 3 deletions src/Resources/js/views/Settings.vue
Expand Up @@ -23,7 +23,7 @@
:disabled="isUpdating"
:processing="isUpdating"
>
{{ __('novaSettings.saveButtonText') }}
{{ __('Save Settings') }}
</progress-button>
</div>
</form>
Expand All @@ -34,7 +34,7 @@
<h4 class="font-normal text-80">Error</h4>
</div>
<div class="w-3/4 py-4">
<p class="text-90">{{ __('novaSettings.noSettingsFieldsText') }}</p>
<p class="text-90">{{ __('No Settings fields defined') }}</p>
</div>
</div>
</div>
Expand Down Expand Up @@ -88,7 +88,7 @@ export default {
return;
}
this.$toasted.show(this.__('novaSettings.settingsSuccessToast'), {
this.$toasted.show(this.__('Settings saved successfully'), {
type: 'success',
});
Expand Down

0 comments on commit c4fb241

Please sign in to comment.