- @if ($debug_in_production)
@@ -828,6 +827,37 @@ dir="{{ Helper::determineLanguageDirection() }}">
+ + +
+
+ + + + @if(Breadcrumbs::has()) + @foreach (Breadcrumbs::current() as $crumbs) + @if ($crumbs->url() && !$loop->last) + + @else + + @endif + @endforeach + @endif +
+
+

@yield('title')

@if (isset($helpText)) diff --git a/routes/web.php b/routes/web.php index 517f8778a..a38839b6c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -26,6 +26,7 @@ use App\Http\Controllers\Auth\ForgotPasswordController; use App\Http\Controllers\Auth\ResetPasswordController; use App\Livewire\Importer; use Illuminate\Support\Facades\Route; +use Tabuna\Breadcrumbs\Trail; use Illuminate\Support\Facades\Auth; Route::group(['middleware' => 'auth'], function () { @@ -521,14 +522,6 @@ Route::group(['middleware' => 'web'], function () { Route::get('google/callback', 'App\Http\Controllers\GoogleAuthController@handleGoogleCallback')->name('google.callback'); - Route::get( - '/', - [ - 'as' => 'home', - 'middleware' => ['auth'], - 'uses' => 'DashboardController@getIndex' ] - ); - // need to keep GET /logout for SAML SLO Route::get( 'logout', @@ -554,4 +547,7 @@ Route::withoutMiddleware(['web'])->get( Route::middleware(['auth'])->get( '/', [DashboardController::class, 'index'] -)->name('home'); +)->name('home') + ->breadcrumbs(fn (Trail $trail) => + $trail->push('Home', route('home')) + ); diff --git a/routes/web/hardware.php b/routes/web/hardware.php index ee888aa1d..7ca0ab7eb 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Assets\BulkAssetsController; use App\Http\Controllers\Assets\AssetCheckoutController; use App\Http\Controllers\Assets\AssetCheckinController; use App\Http\Controllers\Assets\AssetFilesController; +use Tabuna\Breadcrumbs\Trail; use Illuminate\Support\Facades\Route; /* @@ -26,11 +27,18 @@ Route::group( Route::get('bulkaudit', [AssetsController::class, 'quickScan'] - )->name('assets.bulkaudit'); + ) + ->name('assets.bulkaudit') + ->breadcrumbs(fn (Trail $trail) => + $trail->parent('home')->push(trans('general.assets'), route('hardware.index')) + ); Route::get('quickscancheckin', [AssetsController::class, 'quickScanCheckin'] - )->name('hardware/quickscancheckin'); + )->name('hardware/quickscancheckin') + ->breadcrumbs(fn (Trail $trail) => + $trail->parent('hardware.index')->push('Quickscan Checkin', route('hardware/quickscancheckin')) + ); // Asset Maintenances Route::resource('maintenances', @@ -108,7 +116,7 @@ Route::group( return redirect()->route('hardware.show', ['hardware' => $assetId]); }); - Route::get('{assetId}/qr_code', + Route::get('{asset}/qr_code', [AssetsController::class, 'getQrCode'] )->name('qr_code/hardware'); @@ -167,10 +175,11 @@ Route::resource('hardware', AssetsController::class, [ 'middleware' => ['auth'], - 'parameters' => ['asset' => 'asset_id', + 'parameters' => [ 'names' => [ - 'show' => 'view', - ], + 'show' => 'view', + 'index' => 'index', + ], ], ]); From f7d213052a15efbee86139fd9c484a671cf54952 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 02:49:05 +0000 Subject: [PATCH 03/61] Route model binding for resource groups Signed-off-by: snipe --- .../Accessories/AccessoriesController.php | 36 +++++-------------- .../Controllers/AssetModelsController.php | 28 ++++----------- .../Controllers/Assets/AssetsController.php | 19 ++++------ app/Http/Controllers/CompaniesController.php | 26 +++----------- .../Components/ComponentsController.php | 25 +++---------- .../Consumables/ConsumablesController.php | 26 ++++---------- .../Controllers/DepartmentsController.php | 27 ++++---------- .../Controllers/DepreciationsController.php | 25 ++++--------- .../Licenses/LicensesController.php | 32 ++++++----------- app/Http/Controllers/LocationsController.php | 20 +++-------- .../Controllers/ManufacturersController.php | 32 +++-------------- .../Controllers/StatuslabelsController.php | 18 ++-------- app/Http/Controllers/SuppliersController.php | 27 +++----------- .../Controllers/Users/UsersController.php | 23 +++++------- 14 files changed, 88 insertions(+), 276 deletions(-) diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index f7ddd5394..6bf5ddd3d 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -95,16 +95,9 @@ class AccessoriesController extends Controller * @author [A. Gianotto] [] * @param int $accessoryId */ - public function edit($accessoryId = null) : View | RedirectResponse + public function edit(Accessory $accessory) : View | RedirectResponse { - - if ($item = Accessory::find($accessoryId)) { - $this->authorize($item); - return view('accessories.edit', compact('item'))->with('category_type', 'accessory'); - } - - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); - + return view('accessories.edit')->with('category_type', 'accessory'); } /** @@ -114,19 +107,12 @@ class AccessoriesController extends Controller * @param int $accessoryId * @since [v6.0] */ - public function getClone($accessoryId = null) : View | RedirectResponse + public function getClone(Accessory $accessory) : View | RedirectResponse { $this->authorize('create', Accessory::class); - // Check if the asset exists - if (is_null($accessory_to_clone = Accessory::find($accessoryId))) { - // Redirect to the asset management page - return redirect()->route('accessories.index') - ->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryId])); - } - - $accessory = clone $accessory_to_clone; + $accessory = clone $accessory; $accessory->id = null; $accessory->location_id = null; @@ -142,9 +128,9 @@ class AccessoriesController extends Controller * @param ImageUploadRequest $request * @param int $accessoryId */ - public function update(ImageUploadRequest $request, $accessoryId = null) : RedirectResponse + public function update(ImageUploadRequest $request, Accessory $accessory) : RedirectResponse { - if ($accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessoryId)) { + if ($accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessory->id)) { $this->authorize($accessory); @@ -231,14 +217,10 @@ class AccessoriesController extends Controller * @see AccessoriesController::getDataView() method that generates the JSON response * @since [v1.0] */ - public function show($accessoryID = null) : View | RedirectResponse + public function show(Accessory $accessory) : View | RedirectResponse { - $accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessoryID); + $accessory = Accessory::withCount('checkouts as checkouts_count')->find($accessory->id); $this->authorize('view', $accessory); - if (isset($accessory->id)) { - return view('accessories.view', compact('accessory')); - } - - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryID])); + return view('accessories.view', compact('accessory')); } } diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index aa083e1ae..f77f718f8 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -109,16 +109,11 @@ class AssetModelsController extends Controller * @since [v1.0] * @param int $modelId */ - public function edit($modelId = null) : View | RedirectResponse + public function edit(AssetModel $model) : View | RedirectResponse { $this->authorize('update', AssetModel::class); - if ($item = AssetModel::find($modelId)) { - $category_type = 'asset'; - return view('models/edit', compact('item', 'category_type'))->with('depreciation_list', Helper::depreciationList()); - - } - - return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); + $category_type = 'asset'; + return view('models/edit', compact('category_type'))->with('item', $model)->with('depreciation_list', Helper::depreciationList()); } @@ -133,16 +128,11 @@ class AssetModelsController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function update(StoreAssetModelRequest $request, $modelId) : RedirectResponse + public function update(StoreAssetModelRequest $request, AssetModel $model) : RedirectResponse { $this->authorize('update', AssetModel::class); - if (is_null($model = AssetModel::find($modelId))) { - return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); - } - $model = $request->handleImages($model); - $model->depreciation_id = $request->input('depreciation_id'); $model->eol = $request->input('eol'); $model->name = $request->input('name'); @@ -267,16 +257,10 @@ class AssetModelsController extends Controller * @since [v1.0] * @param int $modelId */ - public function show($modelId = null) : View | RedirectResponse + public function show(AssetModel $model) : View | RedirectResponse { $this->authorize('view', AssetModel::class); - $model = AssetModel::withTrashed()->find($modelId); - - if (isset($model->id)) { - return view('models/view', compact('model')); - } - - return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); + return view('models/view', compact('model')); } /** diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 736dd9ae4..b7c3917a4 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -201,7 +201,7 @@ class AssetsController extends Controller $asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location); } - $successes[] = " $asset->id]) . "' style='color: white;'>" . e($asset->asset_tag) . ""; + $successes[] = "" . e($asset->asset_tag) . ""; } else { $failures[] = join(",", $asset->getErrors()->all()); @@ -222,7 +222,7 @@ class AssetsController extends Controller //the most common case, keeping it so we don't have to make every use of that translation string be trans_choice'ed //and re-translated return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) - ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); + ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', $asset), 'id', 'tag' => e($asset->asset_tag)])); } else { //multi-success return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) @@ -240,15 +240,13 @@ class AssetsController extends Controller * Returns a view that presents a form to edit an existing asset. * * @author [A. Gianotto] [] - * @param int $assetId * @since [v1.0] * @return \Illuminate\Contracts\View\View */ public function edit(Asset $asset) : View | RedirectResponse { $this->authorize($asset); - - return view('hardware/edit', compact('asset')) + return view('hardware/edit') ->with('statuslabel_list', Helper::statusLabelList()) ->with('statuslabel_types', Helper::statusTypeList()); } @@ -285,7 +283,7 @@ class AssetsController extends Controller $qr_code = (object) [ 'display' => $settings->qr_code == '1', - //'url' => route('qr_code/hardware', ['asset' => $asset]), + 'url' => route('qr_code/hardware', $asset), ]; return view('hardware/view', compact('asset', 'qr_code', 'settings')) @@ -302,14 +300,9 @@ class AssetsController extends Controller * @since [v1.0] * @author [A. Gianotto] [] */ - public function update(ImageUploadRequest $request, $assetId = null) : RedirectResponse + public function update(ImageUploadRequest $request, Asset $asset) : RedirectResponse { - // Check if the asset exists - if (! $asset = Asset::find($assetId)) { - // Redirect to the asset management page with error - return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); - } $this->authorize($asset); $asset->status_id = $request->input('status_id', null); @@ -424,7 +417,7 @@ class AssetsController extends Controller session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); if ($asset->save()) { - return redirect()->to(Helper::getRedirectOption($request, $assetId, 'Assets')) + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) ->with('success', trans('admin/hardware/message.update.success')); } diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 12655cb2a..ccacbc58d 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -80,16 +80,10 @@ final class CompaniesController extends Controller * @since [v1.8] * @param int $companyId */ - public function edit($companyId) : View | RedirectResponse + public function edit(Company $company) : View | RedirectResponse { - if (is_null($item = Company::find($companyId))) { - return redirect()->route('companies.index') - ->with('error', trans('admin/companies/message.does_not_exist')); - } - - $this->authorize('update', $item); - - return view('companies/edit')->with('item', $item); + $this->authorize('update', $company); + return view('companies/edit'); } /** @@ -100,14 +94,10 @@ final class CompaniesController extends Controller * @param ImageUploadRequest $request * @param int $companyId */ - public function update(ImageUploadRequest $request, $companyId) : RedirectResponse + public function update(ImageUploadRequest $request, Company $company) : RedirectResponse { - if (is_null($company = Company::find($companyId))) { - return redirect()->route('companies.index')->with('error', trans('admin/companies/message.does_not_exist')); - } $this->authorize('update', $company); - $company->name = $request->input('name'); $company->phone = $request->input('phone'); $company->fax = $request->input('fax'); @@ -158,15 +148,9 @@ final class CompaniesController extends Controller ->with('success', trans('admin/companies/message.delete.success')); } - public function show($id) : View | RedirectResponse + public function show(Company $company) : View | RedirectResponse { $this->authorize('view', Company::class); - - if (is_null($company = Company::find($id))) { - return redirect()->route('companies.index') - ->with('error', trans('admin/companies/message.not_found')); - } - return view('companies/view')->with('company', $company); } } diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 62dc25cf1..78e9aa500 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -107,15 +107,11 @@ class ComponentsController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($componentId = null) + public function edit(Component $component) { - if ($item = Component::find($componentId)) { - $this->authorize('update', $item); - return view('components/edit', compact('item'))->with('category_type', 'component'); - } - - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + $this->authorize('update', $component); + return view('components/edit')->with('category_type', 'component'); } @@ -130,11 +126,8 @@ class ComponentsController extends Controller * @throws \Illuminate\Auth\Access\AuthorizationException * @since [v3.0] */ - public function update(ImageUploadRequest $request, $componentId = null) + public function update(ImageUploadRequest $request, Component $component) { - if (is_null($component = Component::find($componentId))) { - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); - } $min = $component->numCheckedOut(); $validator = Validator::make($request->all(), [ 'qty' => "required|numeric|min:$min", @@ -216,17 +209,9 @@ class ComponentsController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function show($componentId = null) + public function show(Component $component) { - $component = Component::find($componentId); - - if (isset($component->id)) { $this->authorize('view', $component); - return view('components/view', compact('component')); - } - // Redirect to the user management page - return redirect()->route('components.index') - ->with('error', trans('admin/components/message.does_not_exist')); } } diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php index 47a9ad71b..2e232b8dd 100644 --- a/app/Http/Controllers/Consumables/ConsumablesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -104,15 +104,11 @@ class ConsumablesController extends Controller * @see ConsumablesController::postEdit() method that stores the form data. * @since [v1.0] */ - public function edit($consumableId = null) : View | RedirectResponse + public function edit(Consumable $consumable) : View | RedirectResponse { - if ($item = Consumable::find($consumableId)) { - $this->authorize($item); + $this->authorize($consumable); + return view('consumables/edit')->with('category_type', 'consumable'); - return view('consumables/edit', compact('item'))->with('category_type', 'consumable'); - } - - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); } /** @@ -126,11 +122,8 @@ class ConsumablesController extends Controller * @see ConsumablesController::getEdit() method that stores the form data. * @since [v1.0] */ - public function update(StoreConsumableRequest $request, $consumableId = null) + public function update(StoreConsumableRequest $request, Consumable $consumable) { - if (is_null($consumable = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - } $min = $consumable->numCheckedOut(); $validator = Validator::make($request->all(), [ @@ -202,16 +195,11 @@ class ConsumablesController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function show($consumableId = null) + public function show(Consumable $consumable) { - $consumable = Consumable::withCount('users as users_consumables')->find($consumableId); + $consumable = Consumable::withCount('users as users_consumables')->find($consumable->id); $this->authorize($consumable); - if (isset($consumable->id)) { - return view('consumables/view', compact('consumable')); - } - - return redirect()->route('consumables.index') - ->with('error', trans('admin/consumables/message.does_not_exist')); + return view('consumables/view'); } public function clone(Consumable $consumable) : View diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index fe90162c4..f49242127 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -73,17 +73,10 @@ class DepartmentsController extends Controller * @param int $id * @since [v4.0] */ - public function show($id) : View | RedirectResponse + public function show(Department $department) : View | RedirectResponse { - $department = Department::find($id); - $this->authorize('view', $department); - - if (isset($department->id)) { - return view('departments/view', compact('department')); - } - - return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist')); + return view('departments/view', compact('department')); } /** @@ -139,15 +132,10 @@ class DepartmentsController extends Controller * @param int $departmentId * @since [v1.0] */ - public function edit($departmentId = null) : View | RedirectResponse + public function edit(Department $department) : View | RedirectResponse { - if (is_null($item = Department::find($departmentId))) { - return redirect()->back()->with('error', trans('admin/locations/message.does_not_exist')); - } - - $this->authorize('update', $item); - - return view('departments/edit', compact('item')); + $this->authorize('update', $department); + return view('departments/edit')->with('item', $department); } /** @@ -158,11 +146,8 @@ class DepartmentsController extends Controller * @param int $departmentId * @since [v1.0] */ - public function update(ImageUploadRequest $request, $id) : RedirectResponse + public function update(ImageUploadRequest $request, Department $department) : RedirectResponse { - if (is_null($department = Department::find($id))) { - return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist')); - } $this->authorize('update', $department); diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index 5f4a5ca10..2831bd56c 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -95,17 +95,11 @@ class DepreciationsController extends Controller * @param int $depreciationId * @since [v1.0] */ - public function edit($depreciationId = null) : RedirectResponse | View + public function edit(Depreciation $depreciation) : RedirectResponse | View { - // Check if the depreciation exists - if (is_null($item = Depreciation::find($depreciationId))) { - // Redirect to the blogs management page - return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); - } - $this->authorize('update', $item); - - return view('depreciations/edit', compact('item')); + $this->authorize('update', $depreciation); + return view('depreciations/edit'); } /** @@ -117,17 +111,10 @@ class DepreciationsController extends Controller * @param int $depreciationId * @since [v1.0] */ - public function update(Request $request, $depreciationId = null) : RedirectResponse + public function update(Request $request, Depreciation $depreciation) : RedirectResponse { - // Check if the depreciation exists - if (is_null($depreciation = Depreciation::find($depreciationId))) { - // Redirect to the blogs management page - return redirect()->route('depreciations.index')->with('error', trans('admin/depreciations/message.does_not_exist')); - } $this->authorize('update', $depreciation); - - // Depreciation data $depreciation->name = $request->input('name'); $depreciation->months = $request->input('months'); @@ -191,12 +178,12 @@ class DepreciationsController extends Controller * @param int $depreciationId * @since [v1.0] */ - public function show($id) : View | RedirectResponse + public function show(Depreciation $depreciation) : View | RedirectResponse { $depreciation = Depreciation::withCount('assets as assets_count') ->withCount('models as models_count') ->withCount('licenses as licenses_count') - ->find($id); + ->find($depreciation->id); $this->authorize('view', $depreciation); diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 6098423ba..7fb9c41f7 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -121,13 +121,10 @@ class LicensesController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($licenseId = null) + public function edit(License $license) { - if (is_null($item = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); - } - $this->authorize('update', $item); + $this->authorize('update', $license); $maintained_list = [ '' => 'Maintained', @@ -135,7 +132,7 @@ class LicensesController extends Controller '0' => 'No', ]; - return view('licenses/edit', compact('item')) + return view('licenses/edit') ->with('depreciation_list', Helper::depreciationList()) ->with('maintained_list', $maintained_list); } @@ -153,11 +150,9 @@ class LicensesController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function update(Request $request, $licenseId = null) + public function update(Request $request, License $license) { - if (is_null($license = License::find($licenseId))) { - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); - } + $this->authorize('update', $license); @@ -201,10 +196,10 @@ class LicensesController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function destroy($licenseId) + public function destroy(License $license) { // Check if the license exists - if (is_null($license = License::find($licenseId))) { + if (is_null($license = License::find($license->id))) { // Redirect to the license management page return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } @@ -238,14 +233,9 @@ class LicensesController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function show($licenseId = null) + public function show(License $license) { - $license = License::with('assignedusers')->find($licenseId); - - if (!$license) { - return redirect()->route('licenses.index') - ->with('error', trans('admin/licenses/message.does_not_exist')); - } + $license = License::with('assignedusers')->find($license->id); $users_count = User::where('autoassign_licenses', '1')->count(); $total_seats_count = $license->totalSeatsByLicenseID(); @@ -267,10 +257,10 @@ class LicensesController extends Controller * * @author [A. Gianotto] [] * @param int $licenseId - * @return \Illuminate\Http\RedirectResponse + * @return \Illuminate\Http\RedirectResponse | \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function getClone($licenseId = null) + public function getClone($licenseId = null) : \Illuminate\Contracts\View\View | \Illuminate\Http\RedirectResponse { if (is_null($license_to_clone = License::find($licenseId))) { return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index e250e5cfa..7cf44d604 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -97,15 +97,10 @@ class LocationsController extends Controller * @param int $locationId * @since [v1.0] */ - public function edit($locationId = null) : View | RedirectResponse + public function edit(Location $location) : View | RedirectResponse { $this->authorize('update', Location::class); - // Check if the location exists - if (is_null($item = Location::find($locationId))) { - return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist')); - } - - return view('locations/edit', compact('item')); + return view('locations/edit'); } /** @@ -117,15 +112,10 @@ class LocationsController extends Controller * @param int $locationId * @since [v1.0] */ - public function update(ImageUploadRequest $request, $locationId = null) : RedirectResponse + public function update(ImageUploadRequest $request, Location $location) : RedirectResponse { $this->authorize('update', Location::class); - // Check if the location exists - if (is_null($location = Location::find($locationId))) { - return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist')); - } - // Update the location data $location->name = $request->input('name'); $location->parent_id = $request->input('parent_id', null); $location->currency = $request->input('currency', '$'); @@ -194,7 +184,7 @@ class LocationsController extends Controller * @param int $id * @since [v1.0] */ - public function show($id = null) : View | RedirectResponse + public function show(Location $location) : View | RedirectResponse { $location = Location::withCount('assignedAssets as assigned_assets_count') ->withCount('assets as assets_count') @@ -202,7 +192,7 @@ class LocationsController extends Controller ->withCount('children as children_count') ->withCount('users as users_count') ->withTrashed() - ->find($id); + ->find($location->id); if (isset($location->id)) { return view('locations/view', compact('location')); diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index eb8c80d87..8254fa1f2 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -85,18 +85,10 @@ class ManufacturersController extends Controller * @param int $manufacturerId * @since [v1.0] */ - public function edit($manufacturerId = null) : View | RedirectResponse + public function edit(Manufacturer $manufacturer) : View | RedirectResponse { - // Handles manufacturer checks and permissions. $this->authorize('update', Manufacturer::class); - - // Check if the manufacturer exists - if (! $item = Manufacturer::find($manufacturerId)) { - return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); - } - - // Show the page - return view('manufacturers/edit', compact('item')); + return view('manufacturers/edit'); } /** @@ -108,16 +100,10 @@ class ManufacturersController extends Controller * @param int $manufacturerId * @since [v1.0] */ - public function update(ImageUploadRequest $request, $manufacturerId = null) : RedirectResponse + public function update(ImageUploadRequest $request, Manufacturer $manufacturer) : RedirectResponse { $this->authorize('update', Manufacturer::class); - // Check if the manufacturer exists - if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { - // Redirect to the manufacturer page - return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); - } - // Save the data $manufacturer->name = $request->input('name'); $manufacturer->url = $request->input('url'); $manufacturer->support_url = $request->input('support_url'); @@ -185,18 +171,10 @@ class ManufacturersController extends Controller * @param int $manufacturerId * @since [v1.0] */ - public function show($manufacturerId = null) : View | RedirectResponse + public function show(Manufacturer $manufacturer) : View | RedirectResponse { $this->authorize('view', Manufacturer::class); - $manufacturer = Manufacturer::find($manufacturerId); - - if (isset($manufacturer->id)) { - return view('manufacturers/view', compact('manufacturer')); - } - - $error = trans('admin/manufacturers/message.does_not_exist'); - // Redirect to the user management page - return redirect()->route('manufacturers.index')->with('error', $error); + return view('manufacturers/view', compact('manufacturer')); } /** diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index 21a7c798b..b62c37822 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -91,20 +91,13 @@ class StatuslabelsController extends Controller * * @param int $statuslabelId */ - public function edit($statuslabelId = null) : View | RedirectResponse + public function edit(Statuslabel $statuslabel) : View | RedirectResponse { $this->authorize('update', Statuslabel::class); - // Check if the Statuslabel exists - if (is_null($item = Statuslabel::find($statuslabelId))) { - // Redirect to the blogs management page - return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); - } - - $use_statuslabel_type = $item->getStatuslabelType(); $statuslabel_types = ['' => trans('admin/hardware/form.select_statustype')] + ['undeployable' => trans('admin/hardware/general.undeployable')] + ['pending' => trans('admin/hardware/general.pending')] + ['archived' => trans('admin/hardware/general.archived')] + ['deployable' => trans('admin/hardware/general.deployable')]; - return view('statuslabels/edit', compact('item', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type); + return view('statuslabels/edit', compact('statuslabel_types'))->with('use_statuslabel_type', $statuslabel); } /** @@ -112,14 +105,9 @@ class StatuslabelsController extends Controller * * @param int $statuslabelId */ - public function update(Request $request, $statuslabelId = null) : RedirectResponse + public function update(Request $request, Statuslabel $statuslabel) : RedirectResponse { $this->authorize('update', Statuslabel::class); - // Check if the Statuslabel exists - if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { - // Redirect to the blogs management page - return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); - } if (! $request->filled('statuslabel_types')) { return redirect()->back()->withInput()->withErrors(['statuslabel_types' => trans('validation.statuslabel_type')]); diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index 605bb66f6..5aa9c78ba 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -77,17 +77,10 @@ class SuppliersController extends Controller * * @param int $supplierId */ - public function edit($supplierId = null) : View | RedirectResponse + public function edit(Supplier $supplier) : View | RedirectResponse { $this->authorize('update', Supplier::class); - // Check if the supplier exists - if (is_null($item = Supplier::find($supplierId))) { - // Redirect to the supplier page - return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); - } - - // Show the page - return view('suppliers/edit', compact('item')); + return view('suppliers/edit'); } /** @@ -95,14 +88,9 @@ class SuppliersController extends Controller * * @param int $supplierId */ - public function update($supplierId, ImageUploadRequest $request) : RedirectResponse + public function update(ImageUploadRequest $request, Supplier $supplier) : RedirectResponse { $this->authorize('update', Supplier::class); - - if (is_null($supplier = Supplier::find($supplierId))) { - return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); - } - // Save the data $supplier->name = request('name'); $supplier->address = request('address'); @@ -163,15 +151,10 @@ class SuppliersController extends Controller * @param null $supplierId * @internal param int $assetId */ - public function show($supplierId = null) : View | RedirectResponse + public function show(Supplier $supplier) : View | RedirectResponse { $this->authorize('view', Supplier::class); - $supplier = Supplier::find($supplierId); + return view('suppliers/view', compact('supplier')); - if (isset($supplier->id)) { - return view('suppliers/view', compact('supplier')); - } - - return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); } } diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index 397bfd16d..5e8fe0ac1 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -182,11 +182,11 @@ class UsersController extends Controller * @internal param int $id * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function edit($id) + public function edit(User $user) { $this->authorize('update', User::class); - $user = User::with(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed()->find($id); + $user = User::with(['assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc'])->withTrashed()->find($user->id); if ($user) { @@ -198,7 +198,7 @@ class UsersController extends Controller $userPermissions = Helper::selectedPermissionsArray($permissions, $user->permissions); $permissions = $this->filterDisplayable($permissions); - return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions'))->with('item', $user); + return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions')); } return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', compact('id'))); @@ -324,11 +324,11 @@ class UsersController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function destroy(DeleteUserRequest $request, $id = null) + public function destroy(DeleteUserRequest $request, User $user) { $this->authorize('delete', User::class); - if ($user = User::find($id)) { + if ($user = User::find($user->id)) { $this->authorize('delete', $user); @@ -398,23 +398,18 @@ class UsersController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function show($userId = null) + public function show(User $user) { // Make sure the user can view users at all $this->authorize('view', User::class); - $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId); + $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($user->id); // Make sure they can view this particular user $this->authorize('view', $user); - if ($user) { $userlog = $user->userlog->load('item'); return view('users/view', compact('user', 'userlog'))->with('settings', Setting::getSettings()); - } - - return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', ['id' => $userId])); - } @@ -428,7 +423,7 @@ class UsersController extends Controller * @return \Illuminate\Contracts\View\View * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function getClone(Request $request, $id = null) + public function getClone(Request $request, User $user) { $this->authorize('create', User::class); @@ -438,7 +433,7 @@ class UsersController extends Controller app('request')->request->set('permissions', $permissions); - $user_to_clone = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($id); + $user_to_clone = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($user->id); // Make sure they can view this particular user $this->authorize('view', $user_to_clone); From 644527c5a6d4e3f38fb78d22baf5b6765daade04 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 02:49:21 +0000 Subject: [PATCH 04/61] More resources to breadcrumb provider Signed-off-by: snipe --- app/Providers/BreadcrumbsServiceProvider.php | 373 ++++++++++++++++++- 1 file changed, 368 insertions(+), 5 deletions(-) diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index f946830f8..ee6b1b21a 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -1,24 +1,42 @@ - $trail->push('Home', route('home')) + $trail->push(trans('general.dashboard'), route('home')) ); + /** + * Asset Breadcrumbs + */ Breadcrumbs::for('hardware.index', fn (Trail $trail) => $trail->parent('home', route('home')) ->push(trans('general.assets'), route('hardware.index')) @@ -26,12 +44,357 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('hardware.create', fn (Trail $trail) => $trail->parent('hardware.index', route('hardware.index')) - ->push(trans('general.create'), route('home')) + ->push(trans('general.create'), route('hardware.create')) ); Breadcrumbs::for('hardware.show', fn (Trail $trail, Asset $asset) => $trail->parent('hardware.index', route('hardware.index')) - ->push($asset->asset_tag, route('home')) + ->push('View '.$asset->asset_tag, route('home')) ); + + Breadcrumbs::for('hardware.edit', fn (Trail $trail, Asset $asset) => + $trail->parent('hardware.index', route('hardware.index')) + ->push('Edit asset: '.$asset->asset_tag, route('home')) + ); + + /** + * Asset Model Breadcrumbs + */ + Breadcrumbs::for('models.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.asset_models'), route('models.index')) + ); + + Breadcrumbs::for('models.create', fn (Trail $trail) => + $trail->parent('models.index', route('models.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('models.show', fn (Trail $trail, AssetModel $model) => + $trail->parent('models.index', route('models.index')) + ->push('View '.$model->name, route('home')) + ); + + Breadcrumbs::for('models.edit', fn (Trail $trail, AssetModel $model) => + $trail->parent('models.index', route('models.index')) + ->push('Edit: '.$model->name, route('home')) + ); + + + /** + * Accessories Breadcrumbs + */ + Breadcrumbs::for('accessories.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.accessories'), route('accessories.index')) + ); + + Breadcrumbs::for('accessories.create', fn (Trail $trail) => + $trail->parent('accessories.index', route('accessories.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('accessories.show', fn (Trail $trail, Accessory $accessory) => + $trail->parent('accessories.index', route('accessories.index')) + ->push('View '.$accessory->name, route('home')) + ); + + Breadcrumbs::for('accessories.edit', fn (Trail $trail, Accessory $accessory) => + $trail->parent('accessories.index', route('accessories.index')) + ->push('Edit: '.$accessory->name, route('home')) + ); + + + /** + * Company Breadcrumbs + */ + Breadcrumbs::for('companies.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.companies'), route('companies.index')) + ); + + Breadcrumbs::for('companies.create', fn (Trail $trail) => + $trail->parent('companies.index', route('companies.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('companies.show', fn (Trail $trail, Company $company) => + $trail->parent('companies.index', route('companies.index')) + ->push('View '.$company->name, route('home')) + ); + + Breadcrumbs::for('companies.edit', fn (Trail $trail, Company $company) => + $trail->parent('companies.index', route('companies.index')) + ->push('Edit: '.$company->name, route('home')) + ); + + + /** + * Components Breadcrumbs + */ + Breadcrumbs::for('components.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.components'), route('components.index')) + ); + + Breadcrumbs::for('components.create', fn (Trail $trail) => + $trail->parent('components.index', route('components.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('components.show', fn (Trail $trail, Component $component) => + $trail->parent('components.index', route('components.index')) + ->push('View '.$component->name, route('home')) + ); + + Breadcrumbs::for('components.edit', fn (Trail $trail, Component $component) => + $trail->parent('components.index', route('components.index')) + ->push('Edit: '.$component->name, route('home')) + ); + + + /** + * Consumables Breadcrumbs + */ + Breadcrumbs::for('consumables.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.consumables'), route('consumables.index')) + ); + + Breadcrumbs::for('consumables.create', fn (Trail $trail) => + $trail->parent('consumables.index', route('consumables.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('consumables.show', fn (Trail $trail, Consumable $consumable) => + $trail->parent('consumables.index', route('consumables.index')) + ->push('View '.$consumable->name, route('home')) + ); + + Breadcrumbs::for('consumables.edit', fn (Trail $trail, Consumable $consumable) => + $trail->parent('consumables.index', route('consumables.index')) + ->push('Edit: '.$consumable->name, route('home')) + ); + + + + /** + * Department Breadcrumbs + */ + Breadcrumbs::for('departments.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.departments'), route('departments.index')) + ); + + Breadcrumbs::for('departments.create', fn (Trail $trail) => + $trail->parent('departments.index', route('departments.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('departments.show', fn (Trail $trail, Department $department) => + $trail->parent('departments.index', route('departments.index')) + ->push('View '.$department->name, route('home')) + ); + + Breadcrumbs::for('departments.edit', fn (Trail $trail, Department $department) => + $trail->parent('departments.index', route('departments.index')) + ->push('Edit: '.$department->name, route('home')) + ); + + + /** + * Department Breadcrumbs + */ + Breadcrumbs::for('depreciations.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.depreciations'), route('depreciations.index')) + ); + + Breadcrumbs::for('depreciations.create', fn (Trail $trail) => + $trail->parent('depreciations.index', route('depreciations.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('depreciations.show', fn (Trail $trail, Depreciation $depreciation) => + $trail->parent('depreciations.index', route('depreciations.index')) + ->push('View '.$depreciation->name, route('home')) + ); + + Breadcrumbs::for('depreciations.edit', fn (Trail $trail, Depreciation $depreciation) => + $trail->parent('depreciations.index', route('depreciations.index')) + ->push('Edit: '.$depreciation->name, route('home')) + ); + + /** + * Groups Breadcrumbs + */ + Breadcrumbs::for('groups.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.groups'), route('groups.index')) + ); + + Breadcrumbs::for('groups.create', fn (Trail $trail) => + $trail->parent('groups.index', route('groups.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('groups.show', fn (Trail $trail, Group $group) => + $trail->parent('groups.index', route('groups.index')) + ->push('View '.$group->name, route('home')) + ); + + Breadcrumbs::for('groups.edit', fn (Trail $trail, Group $group) => + $trail->parent('groups.index', route('groups.index')) + ->push('Edit: '.$group->name, route('home')) + ); + + + + /** + * Licenses Breadcrumbs + */ + Breadcrumbs::for('licenses.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.licenses'), route('licenses.index')) + ); + + Breadcrumbs::for('licenses.create', fn (Trail $trail) => + $trail->parent('licenses.index', route('licenses.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('licenses.show', fn (Trail $trail, License $license) => + $trail->parent('licenses.index', route('licenses.index')) + ->push('View '.$license->username, route('home')) + ); + + Breadcrumbs::for('licenses.edit', fn (Trail $trail, License $license) => + $trail->parent('licenses.index', route('licenses.index')) + ->push('Edit: '.$license->username, route('home')) + ); + + /** + * Locations Breadcrumbs + */ + Breadcrumbs::for('locations.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.locations'), route('locations.index')) + ); + + Breadcrumbs::for('locations.create', fn (Trail $trail) => + $trail->parent('locations.index', route('locations.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('locations.show', fn (Trail $trail, Location $location) => + $trail->parent('locations.index', route('locations.index')) + ->push('View '.$location->name, route('home')) + ); + + Breadcrumbs::for('locations.edit', fn (Trail $trail, Location $location) => + $trail->parent('locations.index', route('locations.index')) + ->push('Edit: '.$location->name, route('home')) + ); + + /** + * Manufacturers Breadcrumbs + */ + Breadcrumbs::for('manufacturers.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.manufacturers'), route('manufacturers.index')) + ); + + Breadcrumbs::for('manufacturers.create', fn (Trail $trail) => + $trail->parent('manufacturers.index', route('manufacturers.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('manufacturers.show', fn (Trail $trail, Manufacturer $manufacturer) => + $trail->parent('manufacturers.index', route('manufacturers.index')) + ->push('View '.$manufacturer->name, route('home')) + ); + + Breadcrumbs::for('manufacturers.edit', fn (Trail $trail, Manufacturer $manufacturer) => + $trail->parent('manufacturers.index', route('manufacturers.index')) + ->push('Edit: '.$manufacturer->name, route('home')) + ); + + + /** + * Status Labels Breadcrumbs + */ + Breadcrumbs::for('statuslabels.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.status_labels'), route('statuslabels.index')) + ); + + Breadcrumbs::for('statuslabels.create', fn (Trail $trail) => + $trail->parent('statuslabels.index', route('statuslabels.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('statuslabels.show', fn (Trail $trail, Statuslabel $statuslabel) => + $trail->parent('statuslabels.index', route('statuslabels.index')) + ->push('View '.$statuslabel->name, route('home')) + ); + + Breadcrumbs::for('statuslabels.edit', fn (Trail $trail, Statuslabel $statuslabel) => + $trail->parent('statuslabels.index', route('statuslabels.index')) + ->push('Edit: '.$statuslabel->name, route('home')) + ); + + + /** + * Suppliers Breadcrumbs + */ + Breadcrumbs::for('suppliers.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.suppliers'), route('suppliers.index')) + ); + + Breadcrumbs::for('suppliers.create', fn (Trail $trail) => + $trail->parent('suppliers.index', route('suppliers.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('suppliers.show', fn (Trail $trail, Supplier $supplier) => + $trail->parent('suppliers.index', route('suppliers.index')) + ->push('View '.$supplier->name, route('home')) + ); + + Breadcrumbs::for('suppliers.edit', fn (Trail $trail, Supplier $supplier) => + $trail->parent('suppliers.index', route('suppliers.index')) + ->push('Edit: '.$supplier->name, route('home')) + ); + + + + /** + * Users Breadcrumbs + */ + Breadcrumbs::for('users.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.users'), route('users.index')) + ); + + Breadcrumbs::for('users.create', fn (Trail $trail) => + $trail->parent('users.index', route('users.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('users.show', fn (Trail $trail, User $user) => + $trail->parent('users.index', route('users.index')) + ->push('View '.$user->username, route('home')) + ); + + Breadcrumbs::for('users.edit', fn (Trail $trail, User $user) => + $trail->parent('users.index', route('users.index')) + ->push('Edit: '.$user->username, route('home')) + ); + + + } + + } \ No newline at end of file From 989082d719e5b2220eb5d7b4ad4846507ce64993 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 03:26:44 +0000 Subject: [PATCH 05/61] Handle the not found errors with route model binding Signed-off-by: snipe --- app/Exceptions/Handler.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 2b8eaa362..80663b47a 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -122,6 +122,15 @@ class Handler extends ExceptionHandler } + // This is traaaaash but it handles models that are not found while using route model binding :( + // The only alternative is to set that at *each* route, which is crazypants + if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { + $model_name = last(explode('\\', $e->getModel())); + $route_base = str_plural(strtolower(last(explode('\\', $e->getModel())))); + return redirect() + ->route($route_base.'.index') + ->withError(trans('general.generic_model_not_found', ['model' => $model_name])); + } if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) { From 3954ff20b41047843766c2853d731cc73a5562e7 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 03:29:31 +0000 Subject: [PATCH 06/61] More tweaks to the controllers, more breadcrumbs Signed-off-by: snipe --- app/Http/Controllers/CategoriesController.php | 26 ++----- .../Controllers/DepreciationsController.php | 2 +- app/Http/Controllers/GroupsController.php | 32 +++------ .../Controllers/StatuslabelsController.php | 4 +- app/Http/Controllers/SuppliersController.php | 2 +- app/Providers/BreadcrumbsServiceProvider.php | 28 +++++++- resources/lang/en-US/general.php | 2 + resources/views/hardware/edit.blade.php | 2 +- resources/views/layouts/default.blade.php | 67 ++++++++++--------- routes/web.php | 19 ++---- routes/web/accessories.php | 3 +- routes/web/hardware.php | 15 ++--- routes/web/users.php | 1 - 13 files changed, 92 insertions(+), 111 deletions(-) diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 1b42037f3..da8b57a55 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -88,14 +88,10 @@ class CategoriesController extends Controller * @param int $categoryId * @since [v1.0] */ - public function edit($categoryId = null) : RedirectResponse | View + public function edit(Category $category) : RedirectResponse | View { $this->authorize('update', Category::class); - if (is_null($item = Category::find($categoryId))) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); - } - - return view('categories/edit', compact('item')) + return view('categories/edit')->with('item', $category) ->with('category_types', Helper::categoryTypeList()); } @@ -108,19 +104,10 @@ class CategoriesController extends Controller * @param int $categoryId * @since [v1.0] */ - public function update(ImageUploadRequest $request, $categoryId = null) : RedirectResponse + public function update(ImageUploadRequest $request, Category $category) : RedirectResponse { $this->authorize('update', Category::class); - if (is_null($category = Category::find($categoryId))) { - // Redirect to the categories management page - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); - } - - // Update the category data $category->name = $request->input('name'); - // If the item count is > 0, we disable the category type in the edit. Disabled items - // don't POST, so if the category_type is blank we just set it to the default. - // Don't allow the user to change the category_type once it's been created if (($request->filled('category_type') && ($category->itemCount() > 0))) { @@ -181,10 +168,10 @@ class CategoriesController extends Controller * @param $id * @since [v1.8] */ - public function show($id) : View | RedirectResponse + public function show(Category $category) : View | RedirectResponse { $this->authorize('view', Category::class); - if ($category = Category::find($id)) { + if ($category->category_type == 'asset') { $category_type = 'hardware'; $category_type_route = 'assets'; @@ -199,8 +186,5 @@ class CategoriesController extends Controller return view('categories/view', compact('category')) ->with('category_type', $category_type) ->with('category_type_route', $category_type_route); - } - - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); } } diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index 2831bd56c..2c98e240b 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -99,7 +99,7 @@ class DepreciationsController extends Controller { $this->authorize('update', $depreciation); - return view('depreciations/edit'); + return view('depreciations/edit')->with('item', $depreciation); } /** diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index 6aaf58ebd..b63e51c4c 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -79,19 +79,12 @@ class GroupsController extends Controller * @param int $id * @since [v1.0] */ - public function edit($id) : View | RedirectResponse + public function edit(Group $group) : View | RedirectResponse { - $group = Group::find($id); - - if ($group) { - $permissions = config('permissions'); - $groupPermissions = $group->decodePermissions(); - $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); - - return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); - } - - return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id])); + $permissions = config('permissions'); + $groupPermissions = $group->decodePermissions(); + $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); + return view('groups.edit', compact('permissions', 'selected_array', 'groupPermissions')); } /** @@ -102,11 +95,8 @@ class GroupsController extends Controller * @param int $id * @since [v1.0] */ - public function update(Request $request, $id = null) : RedirectResponse + public function update(Request $request, Group $group) : RedirectResponse { - if (! $group = Group::find($id)) { - return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id])); - } $group->name = $request->input('name'); $group->permissions = json_encode($request->input('permission')); $group->notes = $request->input('notes'); @@ -151,14 +141,8 @@ class GroupsController extends Controller * @param $id * @since [v4.0.11] */ - public function show($id) : View | RedirectResponse + public function show(Group $group) : View | RedirectResponse { - $group = Group::find($id); - - if ($group) { - return view('groups/view', compact('group')); - } - - return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', ['id' => $id])); + return view('groups/view'); } } diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index b62c37822..c719b4c89 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -97,7 +97,9 @@ class StatuslabelsController extends Controller $statuslabel_types = ['' => trans('admin/hardware/form.select_statustype')] + ['undeployable' => trans('admin/hardware/general.undeployable')] + ['pending' => trans('admin/hardware/general.pending')] + ['archived' => trans('admin/hardware/general.archived')] + ['deployable' => trans('admin/hardware/general.deployable')]; - return view('statuslabels/edit', compact('statuslabel_types'))->with('use_statuslabel_type', $statuslabel); + return view('statuslabels/edit', compact('statuslabel_types')) + ->with('item', $statuslabel) + ->with('use_statuslabel_type', $statuslabel); } /** diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index 5aa9c78ba..d96031a9a 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -80,7 +80,7 @@ class SuppliersController extends Controller public function edit(Supplier $supplier) : View | RedirectResponse { $this->authorize('update', Supplier::class); - return view('suppliers/edit'); + return view('suppliers/edit')->with('item', $supplier); } /** diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index ee6b1b21a..bb33c82eb 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -3,6 +3,7 @@ use App\Models\Accessory; use App\Models\Asset; use App\Models\AssetModel; +use App\Models\Category; use App\Models\Company; use App\Models\Component; use App\Models\Consumable; @@ -105,6 +106,31 @@ class BreadcrumbsServiceProvider extends ServiceProvider ); + /** + * Categories Breadcrumbs + */ + Breadcrumbs::for('categories.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.categories'), route('categories.index')) + ); + + Breadcrumbs::for('categories.create', fn (Trail $trail) => + $trail->parent('categories.index', route('categories.index')) + ->push(trans('general.create'), route('home')) + ); + + Breadcrumbs::for('categories.show', fn (Trail $trail, Category $category) => + $trail->parent('categories.index', route('categories.index')) + ->push('View '.$category->name, route('home')) + ); + + Breadcrumbs::for('categories.edit', fn (Trail $trail, Category $category) => + $trail->parent('categories.index', route('categories.index')) + ->push('Edit: '.$category->name, route('home')) + ); + + + /** * Company Breadcrumbs */ @@ -249,7 +275,6 @@ class BreadcrumbsServiceProvider extends ServiceProvider ); - /** * Licenses Breadcrumbs */ @@ -296,6 +321,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider ->push('Edit: '.$location->name, route('home')) ); + /** * Manufacturers Breadcrumbs */ diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index 53482e853..e7ce1e065 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -587,4 +587,6 @@ return [ 'notes' => 'Add a note', ], + 'generic_model_not_found' => ':model not found', + ]; diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php index efd5d24b9..fa2c008c9 100755 --- a/resources/views/hardware/edit.blade.php +++ b/resources/views/hardware/edit.blade.php @@ -5,7 +5,7 @@ 'topSubmit' => true, 'helpText' => trans('help.assets'), 'helpPosition' => 'right', - 'formAction' => ($item->id) ? route('hardware.update', ['hardware' => $item->id]) : route('hardware.store'), + 'formAction' => ($item->id) ? route('hardware.update', $item) : route('hardware.store'), 'index_route' => 'hardware.index', 'options' => [ 'index' => trans('admin/hardware/form.redirect_to_all', ['type' => 'assets']), diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 547d11713..c5b105071 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -826,52 +826,55 @@ dir="{{ Helper::determineLanguageDirection() }}"> @endif -
+
-
+
- @if(Breadcrumbs::has()) - @foreach (Breadcrumbs::current() as $crumbs) - @if ($crumbs->url() && !$loop->last) - + @endif + @endforeach + @else + @yield('title') + @endif + + + + @if (isset($helpText)) + @include ('partials.more-info', + [ + 'helpText' => $helpText, + 'helpPosition' => (isset($helpPosition)) ? $helpPosition : 'left' + ]) + @endif +
+ @yield('header_right') +
+
- -

@yield('title')

- - @if (isset($helpText)) - @include ('partials.more-info', - [ - 'helpText' => $helpText, - 'helpPosition' => (isset($helpPosition)) ? $helpPosition : 'left' - ]) - @endif -
- @yield('header_right') -
- -
diff --git a/routes/web.php b/routes/web.php index a38839b6c..401d0845d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -109,23 +109,17 @@ Route::group(['middleware' => 'auth'], function () { /* * Suppliers */ - Route::resource('suppliers', SuppliersController::class, [ - 'parameters' => ['supplier' => 'supplier_id'], - ]); + Route::resource('suppliers', SuppliersController::class); /* * Depreciations */ - Route::resource('depreciations', DepreciationsController::class, [ - 'parameters' => ['depreciation' => 'depreciation_id'], - ]); + Route::resource('depreciations', DepreciationsController::class); /* * Status Labels */ - Route::resource('statuslabels', StatuslabelsController::class, [ - 'parameters' => ['statuslabel' => 'statuslabel_id'], - ]); + Route::resource('statuslabels', StatuslabelsController::class); /* * Departments @@ -188,8 +182,6 @@ Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser Route::get('security', [SettingsController::class, 'getSecurity'])->name('settings.security.index'); Route::post('security', [SettingsController::class, 'postSecurity'])->name('settings.security.save'); - Route::get('groups', [GroupsController::class, 'index'])->name('settings.groups.index'); - Route::get('localization', [SettingsController::class, 'getLocalization'])->name('settings.localization.index'); Route::post('localization', [SettingsController::class, 'postLocalization'])->name('settings.localization.save'); @@ -248,10 +240,7 @@ Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser Route::get('/', [SettingsController::class, 'getBackups'])->name('settings.backups.index'); }); - Route::resource('groups', GroupsController::class, [ - 'middleware' => ['auth'], - 'parameters' => ['group' => 'group_id'], - ]); + Route::resource('groups', GroupsController::class); Route::get('/', [SettingsController::class, 'index'])->name('settings.index'); }); diff --git a/routes/web/accessories.php b/routes/web/accessories.php index 1f28892a0..cf73e26e0 100644 --- a/routes/web/accessories.php +++ b/routes/web/accessories.php @@ -53,6 +53,5 @@ Route::group(['prefix' => 'accessories', 'middleware' => ['auth']], function () }); Route::resource('accessories', Accessories\AccessoriesController::class, [ - 'middleware' => ['auth'], - 'parameters' => ['accessory' => 'accessory_id'], + 'middleware' => ['auth'] ]); diff --git a/routes/web/hardware.php b/routes/web/hardware.php index 7ca0ab7eb..dd1f02638 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -171,17 +171,10 @@ Route::group( }); -Route::resource('hardware', - AssetsController::class, - [ - 'middleware' => ['auth'], - 'parameters' => [ - 'names' => [ - 'show' => 'view', - 'index' => 'index', - ], - ], -]); +Route::resource('hardware', + AssetsController::class, + ['middleware' => ['auth'] +])->parameters(['hardware' => 'asset']); Route::get('ht/{any?}', [AssetsController::class, 'getAssetByTag'] diff --git a/routes/web/users.php b/routes/web/users.php index e6aaf644a..d3e3c02c9 100644 --- a/routes/web/users.php +++ b/routes/web/users.php @@ -151,6 +151,5 @@ Route::group(['prefix' => 'users', 'middleware' => ['auth']], function () { Route::resource('users', Users\UsersController::class, [ 'middleware' => ['auth'], - 'parameters' => ['user' => 'user_id'], 'except' => ['update'] ]); From 560311b883e59d4a21f21129e4334d49cc8f8b80 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 03:37:34 +0000 Subject: [PATCH 07/61] =?UTF-8?q?Added=20->with(=E2=80=98item=E2=80=99)=20?= =?UTF-8?q?back=20in?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: snipe --- app/Http/Controllers/Assets/AssetsController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index b7c3917a4..902a67a36 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -247,6 +247,7 @@ class AssetsController extends Controller { $this->authorize($asset); return view('hardware/edit') + ->with('item', $asset) ->with('statuslabel_list', Helper::statusLabelList()) ->with('statuslabel_types', Helper::statusTypeList()); } From fa20eb4965219efe5fff0cf5f41c645372536152 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 03:41:01 +0000 Subject: [PATCH 08/61] Add exception for hardware vs assets :( Signed-off-by: snipe --- app/Exceptions/Handler.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 80663b47a..c4aa16aca 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -127,6 +127,11 @@ class Handler extends ExceptionHandler if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { $model_name = last(explode('\\', $e->getModel())); $route_base = str_plural(strtolower(last(explode('\\', $e->getModel())))); + + // Sigh. Fucking laravel. + if ($route_base =='assets') { + $route_base = 'hardware'; + } return redirect() ->route($route_base.'.index') ->withError(trans('general.generic_model_not_found', ['model' => $model_name])); From 217d65f64cae7b3873290e629b43884b9ad3629b Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 03:47:51 +0000 Subject: [PATCH 09/61] More changes to the error message formatting Signed-off-by: snipe --- app/Exceptions/Handler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index c4aa16aca..2c6d00548 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -129,7 +129,7 @@ class Handler extends ExceptionHandler $route_base = str_plural(strtolower(last(explode('\\', $e->getModel())))); // Sigh. Fucking laravel. - if ($route_base =='assets') { + if ($route_base == 'assets') { $route_base = 'hardware'; } return redirect() From 55abd242f2fcc08f765860949a5c0a52c0132133 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 04:07:09 +0000 Subject: [PATCH 10/61] =?UTF-8?q?Don=E2=80=99t=20know=20why=20I=20need=20t?= =?UTF-8?q?o=20compact=20this=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: snipe --- app/Http/Controllers/GroupsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index b63e51c4c..004dd2a61 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -84,7 +84,7 @@ class GroupsController extends Controller $permissions = config('permissions'); $groupPermissions = $group->decodePermissions(); $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); - return view('groups.edit', compact('permissions', 'selected_array', 'groupPermissions')); + return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); } /** From 5a7ffa5664c59029adefcbec84b115fd573800da Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 04:18:40 +0000 Subject: [PATCH 11/61] Sure, whatever I guess. Signed-off-by: snipe --- app/Http/Controllers/Consumables/ConsumablesController.php | 6 ++++-- app/Http/Controllers/GroupsController.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php index 2e232b8dd..c96c2db97 100644 --- a/app/Http/Controllers/Consumables/ConsumablesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -107,7 +107,9 @@ class ConsumablesController extends Controller public function edit(Consumable $consumable) : View | RedirectResponse { $this->authorize($consumable); - return view('consumables/edit')->with('category_type', 'consumable'); + return view('consumables/edit') + ->with('item', $consumable) + ->with('category_type', 'consumable'); } @@ -199,7 +201,7 @@ class ConsumablesController extends Controller { $consumable = Consumable::withCount('users as users_consumables')->find($consumable->id); $this->authorize($consumable); - return view('consumables/view'); + return view('consumables/view', compact('consumable')); } public function clone(Consumable $consumable) : View diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index 004dd2a61..524004335 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -143,6 +143,6 @@ class GroupsController extends Controller */ public function show(Group $group) : View | RedirectResponse { - return view('groups/view'); + return view('groups/view', compact('group')); } } From 82d8e1b0a9839ebe597b95deb85748657f70e1a4 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 04:18:57 +0000 Subject: [PATCH 12/61] Added item back into edit Signed-off-by: snipe --- app/Http/Controllers/ManufacturersController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 8254fa1f2..985ec769f 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -88,7 +88,7 @@ class ManufacturersController extends Controller public function edit(Manufacturer $manufacturer) : View | RedirectResponse { $this->authorize('update', Manufacturer::class); - return view('manufacturers/edit'); + return view('manufacturers/edit')->with('item', $manufacturer); } /** From 35a89de6dda54f7cdf3f6e8c5a93d920d43efb8b Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 05:03:26 +0000 Subject: [PATCH 13/61] Fixed handler for reports Signed-off-by: snipe --- app/Exceptions/Handler.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 2c6d00548..bcba92320 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -126,14 +126,17 @@ class Handler extends ExceptionHandler // The only alternative is to set that at *each* route, which is crazypants if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { $model_name = last(explode('\\', $e->getModel())); - $route_base = str_plural(strtolower(last(explode('\\', $e->getModel())))); + $route = str_plural(strtolower(last(explode('\\', $e->getModel())))).'.index'; // Sigh. Fucking laravel. - if ($route_base == 'assets') { - $route_base = 'hardware'; + if ($route == 'assets.index') { + $route = 'hardware.index'; + } elseif ($route == 'reporttemplates.index') { + $route = 'reports/custom'; } + return redirect() - ->route($route_base.'.index') + ->route($route) ->withError(trans('general.generic_model_not_found', ['model' => $model_name])); } From ecc0e76e7b5dc29d83a7dfd9e3540cb80b0cb85b Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 05:03:39 +0000 Subject: [PATCH 14/61] Fixed route parameters for helper Signed-off-by: snipe --- app/Helpers/Helper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 95a344dce..216245a3d 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1520,11 +1520,11 @@ class Helper if ($redirect_option == 'target') { switch ($checkout_to_type) { case 'user': - return route('users.show', ['user' => $request->assigned_user]); + return route('users.show', $request->assigned_user); case 'location': - return route('locations.show', ['location' => $request->assigned_location]); + return route('locations.show', $request->assigned_location); case 'asset': - return route('hardware.show', ['hardware' => $request->assigned_asset]); + return route('hardware.show', $request->assigned_asset); } } return redirect()->back()->with('error', trans('admin/hardware/message.checkout.error')); From 347eb2bdee8753f2658fb83869e7b121a32dc3df Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 05:03:56 +0000 Subject: [PATCH 15/61] Fixed route parameters and tests to match Signed-off-by: snipe --- .../Accessories/AccessoriesController.php | 2 +- app/Http/Controllers/CompaniesController.php | 2 +- .../Components/ComponentsController.php | 4 +++- tests/Feature/Accessories/Ui/ShowAccessoryTest.php | 8 ++++---- .../Feature/Accessories/Ui/UpdateAccessoryTest.php | 2 +- .../Feature/AssetModels/Ui/ShowAssetModelsTest.php | 2 +- .../AssetModels/Ui/UpdateAssetModelsTest.php | 8 ++++---- tests/Feature/Assets/Ui/EditAssetTest.php | 8 ++++---- tests/Feature/Categories/Ui/ShowCategoryTest.php | 2 +- .../Feature/Categories/Ui/UpdateCategoriesTest.php | 14 +++++++------- tests/Feature/Checkins/Ui/AssetCheckinTest.php | 6 +++--- tests/Feature/Checkins/Ui/ComponentCheckinTest.php | 6 ++---- .../Feature/Checkouts/Ui/AccessoryCheckoutTest.php | 6 +++--- tests/Feature/Checkouts/Ui/AssetCheckoutTest.php | 6 +++--- .../Checkouts/Ui/ComponentsCheckoutTest.php | 4 ++-- .../Checkouts/Ui/ConsumableCheckoutTest.php | 4 ++-- tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php | 6 +++--- tests/Feature/Companies/Ui/EditCompanyTest.php | 2 +- tests/Feature/Companies/Ui/ShowCompanyTest.php | 2 +- tests/Feature/Components/Ui/EditComponentTest.php | 2 +- tests/Feature/Components/Ui/ShowComponentTest.php | 2 +- .../Feature/Consumables/Ui/EditConsumableTest.php | 2 +- .../Consumables/Ui/UpdateConsumableTest.php | 6 +++--- .../Feature/Departments/Ui/ShowDepartmentTest.php | 2 +- .../Departments/Ui/UpdateDepartmentsTest.php | 4 ++-- tests/Feature/Locations/Ui/ShowLocationTest.php | 2 +- tests/Feature/Locations/Ui/UpdateLocationsTest.php | 8 ++++---- .../Manufacturers/Ui/ShowManufacturerTest.php | 2 +- .../Manufacturers/Ui/UpdateManufacturerTest.php | 4 ++-- .../StatusLabels/Ui/ShowStatusLabelTest.php | 2 +- 30 files changed, 65 insertions(+), 65 deletions(-) diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index 6bf5ddd3d..4a82c0803 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -97,7 +97,7 @@ class AccessoriesController extends Controller */ public function edit(Accessory $accessory) : View | RedirectResponse { - return view('accessories.edit')->with('category_type', 'accessory'); + return view('accessories.edit')->with('item', $accessory)->with('category_type', 'accessory'); } /** diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index ccacbc58d..96a80e87e 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -83,7 +83,7 @@ final class CompaniesController extends Controller public function edit(Company $company) : View | RedirectResponse { $this->authorize('update', $company); - return view('companies/edit'); + return view('companies/edit')->with('item', $company); } /** diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 78e9aa500..d5883c05f 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -111,7 +111,9 @@ class ComponentsController extends Controller { $this->authorize('update', $component); - return view('components/edit')->with('category_type', 'component'); + return view('components/edit') + ->with('item', $component) + ->with('category_type', 'component'); } diff --git a/tests/Feature/Accessories/Ui/ShowAccessoryTest.php b/tests/Feature/Accessories/Ui/ShowAccessoryTest.php index f9f2e566c..56d8fb42c 100644 --- a/tests/Feature/Accessories/Ui/ShowAccessoryTest.php +++ b/tests/Feature/Accessories/Ui/ShowAccessoryTest.php @@ -12,7 +12,7 @@ class ShowAccessoryTest extends TestCase public function testRequiresPermissionToViewAccessory() { $this->actingAs(User::factory()->create()) - ->get(route('accessories.show', Accessory::factory()->create()->id)) + ->get(route('accessories.show', Accessory::factory()->create())) ->assertForbidden(); } @@ -25,7 +25,7 @@ class ShowAccessoryTest extends TestCase $userForCompanyB = User::factory()->for($companyB)->viewAccessories()->create(); $this->actingAs($userForCompanyB) - ->get(route('accessories.show', $accessoryForCompanyA->id)) + ->get(route('accessories.show', $accessoryForCompanyA)) ->assertForbidden(); } @@ -34,7 +34,7 @@ class ShowAccessoryTest extends TestCase $accessory = Accessory::factory()->create(); $this->actingAs(User::factory()->viewAccessories()->create()) - ->get(route('accessories.show', $accessory->id)) + ->get(route('accessories.show', $accessory)) ->assertOk() ->assertViewIs('accessories.view') ->assertViewHas(['accessory' => $accessory]); @@ -43,7 +43,7 @@ class ShowAccessoryTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('accessories.show', Accessory::factory()->create()->id)) + ->get(route('accessories.show', Accessory::factory()->create())) ->assertOk(); } diff --git a/tests/Feature/Accessories/Ui/UpdateAccessoryTest.php b/tests/Feature/Accessories/Ui/UpdateAccessoryTest.php index 1c6fe8a49..8c482b4f1 100644 --- a/tests/Feature/Accessories/Ui/UpdateAccessoryTest.php +++ b/tests/Feature/Accessories/Ui/UpdateAccessoryTest.php @@ -16,7 +16,7 @@ class UpdateAccessoryTest extends TestCase public function testRequiresPermissionToSeeEditAccessoryPage() { $this->actingAs(User::factory()->create()) - ->get(route('accessories.edit', Accessory::factory()->create()->id)) + ->get(route('accessories.edit', Accessory::factory()->create())) ->assertForbidden(); } diff --git a/tests/Feature/AssetModels/Ui/ShowAssetModelsTest.php b/tests/Feature/AssetModels/Ui/ShowAssetModelsTest.php index 8b4104adc..739112f59 100644 --- a/tests/Feature/AssetModels/Ui/ShowAssetModelsTest.php +++ b/tests/Feature/AssetModels/Ui/ShowAssetModelsTest.php @@ -11,7 +11,7 @@ class ShowAssetModelsTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('models.show', AssetModel::factory()->create()->id)) + ->get(route('models.show', AssetModel::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/AssetModels/Ui/UpdateAssetModelsTest.php b/tests/Feature/AssetModels/Ui/UpdateAssetModelsTest.php index d0dbb2ffc..6fdd1bbcf 100644 --- a/tests/Feature/AssetModels/Ui/UpdateAssetModelsTest.php +++ b/tests/Feature/AssetModels/Ui/UpdateAssetModelsTest.php @@ -24,7 +24,7 @@ class UpdateAssetModelsTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('models.edit', AssetModel::factory()->create()->id)) + ->get(route('models.edit', AssetModel::factory()->create())) ->assertOk(); } @@ -55,15 +55,15 @@ class UpdateAssetModelsTest extends TestCase $this->assertTrue(AssetModel::where('name', 'Test Model')->exists()); $response = $this->actingAs(User::factory()->superuser()->create()) - ->from(route('models.edit', ['model' => $model->id])) - ->put(route('models.update', ['model' => $model]), [ + ->from(route('models.edit', $model)) + ->put(route('models.update', $model), [ 'name' => 'Test Model Edited', 'category_id' => Category::factory()->forAccessories()->create()->id, ]) ->assertSessionHasErrors(['category_type']) ->assertInvalid(['category_type']) ->assertStatus(302) - ->assertRedirect(route('models.edit', ['model' => $model->id])); + ->assertRedirect(route('models.edit', $model)); $this->followRedirects($response)->assertSee(trans('general.error')); $this->assertFalse(AssetModel::where('name', 'Test Model Edited')->exists()); diff --git a/tests/Feature/Assets/Ui/EditAssetTest.php b/tests/Feature/Assets/Ui/EditAssetTest.php index 27f00b531..328067e89 100644 --- a/tests/Feature/Assets/Ui/EditAssetTest.php +++ b/tests/Feature/Assets/Ui/EditAssetTest.php @@ -27,7 +27,7 @@ class EditAssetTest extends TestCase { $asset = Asset::factory()->create(); $user = User::factory()->editAssets()->create(); - $response = $this->actingAs($user)->get(route('hardware.edit', $asset->id)); + $response = $this->actingAs($user)->get(route('hardware.edit', $asset)); $response->assertStatus(200); } @@ -63,7 +63,7 @@ class EditAssetTest extends TestCase 'model_id' => AssetModel::factory()->create()->id, ]) ->assertStatus(302) - ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); $this->assertDatabaseHas('assets', ['asset_tag' => 'New Asset Tag']); } @@ -81,8 +81,8 @@ class EditAssetTest extends TestCase $currentTimestamp = now(); $this->actingAs(User::factory()->viewAssets()->editAssets()->create()) - ->from(route('hardware.edit', $asset->id)) - ->put(route('hardware.update', $asset->id), [ + ->from(route('hardware.edit', $asset)) + ->put(route('hardware.update', $asset), [ 'status_id' => $achived_status->id, 'model_id' => $asset->model_id, 'asset_tags' => $asset->asset_tag, diff --git a/tests/Feature/Categories/Ui/ShowCategoryTest.php b/tests/Feature/Categories/Ui/ShowCategoryTest.php index dd22b1d75..93a9cc0af 100644 --- a/tests/Feature/Categories/Ui/ShowCategoryTest.php +++ b/tests/Feature/Categories/Ui/ShowCategoryTest.php @@ -11,7 +11,7 @@ class ShowCategoryTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('categories.show', Category::factory()->create()->id)) + ->get(route('categories.show', Category::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Categories/Ui/UpdateCategoriesTest.php b/tests/Feature/Categories/Ui/UpdateCategoriesTest.php index 7e6109779..ea5cc6338 100644 --- a/tests/Feature/Categories/Ui/UpdateCategoriesTest.php +++ b/tests/Feature/Categories/Ui/UpdateCategoriesTest.php @@ -23,7 +23,7 @@ class UpdateCategoriesTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('categories.edit', Category::factory()->create()->id)) + ->get(route('categories.edit', Category::factory()->create())) ->assertOk(); } @@ -47,7 +47,7 @@ class UpdateCategoriesTest extends TestCase $this->assertTrue(Category::where('name', 'Test Category')->exists()); $response = $this->actingAs(User::factory()->superuser()->create()) - ->put(route('categories.update', ['category' => $category]), [ + ->put(route('categories.update', $category), [ 'name' => 'Test Category Edited', 'notes' => 'Test Note Edited', ]) @@ -66,8 +66,8 @@ class UpdateCategoriesTest extends TestCase $this->assertTrue(Category::where('name', 'Test Category')->exists()); $response = $this->actingAs(User::factory()->superuser()->create()) - ->from(route('categories.edit', ['category' => $category->id])) - ->put(route('categories.update', ['category' => $category]), [ + ->from(route('categories.edit', $category->id)) + ->put(route('categories.update', $category), [ 'name' => 'Test Category Edited', 'category_type' => 'accessory', 'notes' => 'Test Note Edited', @@ -87,8 +87,8 @@ class UpdateCategoriesTest extends TestCase $category = Category::where('name', 'Laptops')->first(); $response = $this->actingAs(User::factory()->superuser()->create()) - ->from(route('categories.edit', ['category' => $category->id])) - ->put(route('categories.update', ['category' => $category]), [ + ->from(route('categories.edit', $category)) + ->put(route('categories.update', $category), [ 'name' => 'Test Category Edited', 'category_type' => 'accessory', 'notes' => 'Test Note Edited', @@ -96,7 +96,7 @@ class UpdateCategoriesTest extends TestCase ->assertSessionHasErrors(['category_type']) ->assertInvalid(['category_type']) ->assertStatus(302) - ->assertRedirect(route('categories.edit', ['category' => $category->id])); + ->assertRedirect(route('categories.edit', $category)); $this->followRedirects($response)->assertSee(trans('general.error')); $this->assertFalse(Category::where('name', 'Test Category Edited')->where('notes', 'Test Note Edited')->exists()); diff --git a/tests/Feature/Checkins/Ui/AssetCheckinTest.php b/tests/Feature/Checkins/Ui/AssetCheckinTest.php index 7428b7ab7..58194dbfc 100644 --- a/tests/Feature/Checkins/Ui/AssetCheckinTest.php +++ b/tests/Feature/Checkins/Ui/AssetCheckinTest.php @@ -188,7 +188,7 @@ class AssetCheckinTest extends TestCase ->get(route('hardware.checkin.create', ['assetId' => $asset->id])) ->assertStatus(302) ->assertSessionHas('error') - ->assertRedirect(route('hardware.show',['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset->id)); } public function testAssetCheckinPagePostIsRedirectedIfModelIsInvalid() @@ -201,7 +201,7 @@ class AssetCheckinTest extends TestCase ->post(route('hardware.checkin.store', ['assetId' => $asset->id])) ->assertStatus(302) ->assertSessionHas('error') - ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); } public function testAssetCheckinPagePostIsRedirectedIfRedirectSelectionIsIndex() @@ -228,6 +228,6 @@ class AssetCheckinTest extends TestCase ]) ->assertStatus(302) ->assertSessionHasNoErrors() - ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); } } diff --git a/tests/Feature/Checkins/Ui/ComponentCheckinTest.php b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php index 6c2ef084f..7da3879ea 100644 --- a/tests/Feature/Checkins/Ui/ComponentCheckinTest.php +++ b/tests/Feature/Checkins/Ui/ComponentCheckinTest.php @@ -16,9 +16,7 @@ class ComponentCheckinTest extends TestCase $componentAsset = DB::table('components_assets')->where('component_id', $component->id)->first(); $this->actingAs(User::factory()->create()) - ->post(route('components.checkin.store', [ - 'componentID' => $componentAsset->id, - ])) + ->post(route('components.checkin.store', $componentAsset->id)) ->assertForbidden(); } @@ -67,6 +65,6 @@ class ComponentCheckinTest extends TestCase ]) ->assertStatus(302) ->assertSessionHasNoErrors() - ->assertRedirect(route('components.show', ['component' => $component->id])); + ->assertRedirect(route('components.show', $component)); } } diff --git a/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php b/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php index ff121bc4d..19b0d1ce7 100644 --- a/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/AccessoryCheckoutTest.php @@ -25,7 +25,7 @@ class AccessoryCheckoutTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('accessories.checkout.show', Accessory::factory()->create()->id)) + ->get(route('accessories.checkout.show', Accessory::factory()->create())) ->assertOk(); } @@ -241,7 +241,7 @@ class AccessoryCheckoutTest extends TestCase ]) ->assertStatus(302) ->assertSessionHasNoErrors() - ->assertRedirect(route('accessories.show', ['accessory' => $accessory->id])); + ->assertRedirect(route('accessories.show', $accessory)); } public function testAccessoryCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() @@ -258,6 +258,6 @@ class AccessoryCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('users.show', ['user' => $user])); + ->assertRedirect(route('users.show', $user)); } } diff --git a/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php b/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php index 74658a6fa..c92baa2fe 100644 --- a/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/AssetCheckoutTest.php @@ -263,7 +263,7 @@ class AssetCheckoutTest extends TestCase ->get(route('hardware.checkout.create', ['assetId' => $asset->id])) ->assertStatus(302) ->assertSessionHas('error') - ->assertRedirect(route('hardware.show',['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); } public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsIndex() @@ -294,7 +294,7 @@ class AssetCheckoutTest extends TestCase ]) ->assertStatus(302) ->assertSessionHasNoErrors() - ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); } public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsUserTarget() @@ -328,7 +328,7 @@ class AssetCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('hardware.show', ['hardware' => $target])); + ->assertRedirect(route('hardware.show', $target)); } public function testAssetCheckoutPagePostIsRedirectedIfRedirectSelectionIsLocationTarget() diff --git a/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php b/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php index 507b26243..18568d198 100644 --- a/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/ComponentsCheckoutTest.php @@ -76,7 +76,7 @@ class ComponentsCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('components.show', ['component' => $component->id])); + ->assertRedirect(route('components.show', $component)); } public function testComponentCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() @@ -92,6 +92,6 @@ class ComponentsCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('hardware.show', ['hardware' => $asset])); + ->assertRedirect(route('hardware.show', $asset)); } } diff --git a/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php b/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php index dd77e19c5..2c74e4d0c 100644 --- a/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/ConsumableCheckoutTest.php @@ -130,7 +130,7 @@ class ConsumableCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('consumables.show', ['consumable' => $consumable->id])); + ->assertRedirect(route('consumables.show', $consumable)); } public function testConsumableCheckoutPagePostIsRedirectedIfRedirectSelectionIsTarget() @@ -146,7 +146,7 @@ class ConsumableCheckoutTest extends TestCase 'assigned_qty' => 1, ]) ->assertStatus(302) - ->assertRedirect(route('users.show', ['user' => $user])); + ->assertRedirect(route('users.show', $user)); } } diff --git a/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php b/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php index 22bdb6b5d..f322bee1b 100644 --- a/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php +++ b/tests/Feature/Checkouts/Ui/LicenseCheckoutTest.php @@ -90,7 +90,7 @@ class LicenseCheckoutTest extends TestCase 'redirect_option' => 'item', ]) ->assertStatus(302) - ->assertRedirect(route('licenses.show', ['license' => $license->id])); + ->assertRedirect(route('licenses.show', $license)); } public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsUserTarget() @@ -105,7 +105,7 @@ class LicenseCheckoutTest extends TestCase 'redirect_option' => 'target', ]) ->assertStatus(302) - ->assertRedirect(route('users.show', ['user' => $user->id])); + ->assertRedirect(route('users.show', $user)); } public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsAssetTarget() { @@ -119,6 +119,6 @@ class LicenseCheckoutTest extends TestCase 'redirect_option' => 'target', ]) ->assertStatus(302) - ->assertRedirect(route('hardware.show', ['hardware' => $asset->id])); + ->assertRedirect(route('hardware.show', $asset)); } } diff --git a/tests/Feature/Companies/Ui/EditCompanyTest.php b/tests/Feature/Companies/Ui/EditCompanyTest.php index 7dcbc7908..febc71704 100644 --- a/tests/Feature/Companies/Ui/EditCompanyTest.php +++ b/tests/Feature/Companies/Ui/EditCompanyTest.php @@ -11,7 +11,7 @@ class EditCompanyTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('companies.edit', Company::factory()->create()->id)) + ->get(route('companies.edit', Company::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Companies/Ui/ShowCompanyTest.php b/tests/Feature/Companies/Ui/ShowCompanyTest.php index 1c41f6ab2..de7429d40 100644 --- a/tests/Feature/Companies/Ui/ShowCompanyTest.php +++ b/tests/Feature/Companies/Ui/ShowCompanyTest.php @@ -11,7 +11,7 @@ class ShowCompanyTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('companies.show', Company::factory()->create()->id)) + ->get(route('companies.show', Company::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Components/Ui/EditComponentTest.php b/tests/Feature/Components/Ui/EditComponentTest.php index 257034390..4e4b99233 100644 --- a/tests/Feature/Components/Ui/EditComponentTest.php +++ b/tests/Feature/Components/Ui/EditComponentTest.php @@ -11,7 +11,7 @@ class EditComponentTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('components.edit', Component::factory()->create()->id)) + ->get(route('components.edit', Component::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Components/Ui/ShowComponentTest.php b/tests/Feature/Components/Ui/ShowComponentTest.php index 50a17ee05..6ee2ca286 100644 --- a/tests/Feature/Components/Ui/ShowComponentTest.php +++ b/tests/Feature/Components/Ui/ShowComponentTest.php @@ -11,7 +11,7 @@ class ShowComponentTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('components.show', Component::factory()->create()->id)) + ->get(route('components.show', Component::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Consumables/Ui/EditConsumableTest.php b/tests/Feature/Consumables/Ui/EditConsumableTest.php index 6b75db127..308b7647b 100644 --- a/tests/Feature/Consumables/Ui/EditConsumableTest.php +++ b/tests/Feature/Consumables/Ui/EditConsumableTest.php @@ -11,7 +11,7 @@ class EditConsumableTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('consumables.show', Consumable::factory()->create()->id)) + ->get(route('consumables.show', Consumable::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Consumables/Ui/UpdateConsumableTest.php b/tests/Feature/Consumables/Ui/UpdateConsumableTest.php index 66fc9a11f..e885daa59 100644 --- a/tests/Feature/Consumables/Ui/UpdateConsumableTest.php +++ b/tests/Feature/Consumables/Ui/UpdateConsumableTest.php @@ -29,7 +29,7 @@ class UpdateConsumableTest extends TestCase $userForCompanyB = User::factory()->editConsumables()->for($companyB)->create(); $this->actingAs($userForCompanyB) - ->get(route('consumables.edit', $consumableForCompanyA->id)) + ->get(route('consumables.edit', $consumableForCompanyA)) ->assertRedirect(route('consumables.index')); } @@ -51,7 +51,7 @@ class UpdateConsumableTest extends TestCase $userForCompanyB = User::factory()->editConsumables()->for($companyB)->create(); $this->actingAs($userForCompanyB) - ->put(route('consumables.update', $consumableForCompanyA->id), [ + ->put(route('consumables.update', $consumableForCompanyA), [ // ]) ->assertForbidden(); @@ -99,7 +99,7 @@ class UpdateConsumableTest extends TestCase ]; $this->actingAs(User::factory()->createConsumables()->editConsumables()->create()) - ->put(route('consumables.update', $consumable->id), $data + [ + ->put(route('consumables.update', $consumable), $data + [ 'redirect_option' => 'index', 'category_type' => 'consumable', ]) diff --git a/tests/Feature/Departments/Ui/ShowDepartmentTest.php b/tests/Feature/Departments/Ui/ShowDepartmentTest.php index d8a007bde..f1373ccc2 100644 --- a/tests/Feature/Departments/Ui/ShowDepartmentTest.php +++ b/tests/Feature/Departments/Ui/ShowDepartmentTest.php @@ -11,7 +11,7 @@ class ShowDepartmentTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('departments.show', Department::factory()->create()->id)) + ->get(route('departments.show', Department::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Departments/Ui/UpdateDepartmentsTest.php b/tests/Feature/Departments/Ui/UpdateDepartmentsTest.php index bb5fc27e1..83e52bf7c 100644 --- a/tests/Feature/Departments/Ui/UpdateDepartmentsTest.php +++ b/tests/Feature/Departments/Ui/UpdateDepartmentsTest.php @@ -22,7 +22,7 @@ class UpdateDepartmentsTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('departments.edit', Department::factory()->create()->id)) + ->get(route('departments.edit', Department::factory()->create())) ->assertOk(); } @@ -32,7 +32,7 @@ class UpdateDepartmentsTest extends TestCase $this->assertTrue(Department::where('name', 'Test Department')->exists()); $response = $this->actingAs(User::factory()->superuser()->create()) - ->put(route('departments.update', ['department' => $department]), [ + ->put(route('departments.update', $department), [ 'name' => 'Test Department Edited', 'notes' => 'Test Note Edited', ]) diff --git a/tests/Feature/Locations/Ui/ShowLocationTest.php b/tests/Feature/Locations/Ui/ShowLocationTest.php index 6afb7dfe5..394ed73f4 100644 --- a/tests/Feature/Locations/Ui/ShowLocationTest.php +++ b/tests/Feature/Locations/Ui/ShowLocationTest.php @@ -11,7 +11,7 @@ class ShowLocationTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('locations.show', Location::factory()->create()->id)) + ->get(route('locations.show', Location::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Locations/Ui/UpdateLocationsTest.php b/tests/Feature/Locations/Ui/UpdateLocationsTest.php index c38ee25f8..3135e9bcf 100644 --- a/tests/Feature/Locations/Ui/UpdateLocationsTest.php +++ b/tests/Feature/Locations/Ui/UpdateLocationsTest.php @@ -21,7 +21,7 @@ class UpdateLocationsTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('locations.update', Location::factory()->create()->id)) + ->get(route('locations.update', Location::factory()->create())) ->assertOk(); } @@ -48,8 +48,8 @@ class UpdateLocationsTest extends TestCase $location = Location::factory()->create(); $response = $this->actingAs(User::factory()->superuser()->create()) - ->from(route('locations.edit', ['location' => $location->id])) - ->put(route('locations.update', ['location' => $location]), [ + ->from(route('locations.edit', $location)) + ->put(route('locations.update', $location), [ 'name' => 'Test Location', 'parent_id' => $location->id, ]) @@ -63,7 +63,7 @@ class UpdateLocationsTest extends TestCase { $location = Location::factory()->create(); $response = $this->actingAs(User::factory()->superuser()->create()) - ->from(route('locations.edit', ['location' => $location->id])) + ->from(route('locations.edit', $location)) ->put(route('locations.update', ['location' => $location]), [ 'name' => 'Test Location', 'parent_id' => '100000000' diff --git a/tests/Feature/Manufacturers/Ui/ShowManufacturerTest.php b/tests/Feature/Manufacturers/Ui/ShowManufacturerTest.php index 890feb123..9a40819a1 100644 --- a/tests/Feature/Manufacturers/Ui/ShowManufacturerTest.php +++ b/tests/Feature/Manufacturers/Ui/ShowManufacturerTest.php @@ -11,7 +11,7 @@ class ShowManufacturerTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('manufacturers.show', Manufacturer::factory()->create()->id)) + ->get(route('manufacturers.show', Manufacturer::factory()->create())) ->assertOk(); } } diff --git a/tests/Feature/Manufacturers/Ui/UpdateManufacturerTest.php b/tests/Feature/Manufacturers/Ui/UpdateManufacturerTest.php index 398b7fe23..9d5861300 100644 --- a/tests/Feature/Manufacturers/Ui/UpdateManufacturerTest.php +++ b/tests/Feature/Manufacturers/Ui/UpdateManufacturerTest.php @@ -11,7 +11,7 @@ class UpdateManufacturerTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('manufacturers.edit', Manufacturer::factory()->create()->id)) + ->get(route('manufacturers.edit', Manufacturer::factory()->create())) ->assertOk(); } @@ -21,7 +21,7 @@ class UpdateManufacturerTest extends TestCase $this->assertTrue(Manufacturer::where('name', 'Test Manufacturer')->exists()); $response = $this->actingAs(User::factory()->superuser()->create()) - ->put(route('manufacturers.update', ['manufacturer' => $manufacturer]), [ + ->put(route('manufacturers.update', $manufacturer), [ 'name' => 'Test Manufacturer Edited', 'notes' => 'Test Note Edited', ]) diff --git a/tests/Feature/StatusLabels/Ui/ShowStatusLabelTest.php b/tests/Feature/StatusLabels/Ui/ShowStatusLabelTest.php index 0b7389603..96e8d7552 100644 --- a/tests/Feature/StatusLabels/Ui/ShowStatusLabelTest.php +++ b/tests/Feature/StatusLabels/Ui/ShowStatusLabelTest.php @@ -11,7 +11,7 @@ class ShowStatusLabelTest extends TestCase public function testPageRenders() { $this->actingAs(User::factory()->superuser()->create()) - ->get(route('statuslabels.show', Statuslabel::factory()->create()->id)) + ->get(route('statuslabels.show', Statuslabel::factory()->create())) ->assertOk(); } } From cd7135ea77aafc655d9dd822951f24ff16a085c7 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 06:19:50 +0000 Subject: [PATCH 16/61] More test fixes Signed-off-by: snipe --- app/Http/Controllers/StatuslabelsController.php | 8 ++------ app/Http/Requests/DeleteUserRequest.php | 6 +++--- app/Presenters/StatusLabelPresenter.php | 2 +- resources/lang/en-US/general.php | 2 +- routes/web.php | 8 ++------ tests/Feature/Users/Api/DeleteUsersTest.php | 14 +++++++------- tests/Feature/Users/Ui/ViewUserTest.php | 4 ++-- 7 files changed, 18 insertions(+), 26 deletions(-) diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index c719b4c89..6fd261206 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -26,14 +26,10 @@ class StatuslabelsController extends Controller return view('statuslabels.index'); } - public function show($id) : View | RedirectResponse + public function show(Statuslabel $statuslabel) : View | RedirectResponse { $this->authorize('view', Statuslabel::class); - if ($statuslabel = Statuslabel::find($id)) { - return view('statuslabels.view')->with('statuslabel', $statuslabel); - } - - return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); + return view('statuslabels.view')->with('statuslabel', $statuslabel); } /** diff --git a/app/Http/Requests/DeleteUserRequest.php b/app/Http/Requests/DeleteUserRequest.php index 99574950d..1c200e4eb 100644 --- a/app/Http/Requests/DeleteUserRequest.php +++ b/app/Http/Requests/DeleteUserRequest.php @@ -24,11 +24,11 @@ class DeleteUserRequest extends FormRequest public function prepareForValidation(): void { - $user_to_delete = User::withTrashed()->find(request()->route('user')); + $user_to_delete = User::withTrashed()->with('managesUsers')->find(request()->route('user.id')); if ($user_to_delete) { $this->merge([ - 'user' => request()->route('user'), + 'user' => request()->route('user')->id, 'admin_id' => auth()->id(), 'managed_users' => $user_to_delete->managesUsers()->count(), 'managed_locations' => $user_to_delete->managedLocations()->count(), @@ -61,7 +61,7 @@ class DeleteUserRequest extends FormRequest public function messages(): array { - $user_to_delete = User::withTrashed()->find(request()->route('user')); + $user_to_delete = User::withTrashed()->with('managesUsers')->find(request()->route('user.id')); $messages = []; if ($user_to_delete) { diff --git a/app/Presenters/StatusLabelPresenter.php b/app/Presenters/StatusLabelPresenter.php index 2e4340004..5bc4bd883 100644 --- a/app/Presenters/StatusLabelPresenter.php +++ b/app/Presenters/StatusLabelPresenter.php @@ -28,7 +28,7 @@ class StatusLabelPresenter extends Presenter 'switchable' => false, 'title' => trans('general.name'), 'visible' => true, - 'formatter' => 'statuslabelsAssetLinkFormatter', + 'formatter' => 'statuslabelsLinkFormatter', ],[ 'field' => 'type', 'searchable' => false, diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index e7ce1e065..a34ac631b 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -587,6 +587,6 @@ return [ 'notes' => 'Add a note', ], - 'generic_model_not_found' => ':model not found', + 'generic_model_not_found' => 'That :model was not found or you do not have permission to access it', ]; diff --git a/routes/web.php b/routes/web.php index 401d0845d..f0c2ac79b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -102,9 +102,7 @@ Route::group(['middleware' => 'auth'], function () { Route::post('{manufacturers_id}/restore', [ManufacturersController::class, 'restore'] )->name('restore/manufacturer'); }); - Route::resource('manufacturers', ManufacturersController::class, [ - 'parameters' => ['manufacturer' => 'manufacturers_id'], - ]); + Route::resource('manufacturers', ManufacturersController::class); /* * Suppliers @@ -124,9 +122,7 @@ Route::group(['middleware' => 'auth'], function () { /* * Departments */ - Route::resource('departments', DepartmentsController::class, [ - 'parameters' => ['department' => 'department_id'], - ]); + Route::resource('departments', DepartmentsController::class); }); /* diff --git a/tests/Feature/Users/Api/DeleteUsersTest.php b/tests/Feature/Users/Api/DeleteUsersTest.php index 9677e5f7d..a2e43f04b 100644 --- a/tests/Feature/Users/Api/DeleteUsersTest.php +++ b/tests/Feature/Users/Api/DeleteUsersTest.php @@ -37,7 +37,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp { $user = User::factory()->deletedUser()->create(); $this->actingAsForApi(User::factory()->deleteUsers()->create()) - ->deleteJson(route('api.users.destroy', $user->id)) + ->deleteJson(route('api.users.destroy', $user)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -51,7 +51,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $this->assertFalse($manager->isDeletable()); $this->actingAsForApi(User::factory()->deleteUsers()->create()) - ->deleteJson(route('api.users.destroy', $manager->id)) + ->deleteJson(route('api.users.destroy', $manager)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -66,7 +66,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $this->assertFalse($manager->isDeletable()); $this->actingAsForApi(User::factory()->deleteUsers()->create()) - ->deleteJson(route('api.users.destroy', $manager->id)) + ->deleteJson(route('api.users.destroy', $manager)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -81,7 +81,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $this->assertFalse($manager->isDeletable()); $this->actingAsForApi(User::factory()->deleteUsers()->create()) - ->deleteJson(route('api.users.destroy', $manager->id)) + ->deleteJson(route('api.users.destroy', $manager)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -111,7 +111,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $userFromB = User::factory()->deleteUsers()->for($companyB)->create(); $this->actingAsForApi($userFromA) - ->deleteJson(route('api.users.destroy', ['user' => $userFromB->id])) + ->deleteJson(route('api.users.destroy', $userFromB)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -121,7 +121,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $this->assertNull($userFromB->deleted_at); $this->actingAsForApi($userFromB) - ->deleteJson(route('api.users.destroy', ['user' => $userFromA->id])) + ->deleteJson(route('api.users.destroy', $userFromA)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('error') @@ -131,7 +131,7 @@ class DeleteUsersTest extends TestCase implements TestsFullMultipleCompaniesSupp $this->assertNull($userFromA->deleted_at); $this->actingAsForApi($superuser) - ->deleteJson(route('api.users.destroy', ['user' => $userFromA->id])) + ->deleteJson(route('api.users.destroy', $userFromA)) ->assertOk() ->assertStatus(200) ->assertStatusMessageIs('success') diff --git a/tests/Feature/Users/Ui/ViewUserTest.php b/tests/Feature/Users/Ui/ViewUserTest.php index 791c80489..6b85d32ff 100644 --- a/tests/Feature/Users/Ui/ViewUserTest.php +++ b/tests/Feature/Users/Ui/ViewUserTest.php @@ -20,11 +20,11 @@ class ViewUserTest extends TestCase $user = User::factory()->for($companyB)->create(); $this->actingAs(User::factory()->editUsers()->for($companyA)->create()) - ->get(route('users.show', ['user' => $user->id])) + ->get(route('users.show', $user)) ->assertStatus(403); $this->actingAs($superuser) - ->get(route('users.show', ['user' => $user->id])) + ->get(route('users.show', $user)) ->assertOk() ->assertStatus(200); } From 63f4e3cc895339e186d644dd8b99e7ec3126176f Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 08:36:52 +0000 Subject: [PATCH 17/61] More breadcrumbs Signed-off-by: snipe --- app/Providers/BreadcrumbsServiceProvider.php | 98 +++++++++++++------- resources/lang/en-US/general.php | 6 ++ 2 files changed, 73 insertions(+), 31 deletions(-) diff --git a/app/Providers/BreadcrumbsServiceProvider.php b/app/Providers/BreadcrumbsServiceProvider.php index bb33c82eb..1b799e203 100644 --- a/app/Providers/BreadcrumbsServiceProvider.php +++ b/app/Providers/BreadcrumbsServiceProvider.php @@ -11,6 +11,7 @@ use App\Models\Department; use App\Models\Depreciation; use App\Models\Group; use App\Models\License; +use App\Models\LicenseSeat; use App\Models\Location; use App\Models\Manufacturer; use App\Models\Statuslabel; @@ -38,10 +39,24 @@ class BreadcrumbsServiceProvider extends ServiceProvider /** * Asset Breadcrumbs */ - Breadcrumbs::for('hardware.index', fn (Trail $trail) => - $trail->parent('home', route('home')) - ->push(trans('general.assets'), route('hardware.index')) - ); + + + if ((request()->is('hardware*')) && (request()->status!='')) { + Breadcrumbs::for('hardware.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.assets'), route('hardware.index')) + ->push(request()->status.' Assets', route('hardware.index', ['status' => request()->status])) + ); + + } else { + Breadcrumbs::for('hardware.index', fn (Trail $trail) => + $trail->parent('home', route('home')) + ->push(trans('general.assets'), route('hardware.index')) + ); + } + + + Breadcrumbs::for('hardware.create', fn (Trail $trail) => $trail->parent('hardware.index', route('hardware.index')) @@ -50,14 +65,22 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('hardware.show', fn (Trail $trail, Asset $asset) => $trail->parent('hardware.index', route('hardware.index')) - ->push('View '.$asset->asset_tag, route('home')) + ->push($asset->asset_tag, route('home')) ); Breadcrumbs::for('hardware.edit', fn (Trail $trail, Asset $asset) => $trail->parent('hardware.index', route('hardware.index')) - ->push('Edit asset: '.$asset->asset_tag, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $asset->asset_tag]), route('home')) ); + // Non-resource routes + Breadcrumbs::for('hardware.checkout.create', fn(Trail $trail, Asset $asset) => $trail + ->parent('hardware.show', $asset) + ->push(trans('general.checkout'), null) + ); + + + /** * Asset Model Breadcrumbs */ @@ -73,12 +96,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('models.show', fn (Trail $trail, AssetModel $model) => $trail->parent('models.index', route('models.index')) - ->push('View '.$model->name, route('home')) + ->push($model->name, route('home')) ); Breadcrumbs::for('models.edit', fn (Trail $trail, AssetModel $model) => $trail->parent('models.index', route('models.index')) - ->push('Edit: '.$model->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $model->name]), route('home')) ); @@ -102,7 +125,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('accessories.edit', fn (Trail $trail, Accessory $accessory) => $trail->parent('accessories.index', route('accessories.index')) - ->push('Edit: '.$accessory->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $accessory->name]), route('home')) ); @@ -126,7 +149,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('categories.edit', fn (Trail $trail, Category $category) => $trail->parent('categories.index', route('categories.index')) - ->push('Edit: '.$category->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $category->name]), route('home')) ); @@ -151,7 +174,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('companies.edit', fn (Trail $trail, Company $company) => $trail->parent('companies.index', route('companies.index')) - ->push('Edit: '.$company->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $company->name]), route('home')) ); @@ -175,7 +198,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('components.edit', fn (Trail $trail, Component $component) => $trail->parent('components.index', route('components.index')) - ->push('Edit: '.$component->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $component->name]), route('home')) ); @@ -199,7 +222,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('consumables.edit', fn (Trail $trail, Consumable $consumable) => $trail->parent('consumables.index', route('consumables.index')) - ->push('Edit: '.$consumable->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $consumable->name]), route('home')) ); @@ -219,12 +242,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('departments.show', fn (Trail $trail, Department $department) => $trail->parent('departments.index', route('departments.index')) - ->push('View '.$department->name, route('home')) + ->push($department->name, route('home')) ); Breadcrumbs::for('departments.edit', fn (Trail $trail, Department $department) => $trail->parent('departments.index', route('departments.index')) - ->push('Edit: '.$department->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $department->name]), route('home')) ); @@ -243,12 +266,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('depreciations.show', fn (Trail $trail, Depreciation $depreciation) => $trail->parent('depreciations.index', route('depreciations.index')) - ->push('View '.$depreciation->name, route('home')) + ->push($depreciation->name, route('home')) ); Breadcrumbs::for('depreciations.edit', fn (Trail $trail, Depreciation $depreciation) => $trail->parent('depreciations.index', route('depreciations.index')) - ->push('Edit: '.$depreciation->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $depreciation->name]), route('home')) ); /** @@ -266,12 +289,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('groups.show', fn (Trail $trail, Group $group) => $trail->parent('groups.index', route('groups.index')) - ->push('View '.$group->name, route('home')) + ->push($group->name, route('home')) ); Breadcrumbs::for('groups.edit', fn (Trail $trail, Group $group) => $trail->parent('groups.index', route('groups.index')) - ->push('Edit: '.$group->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $group->name]), route('home')) ); @@ -290,14 +313,27 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('licenses.show', fn (Trail $trail, License $license) => $trail->parent('licenses.index', route('licenses.index')) - ->push('View '.$license->username, route('home')) + ->push($license->name, route('licenses.show', $license)) ); Breadcrumbs::for('licenses.edit', fn (Trail $trail, License $license) => $trail->parent('licenses.index', route('licenses.index')) - ->push('Edit: '.$license->username, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $license->name]), route('home')) ); + + // Non-resource routes + Breadcrumbs::for('licenses.checkout', fn(Trail $trail, License $license) => $trail + ->parent('licenses.show', $license) + ->push(trans('general.checkout'), null) + ); + + Breadcrumbs::for('licenses.checkin', fn(Trail $trail, LicenseSeat $licenseSeat) => $trail + ->parent('licenses.show', $licenseSeat->license) + ->push(trans('general.checkin'), null) + ); + + /** * Locations Breadcrumbs */ @@ -313,12 +349,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('locations.show', fn (Trail $trail, Location $location) => $trail->parent('locations.index', route('locations.index')) - ->push('View '.$location->name, route('home')) + ->push($location->name, route('home')) ); Breadcrumbs::for('locations.edit', fn (Trail $trail, Location $location) => $trail->parent('locations.index', route('locations.index')) - ->push('Edit: '.$location->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $location->name]), route('home')) ); @@ -337,12 +373,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('manufacturers.show', fn (Trail $trail, Manufacturer $manufacturer) => $trail->parent('manufacturers.index', route('manufacturers.index')) - ->push('View '.$manufacturer->name, route('home')) + ->push($manufacturer->name, route('home')) ); Breadcrumbs::for('manufacturers.edit', fn (Trail $trail, Manufacturer $manufacturer) => $trail->parent('manufacturers.index', route('manufacturers.index')) - ->push('Edit: '.$manufacturer->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $manufacturer->name]), route('home')) ); @@ -361,12 +397,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('statuslabels.show', fn (Trail $trail, Statuslabel $statuslabel) => $trail->parent('statuslabels.index', route('statuslabels.index')) - ->push('View '.$statuslabel->name, route('home')) + ->push($statuslabel->name, route('home')) ); Breadcrumbs::for('statuslabels.edit', fn (Trail $trail, Statuslabel $statuslabel) => $trail->parent('statuslabels.index', route('statuslabels.index')) - ->push('Edit: '.$statuslabel->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $statuslabel->name]), route('home')) ); @@ -385,12 +421,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('suppliers.show', fn (Trail $trail, Supplier $supplier) => $trail->parent('suppliers.index', route('suppliers.index')) - ->push('View '.$supplier->name, route('home')) + ->push($supplier->name, route('home')) ); Breadcrumbs::for('suppliers.edit', fn (Trail $trail, Supplier $supplier) => $trail->parent('suppliers.index', route('suppliers.index')) - ->push('Edit: '.$supplier->name, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $supplier->name]), route('home')) ); @@ -410,12 +446,12 @@ class BreadcrumbsServiceProvider extends ServiceProvider Breadcrumbs::for('users.show', fn (Trail $trail, User $user) => $trail->parent('users.index', route('users.index')) - ->push('View '.$user->username, route('home')) + ->push($user->username, route('home')) ); Breadcrumbs::for('users.edit', fn (Trail $trail, User $user) => $trail->parent('users.index', route('users.index')) - ->push('Edit: '.$user->username, route('home')) + ->push(trans('general.actions.edit_item', ['name' => $user->name]), route('home')) ); diff --git a/resources/lang/en-US/general.php b/resources/lang/en-US/general.php index a34ac631b..a35704de7 100644 --- a/resources/lang/en-US/general.php +++ b/resources/lang/en-US/general.php @@ -587,6 +587,12 @@ return [ 'notes' => 'Add a note', ], + 'actions' => [ + 'edit_item' => 'Edit :name', + 'checkout_item' => 'Checkout :name', + 'checkin_item' => 'Checkin :name', + ], + 'generic_model_not_found' => 'That :model was not found or you do not have permission to access it', ]; From 457228d033e484b70d3b9ed2dfecca0283c175ac Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 08:37:06 +0000 Subject: [PATCH 18/61] Route model binding on more asset methods Signed-off-by: snipe --- routes/web/hardware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/web/hardware.php b/routes/web/hardware.php index dd1f02638..40449c6a3 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -95,7 +95,7 @@ Route::group( )->name('label/hardware'); - Route::get('{assetId}/checkout', + Route::get('{asset}/checkout', [AssetCheckoutController::class, 'create'] )->name('hardware.checkout.create'); From 9d299340da0736be4fb8b1cfc9a3f3566312eae3 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 08:37:39 +0000 Subject: [PATCH 19/61] =?UTF-8?q?Checkout=20license=20modifications=20(thi?= =?UTF-8?q?s=20doesn=E2=80=99t=20work=20yet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: snipe --- routes/web/licenses.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/routes/web/licenses.php b/routes/web/licenses.php index 7212a4764..610de2a5c 100644 --- a/routes/web/licenses.php +++ b/routes/web/licenses.php @@ -2,6 +2,8 @@ use App\Http\Controllers\Licenses; use Illuminate\Support\Facades\Route; +use App\Models\License; +use Tabuna\Breadcrumbs\Trail; // Licenses Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () { @@ -10,14 +12,17 @@ Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () { Route::get('{licenseId}/freecheckout', [Licenses\LicensesController::class, 'getFreeLicense'] )->name('licenses.freecheckout'); - Route::get('{licenseId}/checkout/{seatId?}', + + Route::get('{license}/checkout/{seatId?}', [Licenses\LicenseCheckoutController::class, 'create'] )->name('licenses.checkout'); + Route::post( '{licenseId}/checkout/{seatId?}', [Licenses\LicenseCheckoutController::class, 'store'] ); //name() would duplicate here, so we skip it. - Route::get('{licenseSeatId}/checkin/{backto?}', + + Route::get('{licenseSeat}/checkin/{backto?}', [Licenses\LicenseCheckinController::class, 'create'] )->name('licenses.checkin'); @@ -59,5 +64,4 @@ Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () { Route::resource('licenses', Licenses\LicensesController::class, [ 'middleware' => ['auth'], - 'parameters' => ['license' => 'license_id'], ]); From 4c1856b91f5da2b965b8a34d2fdd0d9fa1cb92ae Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 19 Feb 2025 08:37:58 +0000 Subject: [PATCH 20/61] Fixed wonky quote in HTML Signed-off-by: snipe --- resources/views/layouts/default.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index c5b105071..bfacf4ce8 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -214,7 +214,7 @@ dir="{{ Helper::determineLanguageDirection() }}">