Skip to content

Commit

Permalink
Nova 5 compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
felixgilles committed Jan 24, 2025
1 parent f571886 commit ad5618d
Show file tree
Hide file tree
Showing 19 changed files with 216 additions and 196 deletions.
13 changes: 13 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
* text=auto

*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php

/.github export-ignore
/tests export-ignore
.editorconfig export-ignore
.gitattributes export-ignore
.gitignore export-ignore
60 changes: 60 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Novius CI

on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]

jobs:
lint-php:

runs-on: ubuntu-latest

steps:
- uses: shivammathur/setup-php@v2
with:
php-versions: '8.3'

- name: Checkout code
uses: actions/checkout@v3

- name: Cache composer dependencies
uses: actions/cache@v3
with:
path: vendor
key: composer-${{ hashFiles('composer.lock') }}

- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

- name: Lint PHP code via Laravel Pint
run: composer run-script lint

phpstan:

runs-on: ubuntu-latest
strategy:
matrix:
operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest']
php-versions: ['8.1', '8.2', '8.3', '8.4']

steps:
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}

- name: Checkout code
uses: actions/checkout@v3

- name: Cache composer dependencies
uses: actions/cache@v3
with:
path: vendor
key: composer-${{ hashFiles('composer.lock') }}

- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist

- name: PHPStan Static Analysis
run: composer run-script phpstan
10 changes: 6 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,16 @@
],
"require": {
"php": "^8.1",
"laravel/nova": "^4.0",
"illuminate/support": "^9.0 | ^10.0 | ^11.0",
"laravel/nova": "^4.0|^5.0",
"illuminate/support": "^10.0 | ^11.0",
"novius/laravel-linkable": "^1.0",
"novius/laravel-nova-order-nestedset-field": "^4.0",
"spatie/laravel-sluggable": "^3.4.0"
},
"require-dev": {
"laravel/pint": "^1.7",
"orchestra/testbench": "^9.2"
"orchestra/testbench": "^9.2",
"phpstan/phpstan": "^2.1"
},
"autoload": {
"psr-4": {
Expand All @@ -50,7 +51,8 @@
"lint": [
"@composer cs-fix -- --test"
],
"test": "vendor/bin/phpunit --verbose --log-junit phpunit.log.xml"
"test": "vendor/bin/phpunit --verbose --log-junit phpunit.log.xml",
"phpstan": "vendor/bin/phpstan analyse src tests --memory-limit 1G"
},
"repositories": [
{
Expand Down
4 changes: 2 additions & 2 deletions database/migrations/2018_11_23_090000_create_menus_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*/
public function up(): void
{
Schema::create('nova_menus', function (Blueprint $table) {
Schema::create('nova_menus', static function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug')->unique();
Expand All @@ -25,7 +25,7 @@ public function up(): void
->restrictOnDelete();
});

Schema::create('nova_menu_items', function (Blueprint $table) {
Schema::create('nova_menu_items', static function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('menu_id')->unsigned();
Expand Down
15 changes: 6 additions & 9 deletions src/Actions/TranslateMenu.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Illuminate\Support\Collection;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Actions\ActionResponse;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
Expand All @@ -14,17 +15,15 @@ class TranslateMenu extends Action
{
/**
* Perform the action on the given models.
*
* @return mixed
*/
public function handle(ActionFields $fields, Collection $models)
public function handle(ActionFields $fields, Collection $models): ActionResponse|Action
{
if ($models->count() > 1) {
return Action::danger(trans('laravel-nova-menu::errors.action_only_available_for_single_menu'));
}

$menuToTranslate = $models->first();
$locale = $fields->locale;
$locale = $fields->get('locale');
if ($menuToTranslate->locale === $locale) {
return Action::danger(trans('laravel-nova-menu::errors.menu_already_translated'));
}
Expand All @@ -45,8 +44,8 @@ public function handle(ActionFields $fields, Collection $models)
return Action::danger(trans('laravel-nova-menu::errors.menu_already_translated'));
}

$translatedMenu = new Menu();
$translatedMenu->name = $fields->name;
$translatedMenu = new Menu;
$translatedMenu->name = $fields->get('name');
$translatedMenu->locale = $locale;
$translatedMenu->locale_parent_id = $menuToTranslate->id;

Expand All @@ -59,10 +58,8 @@ public function handle(ActionFields $fields, Collection $models)

/**
* Get the fields available on the action.
*
* @return array
*/
public function fields(NovaRequest $request)
public function fields(NovaRequest $request): array
{
$locales = config('laravel-nova-menu.locales', ['en' => 'English']);

Expand Down
7 changes: 2 additions & 5 deletions src/Filters/Locale.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Novius\LaravelNovaMenu\Filters;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Laravel\Nova\Filters\Filter;
Expand All @@ -21,11 +21,8 @@ public function __construct()

/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
*/
public function apply(Request $request, $query, $value): Builder
public function apply(Request $request, Builder $query, mixed $value): Builder
{
return $query->where('locale', $value);
}
Expand Down
17 changes: 12 additions & 5 deletions src/Helpers/MenuHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use Illuminate\Support\Facades\Log;
use Novius\LaravelNovaMenu\Models\Menu;
use Novius\LaravelNovaMenu\Models\MenuItem;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;

class MenuHelper
{
Expand All @@ -15,6 +17,9 @@ class MenuHelper
* Fallback to menu with current application locale
*
* You can append '|no-locale-fallback' to slug if you want to skip the default fallback
*
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public static function displayMenu(Menu|string $slug_or_menu, ?string $view = null, bool $localeFallback = true): string
{
Expand All @@ -35,7 +40,7 @@ public static function displayMenu(Menu|string $slug_or_menu, ?string $view = nu

$locale = app()->getLocale();

if ($localeFallback && ! empty($menu) && $menu->locale !== $locale) {
if ($localeFallback && $menu !== null && $menu->locale !== $locale) {
if (empty($menu->locale_parent_id)) {
$menu = Menu::query()
->where('locale_parent_id', $menu->id)
Expand All @@ -55,25 +60,26 @@ public static function displayMenu(Menu|string $slug_or_menu, ?string $view = nu
}
}

if (empty($menu)) {
if ($menu === null) {
Log::info(sprintf('Menu with slug %s and locale %s not found : unable to display.', $slug, app()->getLocale()));

return '';
}

$tree = Cache::rememberForever($menu->getTreeCacheName(), static function () use ($menu) {
return app()->get('laravel-nova-menu')->buildTree($menu);
return app()->get('laravel-nova-menu')?->buildTree($menu);
});

return (string) view($view ?? 'laravel-nova-menu::front/menu', [
'menu' => $menu,
'tree' => app()->get('laravel-nova-menu')->tree($menu, $tree),
'tree' => app()->get('laravel-nova-menu')?->tree($menu, $tree),
]);
}

public static function buildTree(Menu $menu): array
{
$items = MenuItem::scoped(['menu_id' => $menu->id])
$items = MenuItem::query()
->scoped(['menu_id' => $menu->id])
->withDepth()
->defaultOrder()
->get()
Expand All @@ -85,6 +91,7 @@ public static function buildTree(Menu $menu): array
protected static function getTree(Collection $items): array
{
$tree = [];
/** @var MenuItem $menuItem */
foreach ($items as $menuItem) {
$tree[] = [
'infos' => [
Expand Down
7 changes: 7 additions & 0 deletions src/LaravelNovaMenu.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@

namespace Novius\LaravelNovaMenu;

use Illuminate\Http\Request;
use Laravel\Nova\Menu\MenuSection;
use Laravel\Nova\Tool;
use Novius\LaravelNovaMenu\Resources\Menu;

class LaravelNovaMenu extends Tool
{
public function menu(Request $request)
{
return MenuSection::resource(Menu::class)->icon('bars-3');
}
}
3 changes: 1 addition & 2 deletions src/LaravelNovaMenuService.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace Novius\LaravelNovaMenu;

use Closure;
use Illuminate\Support\Collection;
use Novius\LaravelNovaMenu\Helpers\MenuHelper;
use Novius\LaravelNovaMenu\Models\Menu;

Expand Down Expand Up @@ -54,7 +53,7 @@ public function setBuildTreeUsing(Closure $callback): self
*/
public function tree(Menu $menu, array $tree): array
{
return ($this->treeUsing ?: function (Menu $menu, array $tree) {
return ($this->treeUsing ?: static function (Menu $menu, array $tree) {
return $tree;
})($menu, $tree);
}
Expand Down
9 changes: 5 additions & 4 deletions src/LaravelNovaMenuServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

namespace Novius\LaravelNovaMenu;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use Laravel\Nova\Nova;
use Novius\LaravelNovaMenu\View\Components\Menu;
use Novius\LaravelVisualComposer\LaravelVisualComposer;

class LaravelNovaMenuServiceProvider extends ServiceProvider
{
Expand Down Expand Up @@ -34,13 +33,15 @@ public function boot(): void
$this->loadTranslationsFrom($packageDir.'/lang', 'laravel-nova-menu');
$this->publishes([__DIR__.'/../lang' => lang_path('vendor/laravel-nova-menu')], 'lang');

Blade::directive('menu', function (string $expression, string $view = null) {
Blade::directive('menu', static function (string $expression, ?string $view = null) {
trigger_error('Blade directive @menu is deprecated, use blade compoonent <x-laravel-nova-menu::menu /> instead', E_USER_DEPRECATED);

return "<?php echo Novius\LaravelNovaMenu\Helpers\MenuHelper::displayMenu($expression, $view) ?>";
});

Blade::componentNamespace('Novius\\LaravelNovaMenu\\View\\Components', 'laravel-nova-menu');

/** @var Model $modelClass */
foreach (config('laravel-nova-menu.observers', []) as $modelClass => $observerClass) {
if (class_exists($modelClass) && class_exists($observerClass)) {
$modelClass::observe($observerClass);
Expand All @@ -59,7 +60,7 @@ public function register(): void
);

$this->app->singleton(LaravelNovaMenuService::class, function () {
return new LaravelNovaMenuService();
return new LaravelNovaMenuService;
});

$this->app->alias(LaravelNovaMenuService::class, 'laravel-nova-menu');
Expand Down
13 changes: 2 additions & 11 deletions src/Lenses/MenuItems.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Novius\LaravelNovaMenu\Lenses;

use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Http\Requests\LensRequest;
Expand All @@ -11,10 +12,8 @@ class MenuItems extends Lens
{
/**
* Get the query builder / paginator for the lens.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*/
public static function query(LensRequest $request, $query): mixed
public static function query(LensRequest $request, Builder $query): mixed
{
return $request->withOrdering($request->withFilters(
$query
Expand All @@ -31,14 +30,6 @@ public function fields(Request $request): array
];
}

/**
* Get the filters available for the lens.
*/
public function filters(Request $request): array
{
return [];
}

/**
* Get the URI key for the lens.
*/
Expand Down
Loading

0 comments on commit ad5618d

Please sign in to comment.