diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php
index aef03d8c65..0a233a1e31 100644
--- a/resources/views/layouts/default.blade.php
+++ b/resources/views/layouts/default.blade.php
@@ -394,7 +394,7 @@
@endcan
@can('index', \App\Models\Asset::class)
-
+
{{ trans('general.assets') }}
@@ -523,11 +523,6 @@
{{ trans('general.deleted') }}
- is('maintenances') ? ' class="active" aria-current="page"' : '') !!}>
-
- {{ trans('general.maintenances') }}
-
-
@endcan
@can('audit', \App\Models\Asset::class)
is('hardware/bulkaudit') ? ' class="active" aria-current="page"' : '') !!}>
@@ -538,6 +533,47 @@
@endcan
+
+ @endcan
+ {{-- Dedicated Maintenances section. Treeview parent
+ so "list all" and Maintenance Types share one
+ visual home. The @if guard OR's the two
+ governing permissions so a user with either
+ can see the parent. --}}
+ @if (Gate::allows('view', \App\Models\Asset::class) || Gate::allows('index', \App\Models\MaintenanceType::class))
+
+
+
+ {{ trans('general.maintenances') }}
+
+
+
+
+ @endif
+
+ @can('view', \App\Models\Asset::class)
+ routeIs('calendar.index') ? ' class="active" aria-current="page"' : '') !!}>
+
+
+ {{ trans('general.calendar') }}
+
@endcan
@can('view', \App\Models\License::class)
diff --git a/routes/web/hardware.php b/routes/web/hardware.php
index ce855dfc0e..f315ece76c 100644
--- a/routes/web/hardware.php
+++ b/routes/web/hardware.php
@@ -7,6 +7,7 @@ use App\Http\Controllers\Assets\BulkAssetsController;
use App\Http\Controllers\BulkMaintenancesController;
use App\Http\Controllers\MaintenancesController;
use App\Models\Asset;
+use App\Models\Maintenance;
use App\Models\Setting;
use Illuminate\Support\Facades\Route;
use Tabuna\Breadcrumbs\Trail;
@@ -208,10 +209,48 @@ Route::resource('hardware',
])->parameters(['hardware' => 'asset'])->withTrashed();
// Asset Maintenances
-Route::resource('maintenances',
- MaintenancesController::class,
- ['middleware' => ['auth'],
- ])->parameters(['maintenance' => 'maintenance', 'asset' => 'asset_id']);
+//
+// Expanded from a Route::resource so per-route breadcrumbs can chain.
+// maintenances.show is parented through the maintenance's type so the
+// trail reads: Maintenance Types → {type name} → {maintenance name}.
+// That matches the sidebar reshuffle that moved MT under Settings and
+// positioned it as the drill-down entry point for related maintenances.
+Route::group(['middleware' => ['auth']], function () {
+ Route::get('maintenances', [MaintenancesController::class, 'index'])
+ ->name('maintenances.index')
+ ->breadcrumbs(fn (Trail $trail) => $trail->parent('home', route('home'))
+ ->push(trans('admin/maintenances/general.maintenances'), route('maintenances.index'))
+ );
+
+ Route::get('maintenances/create', [MaintenancesController::class, 'create'])
+ ->name('maintenances.create')
+ ->breadcrumbs(fn (Trail $trail) => $trail->parent('maintenances.index')
+ ->push(trans('admin/maintenances/general.create'))
+ );
+
+ Route::post('maintenances', [MaintenancesController::class, 'store'])
+ ->name('maintenances.store');
+
+ Route::get('maintenances/{maintenance}', [MaintenancesController::class, 'show'])
+ ->name('maintenances.show')
+ ->breadcrumbs(fn (Trail $trail, Maintenance $maintenance) => $trail->parent('maintenances.index')
+ ->push($maintenance->name, route('maintenances.show', $maintenance))
+ );
+
+ Route::get('maintenances/{maintenance}/edit', [MaintenancesController::class, 'edit'])
+ ->name('maintenances.edit')
+ ->breadcrumbs(fn (Trail $trail, Maintenance $maintenance) => $trail->parent('maintenances.show', $maintenance)
+ ->push(trans('admin/maintenances/general.edit'))
+ );
+
+ Route::put('maintenances/{maintenance}', [MaintenancesController::class, 'update'])
+ ->name('maintenances.update');
+
+ Route::patch('maintenances/{maintenance}', [MaintenancesController::class, 'update']);
+
+ Route::delete('maintenances/{maintenance}', [MaintenancesController::class, 'destroy'])
+ ->name('maintenances.destroy');
+});
Route::post('maintenances/{maintenance}/complete',
[MaintenancesController::class, 'complete']