diff --git a/app/Http/Middleware/Admin/HandleInertiaAdminRequests.php b/app/Http/Middleware/Admin/HandleInertiaAdminRequests.php new file mode 100644 index 0000000..111027b --- /dev/null +++ b/app/Http/Middleware/Admin/HandleInertiaAdminRequests.php @@ -0,0 +1,42 @@ + + */ + public function share(Request $request): array + { + return [ + ...parent::share($request), + 'navigation' => [ + 'menu' => Menu::getMenuTree('admin', false, true), + 'breadcrumbs' => Breadcrumbs::generate(), + ], + ]; + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 0c5b182..d09eaf0 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use BalajiDharma\LaravelMenu\Models\Menu; +use Diglactic\Breadcrumbs\Breadcrumbs; use Illuminate\Http\Request; use Inertia\Middleware; @@ -37,10 +38,7 @@ public function share(Request $request): array ], 'flash' => [ 'message' => fn () => $request->session()->get('message'), - ], - 'navigation' => [ - 'menu' => Menu::getMenuTree('admin', false, true), - ], + ] ]; } } diff --git a/resources/js/Components/Admin/Breadcrumb.vue b/resources/js/Components/Admin/Breadcrumb.vue new file mode 100644 index 0000000..6710693 --- /dev/null +++ b/resources/js/Components/Admin/Breadcrumb.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/resources/js/Layouts/LayoutAuthenticated.vue b/resources/js/Layouts/LayoutAuthenticated.vue index 497e690..6109eca 100644 --- a/resources/js/Layouts/LayoutAuthenticated.vue +++ b/resources/js/Layouts/LayoutAuthenticated.vue @@ -5,6 +5,7 @@ import { usePage, router } from '@inertiajs/vue3' import menuNavBar from '@/menuNavBar.js' import { useDarkModeStore } from '@/Stores/darkMode.js' import BaseIcon from '@/Components/BaseIcon.vue' +import Breadcrumb from '@/Components/Admin/Breadcrumb.vue' import FormControl from '@/Components/FormControl.vue' import NavBar from '@/Components/NavBar.vue' import NavBarItemPlain from '@/Components/NavBarItemPlain.vue' @@ -67,6 +68,7 @@ const menuClick = (event, item) => { @menu-click="menuClick" @aside-lg-close-click="isAsideLgActive = false" /> + diff --git a/routes/admin.php b/routes/admin.php index 4ae422a..41cd841 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -1,12 +1,13 @@ 'App\Http\Controllers\Admin', 'prefix' => config('admin.prefix'), - 'middleware' => ['auth', HasAccessAdmin::class], + 'middleware' => ['auth', HasAccessAdmin::class, HandleInertiaAdminRequests::class], 'as' => 'admin.', ], function () { Route::get('/', function () { @@ -18,7 +19,9 @@ Route::resource('menu', 'MenuController')->except([ 'show', ]); - Route::resource('menu.item', 'MenuItemController'); + Route::resource('menu.item', 'MenuItemController')->except([ + 'show', + ]); Route::group([ 'prefix' => 'category', 'as' => 'category.', diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php new file mode 100644 index 0000000..364c8e5 --- /dev/null +++ b/routes/breadcrumbs.php @@ -0,0 +1,79 @@ +push('Dashboard', route('admin.dashboard')); +}); + +Breadcrumbs::macro('resource', function (string $name, string $title, ?string $parentName = null) { + if ($parentName) { + Breadcrumbs::for("{$name}.index", function (BreadcrumbTrail $trail, $model) use ($name, $title, $parentName) { + $trail->parent("{$parentName}.show", $model); + $trail->push($title, route("{$name}.index", $model)); + }); + + Breadcrumbs::for("{$name}.create", function (BreadcrumbTrail $trail, $model) use ($name) { + $trail->parent("{$name}.index", $model); + $trail->push('Create', route("{$name}.create", $model)); + }); + + Breadcrumbs::for("{$name}.show", function (BreadcrumbTrail $trail, $model, $item) use ($name) { + $trail->parent("{$name}.index", $model, $item); + \Log::info("{$name}.show"); + if (Route::has("{$name}.show")) { + $trail->push($item->name ?? $model, route("{$name}.show", [$model, $item])); + } else { + $trail->push($item->name ?? $model); + } + }); + + Breadcrumbs::for("{$name}.edit", function (BreadcrumbTrail $trail, $model, $item) use ($name) { + $trail->parent("{$name}.show", $model, $item); + $trail->push('Edit', route("{$name}.edit", [$model, $item])); + }); + + } else { + Breadcrumbs::for("{$name}.index", function (BreadcrumbTrail $trail) use ($name, $title) { + $trail->parent('admin.dashboard'); + $trail->push($title, route("{$name}.index")); + }); + + Breadcrumbs::for("{$name}.create", function (BreadcrumbTrail $trail) use ($name) { + $trail->parent("{$name}.index"); + $trail->push('Create', route("{$name}.create")); + }); + + Breadcrumbs::for("{$name}.show", function (BreadcrumbTrail $trail, $model) use ($name) { + $trail->parent("{$name}.index"); + if (Route::has("$name.show")) { + $trail->push($model->name ?? $model, route("{$name}.show", $model)); + } else { + $trail->push($model->name ?? $model); + } + }); + + Breadcrumbs::for("{$name}.edit", function (BreadcrumbTrail $trail, $model) use ($name) { + $trail->parent("{$name}.show", $model); + $trail->push('Edit', route("{$name}.edit", $model)); + }); + } +}); + +Breadcrumbs::resource('admin.permission', 'Permissions'); +Breadcrumbs::resource('admin.role', 'Roles'); +Breadcrumbs::resource('admin.user', 'Users'); +Breadcrumbs::resource('admin.media', 'Media'); +Breadcrumbs::resource('admin.menu', 'Menu'); +Breadcrumbs::resource('admin.menu.item', 'Menu Items', 'admin.menu'); +Breadcrumbs::resource('admin.category.type', 'Category Types'); +Breadcrumbs::resource('admin.category.type.item', 'Items', 'admin.category.type'); + +// admin account Info +Breadcrumbs::for('admin.account.info', function (BreadcrumbTrail $trail) { + $trail->parent('admin.dashboard'); + $trail->push('Account Info', route('admin.account.info')); +}); \ No newline at end of file