Merge pull request #16272 from snipe/experiments/breadcrumbs
Some checks failed
Crowdin Action / upload-sources-to-crowdin (push) Has been cancelled
Docker images (Alpine) / docker (push) Has been cancelled
Docker images / docker (push) Has been cancelled
Tests in MySQL / PHP ${{ matrix.php-version }} (8.1) (push) Has been cancelled
Tests in MySQL / PHP ${{ matrix.php-version }} (8.2) (push) Has been cancelled
Tests in MySQL / PHP ${{ matrix.php-version }} (8.3) (push) Has been cancelled
Tests in SQLite / PHP ${{ matrix.php-version }} (8.1.1) (push) Has been cancelled

Experimental WIP - added breadcrumbs, route model binding for resource routes
This commit is contained in:
snipe 2025-02-20 19:21:58 +00:00 committed by GitHub
commit 5b63eb5a15
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
89 changed files with 1614 additions and 955 deletions

View file

@ -122,6 +122,25 @@ 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 = str_plural(strtolower(last(explode('\\', $e->getModel())))).'.index';
// Sigh. Fucking laravel.
if ($route == 'assets.index') {
$route = 'hardware.index';
} elseif ($route == 'reporttemplates.index') {
$route = 'reports/custom';
} elseif ($route == 'predefinedkits.index') {
$route = 'kits.index';
}
return redirect()
->route($route)
->withError(trans('general.generic_model_not_found', ['model' => $model_name]));
}
if ($this->isHttpException($e) && (isset($statusCode)) && ($statusCode == '404' )) {

View file

@ -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'));

View file

@ -59,6 +59,8 @@ class IconHelper
return 'fas fa-cog';
case 'angle-left':
return 'fas fa-angle-left';
case 'angle-right':
return 'fas fa-angle-right';
case 'warning':
return 'fas fa-exclamation-triangle';
case 'kits':
@ -184,6 +186,8 @@ class IconHelper
return 'fa-regular fa-id-card';
case 'department' :
return 'fa-solid fa-building-user';
case 'home' :
return 'fa-solid fa-house';
case 'note':
case 'notes':
return 'fas fa-sticky-note';

View file

@ -95,16 +95,10 @@ class AccessoriesController extends Controller
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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'));
$this->authorize('update', Accessory::class);
return view('accessories.edit')->with('item', $accessory)->with('category_type', 'accessory');
}
/**
@ -114,19 +108,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 +129,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 +218,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'));
}
}

View file

@ -139,19 +139,12 @@ class AssetMaintenancesController extends Controller
* @version v1.0
* @since [v1.8]
*/
public function edit($assetMaintenanceId = null) : View | RedirectResponse
public function edit(AssetMaintenance $maintenance) : View | RedirectResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
// Redirect to the asset maintenance management page
if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) {
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
} elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) {
return static::getInsufficientPermissionsRedirect();
}
@ -161,7 +154,7 @@ class AssetMaintenancesController extends Controller
return view('asset_maintenances/edit')
->with('selectedAsset', null)
->with('assetMaintenanceType', $assetMaintenanceType)
->with('item', $assetMaintenance);
->with('item', $maintenance);
}
/**
@ -174,24 +167,20 @@ class AssetMaintenancesController extends Controller
* @version v1.0
* @since [v1.8]
*/
public function update(Request $request, $assetMaintenanceId = null) : View | RedirectResponse
public function update(Request $request, AssetMaintenance $maintenance) : View | RedirectResponse
{
$this->authorize('update', Asset::class);
// Check if the asset maintenance exists
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
// Redirect to the asset maintenance management page
if ((!$maintenance->asset) || ($maintenance->asset->deleted_at!='')) {
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
} elseif (! Company::isCurrentUserHasAccess($maintenance->asset)) {
return static::getInsufficientPermissionsRedirect();
}
$assetMaintenance->supplier_id = $request->input('supplier_id');
$assetMaintenance->is_warranty = $request->input('is_warranty');
$assetMaintenance->cost = $request->input('cost');
$assetMaintenance->notes = $request->input('notes');
$maintenance->supplier_id = $request->input('supplier_id');
$maintenance->is_warranty = $request->input('is_warranty');
$maintenance->cost = $request->input('cost');
$maintenance->notes = $request->input('notes');
$asset = Asset::find(request('asset_id'));
@ -200,39 +189,39 @@ class AssetMaintenancesController extends Controller
}
// Save the asset maintenance data
$assetMaintenance->asset_id = $request->input('asset_id');
$assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
$assetMaintenance->title = $request->input('title');
$assetMaintenance->start_date = $request->input('start_date');
$assetMaintenance->completion_date = $request->input('completion_date');
$maintenance->asset_id = $request->input('asset_id');
$maintenance->asset_maintenance_type = $request->input('asset_maintenance_type');
$maintenance->title = $request->input('title');
$maintenance->start_date = $request->input('start_date');
$maintenance->completion_date = $request->input('completion_date');
if (($assetMaintenance->completion_date == null)
if (($maintenance->completion_date == null)
) {
if (($assetMaintenance->asset_maintenance_time !== 0)
|| (! is_null($assetMaintenance->asset_maintenance_time))
if (($maintenance->asset_maintenance_time !== 0)
|| (! is_null($maintenance->asset_maintenance_time))
) {
$assetMaintenance->asset_maintenance_time = null;
$maintenance->asset_maintenance_time = null;
}
}
if (($assetMaintenance->completion_date !== null)
&& ($assetMaintenance->start_date !== '')
&& ($assetMaintenance->start_date !== '0000-00-00')
if (($maintenance->completion_date !== null)
&& ($maintenance->start_date !== '')
&& ($maintenance->start_date !== '0000-00-00')
) {
$startDate = Carbon::parse($assetMaintenance->start_date);
$completionDate = Carbon::parse($assetMaintenance->completion_date);
$assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
$startDate = Carbon::parse($maintenance->start_date);
$completionDate = Carbon::parse($maintenance->completion_date);
$maintenance->asset_maintenance_time = $completionDate->diffInDays($startDate);
}
// Was the asset maintenance created?
if ($assetMaintenance->save()) {
if ($maintenance->save()) {
// Redirect to the new asset maintenance page
return redirect()->route('maintenances.index')
->with('success', trans('admin/asset_maintenances/message.edit.success'));
->with('success', trans('admin/asset_maintenances/message.edit.success'));
}
return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors());
return redirect()->back()->withInput()->withErrors($maintenance->getErrors());
}
/**
@ -271,19 +260,13 @@ class AssetMaintenancesController extends Controller
* @version v1.0
* @since [v1.8]
*/
public function show($assetMaintenanceId) : View | RedirectResponse
public function show(AssetMaintenance $maintenance) : View | RedirectResponse
{
$this->authorize('view', Asset::class);
// Check if the asset maintenance exists
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
// Redirect to the asset maintenance management page
return redirect()->route('maintenances.index')
->with('error', trans('admin/asset_maintenances/message.not_found'));
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
if (! Company::isCurrentUserHasAccess($maintenance->asset)) {
return static::getInsufficientPermissionsRedirect();
}
return view('asset_maintenances/view')->with('assetMaintenance', $assetMaintenance);
return view('asset_maintenances/view')->with('assetMaintenance', $maintenance);
}
}

View file

@ -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'));
}
/**

View file

@ -26,17 +26,14 @@ class AssetCheckoutController extends Controller
* @since [v1.0]
* @return \Illuminate\Contracts\View\View
*/
public function create($assetId) : View | RedirectResponse
public function create(Asset $asset) : View | RedirectResponse
{
// Check if the asset exists
if (is_null($asset = Asset::with('company')->find(e($assetId)))) {
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
}
$this->authorize('checkout', $asset);
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
return redirect()->route('hardware.show', $asset)
->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
if ($asset->availableForCheckout()) {
@ -45,8 +42,8 @@ class AssetCheckoutController extends Controller
->with('table_name', 'Assets');
}
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available'));
return redirect()->route('hardware.index')
->with('error', trans('admin/hardware/message.checkout.not_available'));
}
/**
@ -68,7 +65,7 @@ class AssetCheckoutController extends Controller
$this->authorize('checkout', $asset);
if (!$asset->model) {
return redirect()->route('hardware.show', $asset->id)->with('error', trans('admin/hardware/general.model_invalid_fix'));
return redirect()->route('hardware.show', $asset)->with('error', trans('admin/hardware/general.model_invalid_fix'));
}
$admin = auth()->user();

View file

@ -202,7 +202,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[] = "<a href='" . route('hardware.show', ['hardware' => $asset->id]) . "' style='color: white;'>" . e($asset->asset_tag) . "</a>";
$successes[] = "<a href='" . route('hardware.show', $asset) . "' style='color: white;'>" . e($asset->asset_tag) . "</a>";
} else {
$failures[] = join(",", $asset->getErrors()->all());
@ -223,7 +223,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'))
@ -241,20 +241,14 @@ class AssetsController extends Controller
* Returns a view that presents a form to edit an existing asset.
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @param int $assetId
* @since [v1.0]
* @return \Illuminate\Contracts\View\View
*/
public function edit($assetId = null) : View | RedirectResponse
public function edit(Asset $asset) : View | RedirectResponse
{
if (! $item = 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'));
}
//Handles company checks and permissions.
$this->authorize($item);
return view('hardware/edit', compact('item'))
$this->authorize($asset);
return view('hardware/edit')
->with('item', $asset)
->with('statuslabel_list', Helper::statusLabelList())
->with('statuslabel_types', Helper::statusTypeList());
}
@ -268,15 +262,14 @@ class AssetsController extends Controller
* @since [v1.0]
* @return \Illuminate\Contracts\View\View
*/
public function show($assetId = null) : View | RedirectResponse
public function show(Asset $asset) : View | RedirectResponse
{
$asset = Asset::withTrashed()->find($assetId);
$this->authorize('view', $asset);
$settings = Setting::getSettings();
if (isset($asset)) {
$audit_log = Actionlog::where('action_type', '=', 'audit')
->where('item_id', '=', $assetId)
->where('item_id', '=', $asset->id)
->where('item_type', '=', Asset::class)
->orderBy('created_at', 'DESC')->first();
@ -292,7 +285,7 @@ class AssetsController extends Controller
$qr_code = (object) [
'display' => $settings->qr_code == '1',
'url' => route('qr_code/hardware', $asset->id),
'url' => route('qr_code/hardware', $asset),
];
return view('hardware/view', compact('asset', 'qr_code', 'settings'))
@ -309,14 +302,9 @@ class AssetsController extends Controller
* @since [v1.0]
* @author [A. Gianotto] [<snipe@snipe.net>]
*/
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);
@ -431,7 +419,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'));
}
@ -532,12 +520,12 @@ class AssetsController extends Controller
* @param int $assetId
* @since [v1.0]
*/
public function getQrCode($assetId = null) : Response | BinaryFileResponse | string | bool
public function getQrCode(Asset $asset) : Response | BinaryFileResponse | string | bool
{
$settings = Setting::getSettings();
if (($settings->qr_code == '1') && ($settings->label2_2d_type !== 'none')) {
$asset = Asset::withTrashed()->find($assetId);
if ($asset) {
$size = Helper::barcodeDimensions($settings->label2_2d_type);
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png';
@ -878,12 +866,11 @@ class AssetsController extends Controller
return view('hardware/quickscan-checkin')->with('statusLabel_list', Helper::statusLabelList());
}
public function audit($id)
public function audit(Asset $asset)
{
$settings = Setting::getSettings();
$this->authorize('audit', Asset::class);
$dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString();
$asset = Asset::findOrFail($id);
return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list');
}
@ -902,7 +889,7 @@ class AssetsController extends Controller
}
public function auditStore(UploadFileRequest $request, $id)
public function auditStore(UploadFileRequest $request, Asset $asset)
{
$this->authorize('audit', Asset::class);
@ -917,8 +904,6 @@ class AssetsController extends Controller
return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors()->all()));
}
$asset = Asset::findOrFail($id);
/**
* Even though we do a save() further down, we don't want to log this as a "normal" asset update,
* which would trigger the Asset Observer and would log an asset *update* log entry (because the

View file

@ -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'));
}
}

View file

@ -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')->with('item', $company);
}
/**
@ -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);
}
}

View file

@ -107,15 +107,13 @@ 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('item', $component)
->with('category_type', 'component');
}
@ -130,11 +128,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 +211,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'));
}
}

View file

@ -104,15 +104,13 @@ 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('item', $consumable)
->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 +124,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 +197,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', compact('consumable'));
}
public function clone(Consumable $consumable) : View

View file

@ -193,10 +193,8 @@ class CustomFieldsController extends Controller
* @param int $id
* @since [v4.0]
*/
public function edit(Request $request, $id) : View | RedirectResponse
public function edit(Request $request, CustomField $field) : View | RedirectResponse
{
if ($field = CustomField::find($id)) {
$this->authorize('update', $field);
$fieldsets = CustomFieldset::get();
$customFormat = '';
@ -210,11 +208,7 @@ class CustomFieldsController extends Controller
'fieldsets' => $fieldsets,
'predefinedFormats' => Helper::predefined_formats(),
]);
}
return redirect()->route("fields.index")
->with("error", trans('admin/custom_fields/message.field.invalid'));
}
@ -229,13 +223,9 @@ class CustomFieldsController extends Controller
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(CustomFieldRequest $request, $id) : RedirectResponse
public function update(CustomFieldRequest $request, CustomField $field) : RedirectResponse
{
$field = CustomField::find($id);
$this->authorize('update', $field);
$show_in_email = $request->get("show_in_email", 0);
$display_in_user_view = $request->get("display_in_user_view", 0);

View file

@ -35,10 +35,12 @@ class CustomFieldsetsController extends Controller
* @param int $id
* @since [v1.8]
*/
public function show($id) : View | RedirectResponse
public function show(CustomFieldset $fieldset) : View | RedirectResponse
{
$cfset = CustomFieldset::with('fields')
->where('id', '=', $id)->orderBy('id', 'ASC')->first();
->where('id', '=', $fieldset->id)
->orderBy('id', 'ASC')
->first();
$this->authorize('view', $cfset);
@ -122,16 +124,10 @@ class CustomFieldsetsController extends Controller
* @param int $id
* @since [v6.0.14]
*/
public function edit($id) : View | RedirectResponse
public function edit(CustomFieldset $fieldset) : View | RedirectResponse
{
$this->authorize('create', CustomField::class);
if ($fieldset = CustomFieldset::find($id)) {
return view('custom_fields.fieldsets.edit')->with('item', $fieldset);
}
return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/general.fieldset_does_not_exist', ['id' => $id]));
return view('custom_fields.fieldsets.edit')->with('item', $fieldset);
}
/**
@ -141,23 +137,18 @@ class CustomFieldsetsController extends Controller
* @param int $id
* @since [v6.0.14]
*/
public function update(Request $request, $id) : RedirectResponse
public function update(Request $request, CustomFieldset $fieldset) : RedirectResponse
{
$this->authorize('create', CustomField::class);
if ($fieldset = CustomFieldset::find($id)) {
$fieldset->name = $request->input('name');
if ($fieldset->save()) {
return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/general.fieldset_updated'));
}
return redirect()->back()->withInput()->withErrors($fieldset->getErrors());
$fieldset->name = $request->input('name');
if ($fieldset->save()) {
return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/general.fieldset_updated'));
}
return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/general.fieldset_does_not_exist', ['id' => $id]));
return redirect()->back()->withInput()->withErrors($fieldset->getErrors());
}
/**

View file

@ -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);

View file

@ -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')->with('item', $depreciation);
}
/**
@ -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);

View file

@ -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('group', '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', compact('group'));
}
}

View file

@ -4,10 +4,8 @@ namespace App\Http\Controllers\Kits;
use App\Http\Controllers\CheckInOutRequest;
use App\Http\Controllers\Controller;
use App\Models\PredefinedKit;
use App\Models\Asset;
use App\Models\PredefinedLicence;
use App\Models\PredefinedModel;
use App\Models\PredefinedKit;
use App\Models\User;
use App\Services\PredefinedKitCheckoutService;
use Illuminate\Http\Request;
@ -35,12 +33,9 @@ class CheckoutKitController extends Controller
* @author [D. Minaev.] [<dmitriy.minaev.v@gmail.com>]
* @return \Illuminate\Contracts\View\View View to checkout
*/
public function showCheckout($kit_id)
public function showCheckout(PredefinedKit $kit)
{
$this->authorize('checkout', Asset::class);
$kit = PredefinedKit::findOrFail($kit_id);
return view('kits/checkout')->with('kit', $kit);
}

View file

@ -76,17 +76,15 @@ class PredefinedKitsController extends Controller
* @param int $kit_id
* @return \Illuminate\Contracts\View\View
*/
public function edit($kit_id = null)
public function edit(PredefinedKit $kit)
{
$this->authorize('update', PredefinedKit::class);
if ($kit = PredefinedKit::find($kit_id)) {
return view('kits/edit')
->with('item', $kit)
->with('models', $kit->models)
->with('licenses', $kit->licenses);
}
return redirect()->route('kits.index')->with('error', trans('admin/kits/general.kit_none'));
}
/**
@ -98,15 +96,9 @@ class PredefinedKitsController extends Controller
* @param int $kit_id
* @return \Illuminate\Http\RedirectResponse
*/
public function update(ImageUploadRequest $request, $kit_id = null)
public function update(ImageUploadRequest $request, PredefinedKit $kit)
{
$this->authorize('update', PredefinedKit::class);
// Check if the kit exists
if (is_null($kit = PredefinedKit::find($kit_id))) {
// Redirect to the kits management page
return redirect()->route('kits.index')->with('error', trans('admin/kits/general.kit_none'));
}
$kit->name = $request->input('name');
if ($kit->save()) {
@ -153,9 +145,9 @@ class PredefinedKitsController extends Controller
* @param int $modelId
* @return \Illuminate\Contracts\View\View
*/
public function show($kit_id = null)
public function show(PredefinedKit $kit)
{
return $this->edit($kit_id);
return $this->edit($kit);
}
/**

View file

@ -28,16 +28,11 @@ class LicenseCheckinController extends Controller
* @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create($seatId = null, $backTo = null)
public function create(LicenseSeat $licenseSeat, $backTo = null)
{
// Check if the asset exists
if (is_null($licenseSeat = LicenseSeat::find($seatId)) || is_null($license = License::find($licenseSeat->license_id))) {
// Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
}
$license = License::find($licenseSeat->license_id);
$this->authorize('checkout', $license);
return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo);
}

View file

@ -28,33 +28,24 @@ class LicenseCheckoutController extends Controller
* @return \Illuminate\Contracts\View\View
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create($id)
public function create(License $license)
{
$this->authorize('checkout', $license);
if ($license = License::find($id)) {
if ($license->category) {
$this->authorize('checkout', $license);
if ($license->category) {
// Make sure there is at least one available to checkout
if ($license->availCount()->count() < 1){
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkout.not_enough_seats'));
}
// Return the checkout view
return view('licenses/checkout', compact('license'));
// Make sure there is at least one available to checkout
if ($license->availCount()->count() < 1) {
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkout.not_enough_seats'));
}
// Invalid category
return redirect()->route('licenses.edit', ['license' => $license->id])
->with('error', trans('general.invalid_item_category_single', ['type' => trans('general.license')]));
// Return the checkout view
return view('licenses/checkout', compact('license'));
}
// Not found
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
// Invalid category
return redirect()->route('licenses.edit', ['license' => $license->id])
->with('error', trans('general.invalid_item_category_single', ['type' => trans('general.license')]));
}

View file

@ -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,8 @@ class LicensesController extends Controller
'0' => 'No',
];
return view('licenses/edit', compact('item'))
return view('licenses/edit')
->with('item', $license)
->with('depreciation_list', Helper::depreciationList())
->with('maintained_list', $maintained_list);
}
@ -153,11 +151,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 +197,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 +234,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 +258,10 @@ class LicensesController extends Controller
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @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'));

View file

@ -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'));

View file

@ -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')->with('item', $manufacturer);
}
/**
@ -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'));
}
/**

View file

@ -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);
}
/**
@ -91,20 +87,15 @@ 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('item', $statuslabel)
->with('use_statuslabel_type', $statuslabel);
}
/**
@ -112,14 +103,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')]);

View file

@ -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')->with('item', $supplier);
}
/**
@ -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'));
}
}

View file

@ -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,7 +324,7 @@ 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, $id)
{
$this->authorize('delete', User::class);
@ -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);

View file

@ -24,7 +24,7 @@ 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'));
if ($user_to_delete) {
$this->merge([
@ -61,7 +61,8 @@ 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'));
$messages = [];
if ($user_to_delete) {

View file

@ -22,6 +22,15 @@ class AssetMaintenancesPresenter extends Presenter
'title' => trans('general.id'),
'visible' => false,
], [
'field' => 'title',
'searchable' => true,
'sortable' => true,
'switchable' => true,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'maintenancesLinkFormatter',
],
[
'field' => 'company',
'searchable' => true,
'sortable' => true,

View file

@ -35,7 +35,7 @@ class AssetPresenter extends Presenter
'switchable' => true,
'title' => trans('general.company'),
'visible' => false,
'formatter' => 'assetCompanyObjFilterFormatter',
'formatter' => 'companiesLinkObjFormatter',
], [
'field' => 'name',
'searchable' => true,

View file

@ -28,7 +28,7 @@ class StatusLabelPresenter extends Presenter
'switchable' => false,
'title' => trans('general.name'),
'visible' => true,
'formatter' => 'statuslabelsAssetLinkFormatter',
'formatter' => 'statuslabelsLinkFormatter',
],[
'field' => 'type',
'searchable' => false,

View file

@ -0,0 +1,539 @@
<?php namespace App\Providers;
use App\Models\Accessory;
use App\Models\Asset;
use App\Models\AssetMaintenance;
use App\Models\AssetModel;
use App\Models\Category;
use App\Models\Company;
use App\Models\Component;
use App\Models\Consumable;
use App\Models\CustomField;
use App\Models\CustomFieldset;
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\PredefinedKit;
use App\Models\Statuslabel;
use App\Models\Supplier;
use App\Models\User;
use Illuminate\Support\ServiceProvider;
use Tabuna\Breadcrumbs\Breadcrumbs;
use Tabuna\Breadcrumbs\Trail;
class BreadcrumbsServiceProvider extends ServiceProvider
{
/**
* Handles the resource routes for first-class objects
*
* @return void
*/
public function boot()
{
// Default home
Breadcrumbs::for('home', fn (Trail $trail) =>
$trail->push('<x-icon type="home" /><span class="sr-only">'.trans('general.dashboard').'</span>', route('home'))
);
/**
* Asset Breadcrumbs
*/
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'))
->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->present()->fullName(), route('hardware.show', $asset))
);
Breadcrumbs::for('hardware.edit', fn (Trail $trail, Asset $asset) =>
$trail->parent('hardware.index', route('hardware.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $asset->asset_tag]), route('hardware.edit', $asset))
);
/**
* Asset Model Breadcrumbs
*/
Breadcrumbs::for('models.index', fn (Trail $trail) =>
$trail->parent('hardware.index', route('hardware.index'))
->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('models.create'))
);
Breadcrumbs::for('models.show', fn (Trail $trail, AssetModel $model) =>
$trail->parent('models.index', route('models.index'))
->push($model->name, route('models.show', $model))
);
Breadcrumbs::for('models.edit', fn (Trail $trail, AssetModel $model) =>
$trail->parent('models.index', route('models.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $model->name]), route('models.edit', $model))
);
/**
* 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('accessories.create'))
);
Breadcrumbs::for('accessories.show', fn (Trail $trail, Accessory $accessory) =>
$trail->parent('accessories.index', route('accessories.index'))
->push($accessory->name, route('accessories.show', $accessory))
);
Breadcrumbs::for('accessories.edit', fn (Trail $trail, Accessory $accessory) =>
$trail->parent('accessories.index', route('accessories.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $accessory->name]), route('accessories.edit', $accessory))
);
/**
* 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('categories.create'))
);
Breadcrumbs::for('categories.show', fn (Trail $trail, Category $category) =>
$trail->parent('categories.index', route('categories.index'))
->push($category->name, route('categories.show', $category))
);
Breadcrumbs::for('categories.edit', fn (Trail $trail, Category $category) =>
$trail->parent('categories.index', route('categories.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $category->name]), route('categories.edit', $category))
);
/**
* 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('companies.create'))
);
Breadcrumbs::for('companies.show', fn (Trail $trail, Company $company) =>
$trail->parent('companies.index', route('companies.index'))
->push($company->name, route('companies.show', $company))
);
Breadcrumbs::for('companies.edit', fn (Trail $trail, Company $company) =>
$trail->parent('companies.index', route('companies.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $company->name]), route('companies.edit', $company))
);
/**
* 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('components.create'))
);
Breadcrumbs::for('components.show', fn (Trail $trail, Component $component) =>
$trail->parent('components.index', route('components.index'))
->push($component->name, route('components.show', $component))
);
Breadcrumbs::for('components.edit', fn (Trail $trail, Component $component) =>
$trail->parent('components.index', route('components.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $component->name]), route('components.edit', $component))
);
/**
* 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('consumables.create'))
);
Breadcrumbs::for('consumables.show', fn (Trail $trail, Consumable $consumable) =>
$trail->parent('consumables.index', route('consumables.index'))
->push($consumable->name, route('consumables.show', $consumable))
);
Breadcrumbs::for('consumables.edit', fn (Trail $trail, Consumable $consumable) =>
$trail->parent('consumables.index', route('consumables.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $consumable->name]), route('consumables.edit', $consumable))
);
/**
* Custom fields Breadcrumbs
*/
Breadcrumbs::for('fields.index', fn (Trail $trail) =>
$trail->parent('models.index', route('models.index'))
->push(trans('admin/custom_fields/general.custom_fields'), route('fields.index'))
);
Breadcrumbs::for('fields.create', fn (Trail $trail) =>
$trail->parent('fields.index', route('fields.index'))
->push(trans('general.create'), route('fields.create'))
);
Breadcrumbs::for('fields.edit', fn (Trail $trail, CustomField $field) =>
$trail->parent('fields.index', route('fields.index'))
->push($field->name, route('fields.edit', $field))
);
/**
* Custom fieldsets Breadcrumbs
*/
Breadcrumbs::for('fieldsets.create', fn (Trail $trail) =>
$trail->parent('fields.index', route('fields.index'))
->push(trans('general.create'), route('fieldsets.create'))
);
Breadcrumbs::for('fieldsets.show', fn (Trail $trail, CustomFieldset $fieldset) =>
$trail->parent('fields.index', route('fields.index'))
->push($fieldset->name, route('fields.index'))
);
Breadcrumbs::for('fieldsets.edit', fn (Trail $trail, CustomFieldset $fieldset) =>
$trail->parent('fields.index', route('fields.index'))
->push($fieldset->name, route('fieldsets.edit', $fieldset))
);
/**
* 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('departments.create'))
);
Breadcrumbs::for('departments.show', fn (Trail $trail, Department $department) =>
$trail->parent('departments.index', route('departments.index'))
->push($department->name, route('home'))
);
Breadcrumbs::for('departments.edit', fn (Trail $trail, Department $department) =>
$trail->parent('departments.index', route('departments.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $department->name]), route('departments.edit', $department))
);
/**
* 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('depreciations.create'))
);
Breadcrumbs::for('depreciations.show', fn (Trail $trail, Depreciation $depreciation) =>
$trail->parent('depreciations.index', route('depreciations.index'))
->push($depreciation->name, route('depreciations.show', $depreciation))
);
Breadcrumbs::for('depreciations.edit', fn (Trail $trail, Depreciation $depreciation) =>
$trail->parent('depreciations.index', route('depreciations.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $depreciation->name]), route('depreciations.edit', $depreciation))
);
/**
* Groups Breadcrumbs
*/
Breadcrumbs::for('groups.index', fn (Trail $trail) =>
$trail->parent('settings.index', route('settings.index'))
->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('groups.create'))
);
Breadcrumbs::for('groups.show', fn (Trail $trail, Group $group) =>
$trail->parent('groups.index', route('groups.index'))
->push($group->name, route('groups.show', $group))
);
Breadcrumbs::for('groups.edit', fn (Trail $trail, Group $group) =>
$trail->parent('groups.index', route('groups.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $group->name]), route('groups.edit', $group))
);
/**
* 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('licenses.create'))
);
Breadcrumbs::for('licenses.show', fn (Trail $trail, License $license) =>
$trail->parent('licenses.index', route('licenses.index'))
->push($license->name, route('licenses.show', $license))
);
Breadcrumbs::for('licenses.edit', fn (Trail $trail, License $license) =>
$trail->parent('licenses.index', route('licenses.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $license->name]), route('licenses.edit', $license))
);
/**
* 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('locations.create'))
);
Breadcrumbs::for('locations.show', fn (Trail $trail, Location $location) =>
$trail->parent('locations.index', route('locations.index'))
->push($location->name, route('locations.show', $location))
);
Breadcrumbs::for('locations.edit', fn (Trail $trail, Location $location) =>
$trail->parent('locations.index', route('locations.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $location->name]), route('locations.edit', $location))
);
/**
* Maintenances Breadcrumbs
*/
Breadcrumbs::for('maintenances.index', fn (Trail $trail) =>
$trail->parent('hardware.index', route('hardware.index'))
->push(trans('general.maintenances'), route('maintenances.index'))
);
Breadcrumbs::for('maintenances.create', fn (Trail $trail) =>
$trail->parent('maintenances.index', route('maintenances.index'))
->push(trans('general.create'), route('maintenances.create'))
);
Breadcrumbs::for('maintenances.show', fn (Trail $trail, AssetMaintenance $maintenance) =>
$trail->parent('maintenances.index', route('locations.index'))
->push($maintenance->title, route('maintenances.show', $maintenance))
);
Breadcrumbs::for('manufacturers.edit', fn (Trail $trail, Manufacturer $manufacturer) =>
$trail->parent('manufacturers.index', route('manufacturers.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $manufacturer->name]), route('manufacturers.edit', $manufacturer))
);
/**
* 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('manufacturers.create'))
);
Breadcrumbs::for('manufacturers.show', fn (Trail $trail, Manufacturer $manufacturer) =>
$trail->parent('manufacturers.index', route('manufacturers.index'))
->push($manufacturer->name, route('home'))
);
Breadcrumbs::for('manufacturers.edit', fn (Trail $trail, Manufacturer $manufacturer) =>
$trail->parent('manufacturers.index', route('manufacturers.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $manufacturer->name]), route('manufacturers.edit', $manufacturer))
);
/**
* Predefined Kits Breadcrumbs
*/
Breadcrumbs::for('kits.index', fn (Trail $trail) =>
$trail->parent('home', route('home'))
->push(trans('general.kits'), route('kits.index'))
);
Breadcrumbs::for('kits.create', fn (Trail $trail) =>
$trail->parent('kits.index', route('kits.index'))
->push(trans('general.create'), route('kits.create'))
);
Breadcrumbs::for('kits.show', fn (Trail $trail, PredefinedKit $kit) =>
$trail->parent('kits.index', route('kits.index'))
->push($kit->name, route('kits.show', $kit))
);
Breadcrumbs::for('kits.edit', fn (Trail $trail, PredefinedKit $kit) =>
$trail->parent('kits.index', route('kits.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $kit->name]), route('kits.edit', $kit))
);
/**
* 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('statuslabels.create'))
);
Breadcrumbs::for('statuslabels.show', fn (Trail $trail, Statuslabel $statuslabel) =>
$trail->parent('statuslabels.index', route('statuslabels.index'))
->push($statuslabel->name, route('statuslabels.show', $statuslabel))
);
Breadcrumbs::for('statuslabels.edit', fn (Trail $trail, Statuslabel $statuslabel) =>
$trail->parent('statuslabels.index', route('statuslabels.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $statuslabel->name]), route('statuslabels.edit', $statuslabel))
);
/**
* Settings Breadcrumbs
*/
Breadcrumbs::for('settings.index', fn (Trail $trail) =>
$trail->parent('home', route('home'))
->push(trans('general.admin'), route('settings.index'))
);
/**
* 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('suppliers.create'))
);
Breadcrumbs::for('suppliers.show', fn (Trail $trail, Supplier $supplier) =>
$trail->parent('suppliers.index', route('suppliers.index'))
->push($supplier->name, route('home'))
);
Breadcrumbs::for('suppliers.edit', fn (Trail $trail, Supplier $supplier) =>
$trail->parent('suppliers.index', route('suppliers.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $supplier->name]), route('suppliers.edit', $supplier))
);
/**
* 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('users.create'))
);
Breadcrumbs::for('users.show', fn (Trail $trail, User $user) =>
$trail->parent('users.index', route('users.index'))
->push($user->username, route('users.show', $user))
);
Breadcrumbs::for('users.edit', fn (Trail $trail, User $user) =>
$trail->parent('users.index', route('users.index'))
->push(trans('general.breadcrumb_button_actions.edit_item', ['name' => $user->name]), route('users.edit', $user))
);
}
}

View file

@ -49,10 +49,6 @@ class SamlServiceProvider extends ServiceProvider
'uses' => 'Auth\SamlController@login', ]
);
Route::group(['prefix' => 'admin', 'middleware' => ['web', 'auth', 'authorize:superuser']], function () {
Route::get('saml', ['as' => 'settings.saml.index', 'uses' => 'SettingsController@getSamlSettings']);
Route::post('saml', ['as' => 'settings.saml.save', 'uses' => 'SettingsController@postSamlSettings']);
});
});
}

View file

@ -66,6 +66,7 @@
"rollbar/rollbar-laravel": "^8.0",
"spatie/laravel-backup": "^8.8",
"spatie/laravel-ignition": "^2.0",
"tabuna/breadcrumbs": "^4.2",
"tecnickcom/tc-lib-barcode": "^1.15",
"tecnickcom/tcpdf": "^6.5",
"unicodeveloper/laravel-password": "^1.0",

68
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2a6e7f5e039ee2f40605aefc5c5baf08",
"content-hash": "8966b3d72c2db545cd54772d7f049804",
"packages": [
{
"name": "alek13/slack",
@ -10938,6 +10938,72 @@
],
"time": "2024-11-08T15:28:48+00:00"
},
{
"name": "tabuna/breadcrumbs",
"version": "4.2.1",
"source": {
"type": "git",
"url": "https://github.com/tabuna/breadcrumbs.git",
"reference": "1d9047306f67e7fcc86fc7e608f1432f247636da"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tabuna/breadcrumbs/zipball/1d9047306f67e7fcc86fc7e608f1432f247636da",
"reference": "1d9047306f67e7fcc86fc7e608f1432f247636da",
"shasum": ""
},
"require": {
"ext-json": "*",
"laravel/framework": "^10.0|^11.0",
"laravel/serializable-closure": "^1.0|^2.0",
"php": "^8.1"
},
"require-dev": {
"orchestra/testbench": "^8.0|^9.0",
"phpunit/php-code-coverage": "^10.|^11.0",
"phpunit/phpunit": "^10.5|^11.0"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Breadcrumbs": "Tabuna\\Breadcrumbs\\Breadcrumbs"
},
"providers": [
"Tabuna\\Breadcrumbs\\BreadcrumbsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Tabuna\\Breadcrumbs\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Alexandr Chernyaev",
"email": "bliz48rus@gmail.com"
},
{
"name": "Dwight Watson",
"email": "dwight@studentservices.com.au"
},
{
"name": "Dave James Miller",
"email": "dave@davejamesmiller.com"
}
],
"description": "An easy way to add breadcrumbs to your Laravel app.",
"support": {
"issues": "https://github.com/tabuna/breadcrumbs/issues",
"source": "https://github.com/tabuna/breadcrumbs/tree/4.2.1"
},
"time": "2024-11-26T12:21:27+00:00"
},
{
"name": "tecnickcom/tc-lib-barcode",
"version": "1.18.4",

View file

@ -316,6 +316,7 @@ return [
App\Providers\LivewireServiceProvider::class,
App\Providers\MacroServiceProvider::class,
App\Providers\SamlServiceProvider::class,
App\Providers\BreadcrumbsServiceProvider::class,
],

View file

@ -5,8 +5,8 @@ return [
'about_assets_text' => 'Assets are items tracked by serial number or asset tag. They tend to be higher value items where identifying a specific item matters.',
'archived' => 'Archived',
'asset' => 'Asset',
'bulk_checkout' => 'Checkout Assets',
'bulk_checkin' => 'Checkin Assets',
'bulk_checkout' => 'Bulk Checkout',
'bulk_checkin' => 'Bulk Checkin',
'checkin' => 'Checkin Asset',
'checkout' => 'Checkout Asset',
'clone' => 'Clone Asset',

View file

@ -10,7 +10,7 @@ return [
'action' => 'Action',
'activity_report' => 'Activity Report',
'address' => 'Address',
'admin' => 'Admin',
'admin' => 'Admin Settings',
'admin_tooltip' => 'This user has admin privileges',
'superuser' => 'Superuser',
'superuser_tooltip' => 'This user has superuser privileges',
@ -29,6 +29,7 @@ return [
'assets_available' => 'Assets available',
'accept_assets' => 'Accept Assets :name',
'accept_assets_menu' => 'Accept Assets',
'accept_item' => 'Accept Item',
'audit' => 'Audit',
'audit_report' => 'Audit Log',
'assets' => 'Assets',
@ -337,10 +338,10 @@ return [
'token_expired' => 'Your form session has expired. Please try again.',
'login_enabled' => 'Login Enabled',
'audit_due' => 'Due for Audit',
'audit_due_days' => 'Assets Due for Audit Within :days Day|Assets Due for Audit Within :days Days',
'audit_due_days' => '{}Assets Due or Overdue for Audit|[1]Assets Due or Overdue for Audit Within a Day|[2,*]Assets Due or Overdue for Audit Within :days Days',
'checkin_due' => 'Due for Checkin',
'checkin_overdue' => 'Overdue for Checkin',
'checkin_due_days' => 'Assets Due for Checkin Within :days Day|Assets Due for Checkin Within :days Days',
'checkin_due_days' => '{}Due for Checkin|[1]Assets Due for Checkin Within :days Day|[2,*]Assets Due for Checkin Within :days Days',
'audit_overdue' => 'Overdue for Audit',
'accept' => 'Accept :asset',
'i_accept' => 'I accept',
@ -587,4 +588,12 @@ return [
'notes' => 'Add a note',
],
'breadcrumb_button_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',
];

View file

@ -115,7 +115,7 @@
<div class="col-md-8">
<input class="form-control" type="text" name="gravatar" id="gravatar" value="{{ old('gravatar', $user->gravatar) }}" />
{!! $errors->first('gravatar', '<span class="alert-msg" aria-hidden="true"><i class="fas fa-times" aria-hidden="true"></i> :message</span>') !!}
<p>
<p style="padding-top: 3px;">
<img src="//secure.gravatar.com/avatar/{{ md5(strtolower(trim($user->gravatar))) }}" width="30" height="30" alt="{{ $user->present()->fullName() }} avatar image">
{!! trans('general.gravatar_url') !!}
</p>

View file

@ -9,95 +9,127 @@ use Carbon\Carbon;
@parent
@stop
@section('header_right')
<div class="pull-right">
<a href="{{ route('maintenances.edit', $assetMaintenance) }}" class="btn btn-default pull-right">
{{ trans('general.update') }}</a>
<a href="{{ route('maintenances.index') }}" class="btn btn-primary text-right" style="margin-right: 10px;">{{ trans('general.back') }}</a>
</div>
@stop
{{-- Page content --}}
@section('content')
<div class="row header">
<div class="col-md-12">
<h2 class="title">
{{ trans('admin/asset_maintenances/general.view') }}
{{ " - " . $assetMaintenance->title }}
</h2>
<div class="row">
<div class="col-md-9">
<div class="btn-group pull-right">
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">{{ trans('button.actions') }}
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right" role="menu" aria-labelledby="dropdownMenu1">
<li role="presentation"><a href="{{ route('maintenances.update', $assetMaintenance->id) }}">{{ trans('admin/asset_maintenances/general.edit') }}</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="box box-default">
<div class="box-body">
<div class="row-new-striped">
<div class="row">
<div class="user-profile ">
<div class="row profile">
<div class="col-md-9 bio">
<!-- 1st Row Begin -->
<div class="row">
<div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}: </strong>
{{ $assetMaintenance->asset_maintenance_type }}
</div>
</div>
<!-- 1st Row End -->
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.asset_maintenance_type') }}
</div>
<div class="col-md-9">
{{ $assetMaintenance->asset_maintenance_type }}
</div>
</div> <!-- /row -->
<div class="row">
<div class="col-md-3">
{{ trans('general.asset') }}
</div>
<div class="col-md-9">
<a href="{{ route('hardware.show', $assetMaintenance->asset_id) }}">
{{ $assetMaintenance->asset->present()->fullName }}
</a>
</div>
</div> <!-- /row -->
<div class="row">
<div class="col-md-3">
{{ trans('general.supplier') }}
</div>
<div class="col-md-9">
<a href="{{ route('suppliers.show', $assetMaintenance->supplier_id) }}">
{{ $assetMaintenance->supplier->name }}
</a>
</div>
</div> <!-- /row -->
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.start_date') }}
</div>
<div class="col-md-9">
{{ Helper::getFormattedDateObject($assetMaintenance->start_date, 'date', false) }}
</div>
</div> <!-- /row -->
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.completion_date') }}
</div>
<div class="col-md-9">
@if ($assetMaintenance->completion_date)
{{ Helper::getFormattedDateObject($assetMaintenance->completion_date, 'date', false) }}
@else
{{ trans('admin/asset_maintenances/message.asset_maintenance_incomplete') }}
@endif
</div>
</div> <!-- /row -->
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}
</div>
<div class="col-md-9">
{{ $assetMaintenance->asset_maintenance_time }}
</div>
</div> <!-- /row -->
@if ($assetMaintenance->cost > 0)
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.cost') }}
</div>
<div class="col-md-9">
{{ trans( 'general.currency' ) . Helper::formatCurrencyOutput($assetMaintenance->cost) }}
</div>
</div> <!-- /row -->
@endif
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.is_warranty') }}
</div>
<div class="col-md-9">
{{ $assetMaintenance->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}
</div>
</div> <!-- /row -->
@if ($assetMaintenance->notes)
<div class="row">
<div class="col-md-3">
{{ trans('admin/asset_maintenances/form.notes') }}
</div>
<div class="col-md-9">
{!! nl2br(Helper::parseEscapedMarkedownInline($assetMaintenance->notes)) !!}
</div>
</div> <!-- /row -->
@endif
</div><!-- /row-new-striped -->
</div><!-- /box-body -->
</div><!-- /box -->
</div> <!-- col-md-9 end -->
</div> <!-- row end -->
<!-- 2nd Row Begin -->
<div class="row">
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/table.asset_name') }}: </strong>
<a href="{{ route('hardware.show', $assetMaintenance->asset_id) }}">
{{ $assetMaintenance->asset->name }}
</a>
</div>
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('general.supplier') }}: </strong>
<a href="{{ route('suppliers.show', $assetMaintenance->supplier_id) }}">
{{ $assetMaintenance->supplier->name }}
</a>
</div>
</div>
<!-- 2nd Row End -->
<!-- 3rd Row Begin -->
<div class="row">
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.start_date') }}: </strong>
<?php $startDate = Carbon::parse($assetMaintenance->start_date); ?>
{{ $startDate->toDateString() }}
</div>
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.completion_date') }}: </strong>
{{ $completionDate = $assetMaintenance->completion_date }}
{{ $completionDate ? $completionDate : trans('admin/asset_maintenances/message.asset_maintenance_incomplete') }}
</div>
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.asset_maintenance_time') }}: </strong>
{{ $assetMaintenance->asset_maintenance_time }}
</div>
</div>
<!-- 3rd Row End -->
<!-- 4th Row Begin -->
<div class="row">
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.cost') }}: </strong>
{{ trans( 'general.currency' ) . Helper::formatCurrencyOutput($assetMaintenance->cost) }}
</div>
<div class="col-md-3 col-sm-3" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.is_warranty') }}: </strong>
{{ $assetMaintenance->is_warranty ? trans('admin/asset_maintenances/message.warranty') : trans('admin/asset_maintenances/message.not_warranty') }}
</div>
</div>
<!-- 4th Row End -->
<!-- 5th Row Begin -->
<div class="row">
<div class="col-md-12 col-sm-12" style="padding-bottom: 10px; margin-left: 15px; word-wrap: break-word;">
<strong>{{ trans('admin/asset_maintenances/form.notes') }}: </strong>
{!! nl2br(Helper::parseEscapedMarkedownInline($assetMaintenance->notes)) !!}
</div>
</div>
<!-- 5th Row End -->
</div> <!-- col-md-9 bio end -->
</div> <!-- row profile end -->
</div> <!-- user-profile end -->
@stop

View file

@ -21,7 +21,7 @@
<div class="col-md-8 col-md-offset-2">
<div class="box box-default">
<form method="POST" action="{{ route('asset.audit.store', $asset->id) }}" accept-charset="UTF-8" class="form-horizontal" enctype="multipart/form-data">
<form method="POST" action="{{ route('asset.audit.store', $asset) }}" accept-charset="UTF-8" class="form-horizontal" enctype="multipart/form-data">
<div class="box-header with-border">
<h2 class="box-title"> {{ trans('admin/hardware/form.tag') }} {{ $asset->asset_tag }}</h2>
@ -54,6 +54,8 @@
<!-- Asset Name -->
@if ($asset->name)
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label for="name" class="col-sm-3 control-label">
{{ trans('general.name') }}
@ -62,6 +64,7 @@
<p class="form-control-static">{{ $asset->name }}</p>
</div>
</div>
@endif
<!-- Locations -->
@include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'location_id'])

View file

@ -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']),

View file

@ -181,7 +181,7 @@
@if ($asset->deleted_at=='')
@can('update', $asset)
<div class="col-md-12 hidden-print" style="padding-top: 5px;">
<a href="{{ route('hardware.edit', $asset->id) }}" class="btn btn-sm btn-warning btn-social btn-block hidden-print">
<a href="{{ route('hardware.edit', $asset) }}" class="btn btn-sm btn-warning btn-social btn-block hidden-print">
<x-icon type="edit" />
{{ trans('admin/hardware/general.edit') }}
</a>

View file

@ -1,12 +1,13 @@
@extends('layouts/edit-form', [
'createText' => trans('admin/kits/general.append_model'),
'updateText' => trans('admin/kits/general.update_appended_model'),
'formAction' => (isset($item->id)) ? route('kits.models.update', ['kit_id' => $kit->id, 'model_id' => $item->model_id]) : route('kits.models.store', ['kit_id' => $kit->id]),
'formAction' => (isset($item->id)) ? route('kits.models.update', ['kit' => $kit->id, 'model_id' => $item->model_id]) : route('kits.models.store', ['kit_id' => $kit->id]),
])
{{-- Page content --}}
@section('inputFields')
@include ('partials.forms.edit.model-select', ['translated_name' => trans('admin/hardware/form.model'), 'fieldname' => 'model_id', 'required' => 'true'])
<div class="form-group {{ $errors->has('quantity') ? ' has-error' : '' }}">
<label for="quantity" class="col-md-3 control-label">{{ trans('general.quantity') }}</label>
<div class="col-md-7 required">

View file

@ -214,7 +214,7 @@ dir="{{ Helper::determineLanguageDirection() }}">
</a>
<ul class="dropdown-menu">
@can('create', \App\Models\Asset::class)
<li {!! (Request::is('hardware/create') ? 'class="active>"' : '') !!}>
<li{!! (Request::is('hardware/create') ? ' class="active">' : '') !!}>
<a href="{{ route('hardware.create') }}" tabindex="-1">
<x-icon type="assets" />
{{ trans('general.asset') }}
@ -222,7 +222,7 @@ dir="{{ Helper::determineLanguageDirection() }}">
</li>
@endcan
@can('create', \App\Models\License::class)
<li {!! (Request::is('licenses/create') ? 'class="active"' : '') !!}>
<li{!! (Request::is('licenses/create') ? ' class="active"' : '') !!}>
<a href="{{ route('licenses.create') }}" tabindex="-1">
<x-icon type="licenses" />
{{ trans('general.license') }}
@ -813,7 +813,6 @@ dir="{{ Helper::determineLanguageDirection() }}">
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper" role="main" id="setting-list">
<barepay></barepay>
@if ($debug_in_production)
<div class="row" style="margin-bottom: 0px; background-color: red; color: white; font-size: 15px;">
@ -827,21 +826,68 @@ dir="{{ Helper::determineLanguageDirection() }}">
@endif
<!-- Content Header (Page header) -->
<section class="content-header" style="padding-bottom: 30px;">
<h1 class="pull-left pagetitle">@yield('title') </h1>
<section class="content-header">
@if (isset($helpText))
@include ('partials.more-info',
[
'helpText' => $helpText,
'helpPosition' => (isset($helpPosition)) ? $helpPosition : 'left'
])
@endif
<div class="pull-right">
@yield('header_right')
<div class="row">
<div class="col-md-12">
<style>
.breadcrumb-item {
display: inline;
list-style: none;
}
</style>
<h1 class="pull-left pagetitle" style="font-size: 22px; margin-top: 10px;">
@if (Breadcrumbs::has() && (Breadcrumbs::current()->count() > 1))
<ul style="padding-left: 0;">
@foreach (Breadcrumbs::current() as $crumbs)
@if ($crumbs->url() && !$loop->last)
<li class="breadcrumb-item">
<a href="{{ $crumbs->url() }}">
@if ($loop->first)
{!! Blade::render($crumbs->title()) !!}
@else
{{ Blade::render($crumbs->title()) }}
@endif
</a>
<x-icon type="angle-right" />
</li>
@elseif (is_null($crumbs->url()) && !$loop->last)
<li class="breadcrumb-item active">
{{ $crumbs->title() }}
<x-icon type="angle-right" />
</li>
@else
<li class="breadcrumb-item active">
{{ $crumbs->title() }}
</li>
@endif
@endforeach
</ul>
@else
@yield('title')
@endif
</h1>
@if (isset($helpText))
@include ('partials.more-info',
[
'helpText' => $helpText,
'helpPosition' => (isset($helpPosition)) ? $helpPosition : 'left'
])
@endif
<div class="pull-right">
@yield('header_right')
</div>
</div>
</div>
</section>

View file

@ -290,9 +290,6 @@
var dest = 'admin/groups';
}
if (dest =='maintenances') {
var dest = 'hardware/maintenances';
}
if(element_name != '') {
dest = dest + '/' + row.owner_id + '/' + element_name;

View file

@ -1,4 +1,4 @@
<a style="padding-left: 10px; font-size: 18px;" class="text-dark-gray hidden-print" data-trigger="focus" tabindex="0" role="button" data-toggle="popover" title="{{ trans('general.more_info') }}" data-placement="right" data-html="true" data-content="{{ (isset($helpText)) ? $helpText : 'Help Info Missing' }}">
<x-icon type="more-info" />
<a style="padding-left: 5px; font-size: 15px;" class="text-dark-gray hidden-print" data-trigger="focus" tabindex="0" role="button" data-toggle="popover" title="{{ trans('general.more_info') }}" data-placement="right" data-html="true" data-content="{{ (isset($helpText)) ? $helpText : 'Help Info Missing' }}">
<x-icon type="more-info" style="padding-top: 14px;" />
<span class="sr-only">{{ trans('general.moreinfo') }}</span>
</a>

View file

@ -33,7 +33,7 @@
@section('content')
<div class="row">
<div class="col-md-8 col-md-offset-1">
<div class="col-md-9">
<form
method="POST"
@ -48,13 +48,15 @@
<div class="box box-default">
<div class="box-header with-border">
@if (request()->routeIs('reports/custom') || request()->routeIs('report-templates.show'))
<h2 class="box-title">
<h2 class="box-title" style="padding-top: 7px;">
{{ trans('general.customize_report') }}
</h2>
@endif
@if (request()->routeIs('report-templates.edit'))
<div class="row">
<div class="col-md-7 col-md-offset-5">
<div class="col-md-7 col-md-offset-4">
<div class="{{ $errors->has('name') ? ' has-error' : '' }}">
<label
for="name"
@ -78,29 +80,7 @@
</div>
</div>
@endif
@if (request()->routeIs('report-templates.show'))
<div class="box-tools pull-right">
<a
href="{{ route('report-templates.edit', $template) }}"
class="btn btn-sm btn-warning"
data-tooltip="true"
title="{{ trans('admin/reports/general.update_template') }}"
>
<i class="fas fa-pencil-alt" aria-hidden="true"></i>
<span class="sr-only">{{ trans('general.update') }}</span>
</a>
<button
class="btn btn-sm btn-danger delete-asset"
data-toggle="modal"
data-title="{{ trans('general.delete') }}"
data-content="{{ trans('general.delete_confirm', ['item' => $template->name]) }}"
data-target="#dataConfirmModal"
type="button"
>
<i class="fas fa-trash" aria-hidden="true"></i><span class="sr-only">{{ trans('general.delete') }}</span>
</button>
</div>
@endif
</div><!-- /.box-header -->
<div class="box-body">
@ -636,7 +616,7 @@
</div>
<!-- Saved Reports right column -->
<div class="col-md-2">
<div class="col-md-3">
@if (! request()->routeIs('report-templates.edit'))
<div class="form-group">
<label for="saved_report_select">{{ trans('admin/reports/general.open_saved_template') }}</label>
@ -653,6 +633,41 @@
@endforeach
</select>
</div>
<div class="row">
<div class="col-md-12">
@if (request()->routeIs('report-templates.show'))
<a
href="{{ route('report-templates.edit', $template) }}"
class="btn btn-sm btn-warning btn-social btn-block"
data-tooltip="true"
title="{{ trans('admin/reports/general.update_template') }}"
style="margin-bottom: 5px;"
>
<x-icon type="edit" />
{{ trans('general.update') }}
</a>
<span data-tooltip="true" title="{{ trans('general.delete') }}">
<a href="#"
class="btn btn-sm btn-danger btn-social btn-block"
data-toggle="modal"
data-title="{{ trans('general.delete') }}"
data-content="{{ trans('general.delete_confirm', ['item' => $template->name]) }}"
data-target="#dataConfirmModal"
type="button"
>
<x-icon type="delete" />
{{ trans('general.delete') }}
</a>
</span>
@endif
</div>
</div>
@endif
@if (request()->routeIs('reports/custom'))
<hr>

View file

@ -863,7 +863,7 @@
</td>
<td class="hidden-print col-md-2">
@can('update', $license)
<a href="{{ route('licenses.checkin', array('licenseSeatId'=> $license->pivot->id, 'backto'=>'user')) }}" class="btn btn-primary btn-sm hidden-print">{{ trans('general.checkin') }}</a>
<a href="{{ route('licenses.checkin', $license->pivot->id, ['backto'=>'user']) }}" class="btn btn-primary btn-sm hidden-print">{{ trans('general.checkin') }}</a>
@endcan
</td>
</tr>

View file

@ -2,6 +2,9 @@
use App\Http\Controllers\Account;
use App\Http\Controllers\ActionlogController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\ResetPasswordController;
use App\Http\Controllers\CategoriesController;
use App\Http\Controllers\CompaniesController;
use App\Http\Controllers\DashboardController;
@ -9,24 +12,21 @@ use App\Http\Controllers\DepartmentsController;
use App\Http\Controllers\DepreciationsController;
use App\Http\Controllers\GroupsController;
use App\Http\Controllers\HealthController;
use App\Http\Controllers\ImportsController;
use App\Http\Controllers\LabelsController;
use App\Http\Controllers\LocationsController;
use App\Http\Controllers\ManufacturersController;
use App\Http\Controllers\ModalController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ReportsController;
use App\Http\Controllers\ReportTemplatesController;
use App\Http\Controllers\ReportsController;
use App\Http\Controllers\SettingsController;
use App\Http\Controllers\StatuslabelsController;
use App\Http\Controllers\SuppliersController;
use App\Http\Controllers\ViewAssetsController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\ResetPasswordController;
use App\Livewire\Importer;
use App\Models\ReportTemplate;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
use Tabuna\Breadcrumbs\Trail;
Route::group(['middleware' => 'auth'], function () {
/*
@ -101,37 +101,27 @@ 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
*/
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
*/
Route::resource('departments', DepartmentsController::class, [
'parameters' => ['department' => 'department_id'],
]);
Route::resource('departments', DepartmentsController::class);
});
/*
@ -178,46 +168,137 @@ Route::group(['middleware' => 'auth'], function () {
*/
Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser']], function () {
Route::get('settings', [SettingsController::class, 'getSettings'])->name('settings.general.index');
Route::post('settings', [SettingsController::class, 'postSettings'])->name('settings.general.save');
Route::get('branding', [SettingsController::class, 'getBranding'])->name('settings.branding.index');
Route::post('branding', [SettingsController::class, 'postBranding'])->name('settings.branding.save');
Route::get('settings', [SettingsController::class, 'getSettings'])
->name('settings.general.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.general_title'), route('settings.general.index')));
Route::get('security', [SettingsController::class, 'getSecurity'])->name('settings.security.index');
Route::post('security', [SettingsController::class, 'postSecurity'])->name('settings.security.save');
Route::post('settings', [SettingsController::class, 'postSettings'])
->name('settings.general.save');
Route::get('groups', [GroupsController::class, 'index'])->name('settings.groups.index');
Route::get('branding', [SettingsController::class, 'getBranding'])
->name('settings.branding.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.branding_title'), route('settings.branding.index')));
Route::get('localization', [SettingsController::class, 'getLocalization'])->name('settings.localization.index');
Route::post('localization', [SettingsController::class, 'postLocalization'])->name('settings.localization.save');
Route::post('branding', [SettingsController::class, 'postBranding'])
->name('settings.branding.save');
Route::get('notifications', [SettingsController::class, 'getAlerts'])->name('settings.alerts.index');
Route::post('notifications', [SettingsController::class, 'postAlerts'])->name('settings.alerts.save');
Route::get('security', [SettingsController::class, 'getSecurity'])
->name('settings.security.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.security_title'), route('settings.security.index')));
Route::get('slack', [SettingsController::class, 'getSlack'])->name('settings.slack.index');
Route::post('slack', [SettingsController::class, 'postSlack'])->name('settings.slack.save');
Route::post('security', [SettingsController::class, 'postSecurity'])
->name('settings.security.save');
Route::get('asset_tags', [SettingsController::class, 'getAssetTags'])->name('settings.asset_tags.index');
Route::post('asset_tags', [SettingsController::class, 'postAssetTags'])->name('settings.asset_tags.save');
Route::get('localization', [SettingsController::class, 'getLocalization'])
->name('settings.localization.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.localization_title'), route('settings.localization.index')));
Route::get('labels', [SettingsController::class, 'getLabels'])->name('settings.labels.index');
Route::post('labels', [SettingsController::class, 'postLabels'])->name('settings.labels.save');
Route::post('localization', [SettingsController::class, 'postLocalization'])
->name('settings.localization.save');
Route::get('ldap', [SettingsController::class, 'getLdapSettings'])->name('settings.ldap.index');
Route::post('ldap', [SettingsController::class, 'postLdapSettings'])->name('settings.ldap.save');
Route::get('notifications', [SettingsController::class, 'getAlerts'])
->name('settings.alerts.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.alert_title'), route('settings.alerts.index')));
Route::get('phpinfo', [SettingsController::class, 'getPhpInfo'])->name('settings.phpinfo.index');
Route::post('notifications', [SettingsController::class, 'postAlerts'])
->name('settings.alerts.save');
Route::get('oauth', [SettingsController::class, 'api'])->name('settings.oauth.index');
Route::get('slack', [SettingsController::class, 'getSlack'])
->name('settings.slack.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.webhook_title'), route('settings.slack.index')));
Route::post('slack', [SettingsController::class, 'postSlack'])
->name('settings.slack.save');
Route::get('asset_tags', [SettingsController::class, 'getAssetTags'])
->name('settings.asset_tags.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.asset_tag_title'), route('settings.asset_tags.index')));
Route::post('asset_tags', [SettingsController::class, 'postAssetTags'])
->name('settings.asset_tags.save');
Route::get('labels', [SettingsController::class, 'getLabels'])
->name('settings.labels.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.labels_title'), route('settings.labels.index')));
Route::post('labels', [SettingsController::class, 'postLabels'])
->name('settings.labels.save');
Route::get('ldap', [SettingsController::class, 'getLdapSettings'])
->name('settings.ldap.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.ldap_ad'), route('settings.ldap.index')));
Route::post('ldap', [SettingsController::class, 'postLdapSettings'])
->name('settings.ldap.save');
Route::get('phpinfo', [SettingsController::class, 'getPhpInfo'])
->name('settings.phpinfo.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.php_info'), route('settings.phpinfo.index')));
Route::get('oauth', [SettingsController::class, 'api'])
->name('settings.oauth.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.oauth'), route('settings.oauth.index')));
Route::get('google', [SettingsController::class, 'getGoogleLoginSettings'])
->name('settings.google.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.google_login'), route('settings.google.index')));
Route::post('google', [SettingsController::class, 'postGoogleLoginSettings'])
->name('settings.google.save');
Route::get('purge', [SettingsController::class, 'getPurge'])
->name('settings.purge.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.purge'), route('settings.purge.index')));
Route::post('purge', [SettingsController::class, 'postPurge'])
->name('settings.purge.save');
Route::get('login-attempts', [SettingsController::class, 'getLoginAttempts'])
->name('settings.logins.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.login'), route('settings.logins.index')));
// SAML
Route::get('/saml', [SettingsController::class, 'getSamlSettings'])
->name('settings.saml.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.saml_title'), route('settings.saml.index')));
Route::post('/saml', [SettingsController::class, 'postSamlSettings'])
->name('settings.saml.save');
Route::get('google', [SettingsController::class, 'getGoogleLoginSettings'])->name('settings.google.index');
Route::post('google', [SettingsController::class, 'postGoogleLoginSettings'])->name('settings.google.save');
Route::get('purge', [SettingsController::class, 'getPurge'])->name('settings.purge.index');
Route::post('purge', [SettingsController::class, 'postPurge'])->name('settings.purge.save');
Route::get('login-attempts', [SettingsController::class, 'getLoginAttempts'])->name('settings.logins.index');
// Backups
Route::group(['prefix' => 'backups', 'middleware' => 'auth'], function () {
@ -244,15 +325,25 @@ Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser
return redirect(route('settings.backups.index'));
});
Route::get('/', [SettingsController::class, 'getBackups'])->name('settings.backups.index');
Route::get('/', [SettingsController::class, 'getBackups'])
->name('settings.backups.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.backups'), route('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');
/**
* This breadcrumb is repeated for groups in the BreadcrumbServiceProvider, since groups uses resource routes
* and that servcie provider cannot see the breadcrumbs defined below
*/
Route::get('/', [SettingsController::class, 'index'])
->name('settings.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.admin'), route('settings.index')));
});
/*
@ -264,9 +355,12 @@ Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser
|
*/
Route::get('/import',
Importer::class
)->middleware('auth')->name('imports.index');
Route::get('/import', Importer::class)
->middleware('auth')
->name('imports.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.import'), route('imports.index')));
/*
|--------------------------------------------------------------------------
@ -279,26 +373,54 @@ Route::get('/import',
Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () {
// Profile
Route::get('profile', [ProfileController::class, 'getIndex'])->name('profile');
Route::post('profile', [ProfileController::class, 'postIndex'])->name('profile.update');
Route::get('profile', [ProfileController::class, 'getIndex'])
->name('profile')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.editprofile'), route('profile')));
Route::get('menu', [ProfileController::class, 'getMenuState'])->name('account.menuprefs');
Route::post('profile', [ProfileController::class, 'postIndex'])
->name('profile.update');
Route::get('password', [ProfileController::class, 'password'])->name('account.password.index');
Route::post('password', [ProfileController::class, 'passwordSave'])->name('account.password.update');
Route::get('menu', [ProfileController::class, 'getMenuState'])
->name('account.menuprefs');
Route::get('api', [ProfileController::class, 'api'])->name('user.api');
Route::get('password', [ProfileController::class, 'password'])
->name('account.password.index')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.changepassword'), route('account.password.index')));
Route::post('password', [ProfileController::class, 'passwordSave'])
->name('account.password.update');
Route::get('api', [ProfileController::class, 'api'])
->name('user.api')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.manage_api_keys'), route('user.api')));
// View Assets
Route::get('view-assets', [ViewAssetsController::class, 'getIndex'])->name('view-assets');
Route::get('view-assets', [ViewAssetsController::class, 'getIndex'])
->name('view-assets')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.viewassets'), route('view-assets')));
Route::get('requested', [ViewAssetsController::class, 'getRequestedAssets'])->name('account.requested');
Route::get('requested', [ViewAssetsController::class, 'getRequestedAssets'])
->name('account.requested')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.requested_assets_menu'), route('account.requested')));
// Profile
Route::get(
'requestable-assets',
[ViewAssetsController::class, 'getRequestableIndex']
)->name('requestable-assets');
'requestable-assets', [ViewAssetsController::class, 'getRequestableIndex'])
->name('requestable-assets')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.requestable_items'), route('requestable-assets')));
Route::post(
'request-asset/{assetId}',
[ViewAssetsController::class, 'getRequestAsset']
@ -310,13 +432,20 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () {
)->name('account/request-item');
// Account Dashboard
Route::get('/', [ViewAssetsController::class, 'getIndex'])->name('account');
Route::get('/', [ViewAssetsController::class, 'getIndex'])
->name('account');
Route::get('accept', [Account\AcceptanceController::class, 'index'])
->name('account.accept');
->name('account.accept')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.accept_assets_menu'), route('account.accept')));
Route::get('accept/{id}', [Account\AcceptanceController::class, 'create'])
->name('account.accept.item');
->name('account.accept.item')
->breadcrumbs(fn (Trail $trail, $id) =>
$trail->parent('account.accept')
->push(trans('general.accept_item'), route('account.accept.item', $id)));
Route::post('accept/{id}', [Account\AcceptanceController::class, 'store'])
->name('account.store-acceptance');
@ -339,77 +468,129 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () {
});
Route::group(['middleware' => ['auth']], function () {
Route::get('reports/audit',
[ReportsController::class, 'audit']
)->name('reports.audit');
Route::group(['prefix' => 'reports', 'middleware' => ['auth']], function () {
Route::get('audit', [ReportsController::class, 'audit'])
->name('reports.audit')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.audit_report'), route('reports.audit')));
Route::get(
'reports/depreciation',
[ReportsController::class, 'getDeprecationReport']
)->name('reports/depreciation');
Route::get(
'reports/export/depreciation',
[ReportsController::class, 'exportDeprecationReport']
)->name('reports/export/depreciation');
Route::get(
'reports/asset_maintenances',
[ReportsController::class, 'getAssetMaintenancesReport']
)->name('reports/asset_maintenances');
Route::get(
'reports/export/asset_maintenances',
[ReportsController::class, 'exportAssetMaintenancesReport']
)->name('reports/export/asset_maintenances');
Route::get(
'reports/licenses',
[ReportsController::class, 'getLicenseReport']
)->name('reports/licenses');
Route::get(
'reports/export/licenses',
[ReportsController::class, 'exportLicenseReport']
)->name('reports/export/licenses');
'depreciation', [ReportsController::class, 'getDeprecationReport'])
->name('reports/depreciation')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.depreciation_report'), route('reports/depreciation')));
Route::get('reports/accessories', [ReportsController::class, 'getAccessoryReport'])->name('reports/accessories');
Route::get(
'reports/export/accessories',
[ReportsController::class, 'exportAccessoryReport']
)->name('reports/export/accessories');
Route::get('reports/custom', [ReportsController::class, 'getCustomReport'])->name('reports/custom');
Route::post('reports/custom', [ReportsController::class, 'postCustom']);
Route::prefix('reports/templates')->name('report-templates')->group(function () {
Route::post('/', [ReportTemplatesController::class, 'store'])->name('.store');
Route::get('/{reportTemplate}', [ReportTemplatesController::class, 'show'])->name('.show');
Route::get('/{reportTemplate}/edit', [ReportTemplatesController::class, 'edit'])->name('.edit');
Route::post('/{reportTemplate}', [ReportTemplatesController::class, 'update'])->name('.update');
Route::delete('/{reportTemplate}', [ReportTemplatesController::class, 'destroy'])->name('.destroy');
// Is this still used??
Route::get(
'export/depreciation', [ReportsController::class, 'exportDeprecationReport'])
->name('reports/export/depreciation')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.depreciation_report'), route('reports.audit')));
Route::get(
'asset_maintenances', [ReportsController::class, 'getAssetMaintenancesReport'])
->name('reports/asset_maintenances')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.asset_maintenance_report'), route('reports/asset_maintenances')));
// Is this still used?
Route::get('export/asset_maintenances', [ReportsController::class, 'exportAssetMaintenancesReport'])
->name('reports/export/asset_maintenances')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.asset_maintenance_report'), route('reports/export/asset_maintenances')));
Route::get('licenses', [ReportsController::class, 'getLicenseReport'])
->name('reports/licenses')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.license_report'), route('reports/licenses')));
Route::get('export/licenses', [ReportsController::class, 'exportLicenseReport'])
->name('reports/export/licenses');
Route::get('accessories', [ReportsController::class, 'getAccessoryReport'])
->name('reports/accessories');
Route::get('export/accessories', [ReportsController::class, 'exportAccessoryReport'])
->name('reports/export/accessories');
Route::get('custom', [ReportsController::class, 'getCustomReport'])
->name('reports/custom')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.custom_report'), route('reports/custom')));
Route::post('custom', [ReportsController::class, 'postCustom']);
Route::prefix('templates')
->group(function () {
Route::post('/', [ReportTemplatesController::class, 'store'])
->name('report-templates.store');
// The breadcrumb on this is a little odd for now since we don't have a template index
Route::get('/{reportTemplate}', [ReportTemplatesController::class, 'show'])
->name('report-templates.show')
->breadcrumbs(fn (Trail $trail, ReportTemplate $reportTemplate) =>
$trail->parent('reports/custom')
->push($reportTemplate->name, null)
->push(trans('general.customize_report'), ''));
Route::get('/{reportTemplate}/edit', [ReportTemplatesController::class, 'edit'])
->name('report-templates.edit')
->breadcrumbs(fn (Trail $trail, ReportTemplate $reportTemplate) =>
$trail->parent('reports/custom')
->push($reportTemplate->name, route('report-templates.show', $reportTemplate))
->push(trans('general.customize_report'), ''));
Route::post('/{reportTemplate}', [ReportTemplatesController::class, 'update'])
->name('report-templates.update');
Route::delete('/{reportTemplate}', [ReportTemplatesController::class, 'destroy'])
->name('report-templates.destroy');
});
Route::get(
'reports/activity',
[ReportsController::class, 'getActivityReport']
)->name('reports.activity');
Route::post('reports/activity', [ReportsController::class, 'postActivityReport'])->name('reports.activity.post');
Route::get(
'reports/unaccepted_assets/{deleted?}',
[ReportsController::class, 'getAssetAcceptanceReport']
)->name('reports/unaccepted_assets');
'activity', [ReportsController::class, 'getActivityReport'])
->name('reports.activity')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.activity_report'), route('reports.activity')));
Route::post('activity', [ReportsController::class, 'postActivityReport'])
->name('reports.activity.post');
Route::get('unaccepted_assets/{deleted?}', [ReportsController::class, 'getAssetAcceptanceReport'])
->name('reports/unaccepted_assets')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('home')
->push(trans('general.unaccepted_asset_report'), route('reports/unaccepted_assets')));
Route::post('unaccepted_assets/sent_reminder', [ReportsController::class, 'sentAssetAcceptanceReminder'])
->name('reports/unaccepted_assets_sent_reminder');
Route::delete('unaccepted_assets/{acceptanceId}/delete', [ReportsController::class, 'deleteAssetAcceptance'])
->name('reports/unaccepted_assets_delete');
Route::post(
'reports/unaccepted_assets/sent_reminder',
[ReportsController::class, 'sentAssetAcceptanceReminder']
)->name('reports/unaccepted_assets_sent_reminder');
Route::delete(
'reports/unaccepted_assets/{acceptanceId}/delete',
[ReportsController::class, 'deleteAssetAcceptance']
)->name('reports/unaccepted_assets_delete');
Route::post(
'reports/unaccepted_assets/{deleted?}',
[ReportsController::class, 'postAssetAcceptanceReport']
)->name('reports/export/unaccepted_assets');
'unaccepted_assets/{deleted?}', [ReportsController::class, 'postAssetAcceptanceReport'])
->name('reports/export/unaccepted_assets');
});
Route::get(
'auth/signin',
[LoginController::class, 'legacyAuthRedirect']
@ -521,14 +702,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 +727,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'))
);

View file

@ -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']
]);

View file

@ -33,14 +33,17 @@ Route::group([ 'prefix' => 'fields','middleware' => ['auth'] ], function () {
)->name('fieldsets.associate');
Route::resource('fieldsets', CustomFieldsetsController::class, [
'parameters' => ['fieldset' => 'field_id', 'field' => 'field_id']
'parameters' => [
'fieldset' => 'fieldset',
'field' => 'field_id'
]
]);
});
Route::resource('fields', CustomFieldsController::class, [
'middleware' => ['auth'],
'parameters' => ['field' => 'field_id', 'fieldset' => 'fieldset_id'],
]);
Route::resource('fields', CustomFieldsController::class,
['middleware' => ['auth'],
'except' => ['show']
]);

View file

@ -6,7 +6,10 @@ 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 App\Models\Setting;
use Tabuna\Breadcrumbs\Trail;
use Illuminate\Support\Facades\Route;
use App\Models\Asset;
/*
|--------------------------------------------------------------------------
@ -24,47 +27,59 @@ Route::group(
function () {
Route::get('bulkaudit',
[AssetsController::class, 'quickScan']
)->name('assets.bulkaudit');
Route::get('bulkaudit', [AssetsController::class, 'quickScan'])
->name('assets.bulkaudit')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans('general.bulkaudit'), route('asset.import-history'))
);
Route::get('quickscancheckin',
[AssetsController::class, 'quickScanCheckin']
)->name('hardware/quickscancheckin');
Route::get('quickscancheckin', [AssetsController::class, 'quickScanCheckin'])
->name('hardware/quickscancheckin')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push('Quickscan Checkin', route('hardware/quickscancheckin'))
);
// Asset Maintenances
Route::resource('maintenances',
AssetMaintenancesController::class, [
'parameters' => ['maintenance' => 'maintenance_id', 'asset' => 'asset_id'],
]);
Route::get('requested', [AssetsController::class, 'getRequestedIndex'])
->name('assets.requested')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans('admin/hardware/general.requested'), route('assets.requested'))
);
Route::get('requested', [
AssetsController::class, 'getRequestedIndex']
)->name('assets.requested');
Route::get('scan',
[AssetsController::class, 'scan']
)->name('asset.scan');
Route::get('audit/due',
[AssetsController::class, 'dueForAudit']
)->name('assets.audit.due');
Route::get('audit/due', [AssetsController::class, 'dueForAudit'])
->name('assets.audit.due')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans_choice('general.audit_due_days', Setting::getSettings()->audit_warning_days, ['days' => Setting::getSettings()->audit_warning_days]), route('assets.audit.due'))
);
Route::get('checkins/due',
[AssetsController::class, 'dueForCheckin']
)->name('assets.checkins.due');
)->name('assets.checkins.due')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans_choice('general.checkin_due_days', Setting::getSettings()->due_checkin_days, ['days' => Setting::getSettings()->due_checkin_days]), route('assets.audit.due'))
);
Route::get('audit/{id}',
[AssetsController::class, 'audit']
)->name('asset.audit.create');
Route::get('audit/{asset}', [AssetsController::class, 'audit'])
->name('asset.audit.create')
->breadcrumbs(fn (Trail $trail, Asset $asset) =>
$trail->parent('hardware.show', $asset)
->push(trans('general.audit'))
);
Route::post('audit/{id}',
Route::post('audit/{asset}',
[AssetsController::class, 'auditStore']
)->name('asset.audit.store');
Route::get('history',
[AssetsController::class, 'getImportHistory']
)->name('asset.import-history');
Route::get('history', [AssetsController::class, 'getImportHistory'])
->name('asset.import-history')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans('general.import-history'), route('asset.import-history'))
);
Route::post('history',
[AssetsController::class, 'postImportHistory']
@ -85,11 +100,12 @@ Route::group(
Route::get('{assetId}/label',
[AssetsController::class, 'getLabel']
)->name('label/hardware');
Route::get('{assetId}/checkout',
[AssetCheckoutController::class, 'create']
)->name('hardware.checkout.create');
Route::get('{asset}/checkout', [AssetCheckoutController::class, 'create'])->name('hardware.checkout.create')
->breadcrumbs(fn (Trail $trail, Asset $asset) =>
$trail->parent('hardware.show', $asset)
->push(trans('admin/hardware/general.bulk_checkout'), route('hardware.index'))
);
Route::post('{assetId}/checkout',
[AssetCheckoutController::class, 'store']
@ -108,7 +124,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');
@ -153,9 +169,12 @@ Route::group(
)->name('hardware/bulksave');
// Bulk checkout / checkin
Route::get('bulkcheckout',
[BulkAssetsController::class, 'showCheckout']
)->name('hardware.bulkcheckout.show');
Route::get('bulkcheckout', [BulkAssetsController::class, 'showCheckout'])
->name('hardware.bulkcheckout.show')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('hardware.index')
->push(trans('admin/hardware/general.bulk_checkout'), route('hardware.index'))
);
Route::post('bulkcheckout',
[BulkAssetsController::class, 'storeCheckout']
@ -163,16 +182,17 @@ Route::group(
});
Route::resource('hardware',
AssetsController::class,
[
'middleware' => ['auth'],
'parameters' => ['asset' => 'asset_id',
'names' => [
'show' => 'view',
],
],
]);
Route::resource('hardware',
AssetsController::class,
['middleware' => ['auth']
])->parameters(['hardware' => 'asset']);
// Asset Maintenances
Route::resource('maintenances',
AssetMaintenancesController::class, [
'parameters' => ['maintenance' => 'maintenance', 'asset' => 'asset_id'],
]);
Route::get('ht/{any?}',
[AssetsController::class, 'getAssetByTag']

View file

@ -1,21 +1,17 @@
<?php
use App\Http\Controllers\Kits;
use App\Models\PredefinedKit;
use Illuminate\Support\Facades\Route;
use Tabuna\Breadcrumbs\Trail;
// Predefined Kit Management
Route::resource('kits', Kits\PredefinedKitsController::class, [
'middleware' => ['auth'],
'parameters' => ['kit' => 'kit_id'],
]);
Route::group(['prefix' => 'kits/{kit_id}', 'middleware' => ['auth']], function () {
Route::group(['prefix' => 'kits/{kit}', 'middleware' => ['auth']], function () {
// Route::get('licenses',
// [Kits\PredefinedKitsController::class, 'indexLicenses']
// )->name('kits.licenses.index');
Route::post('licenses',
Route::put('licenses',
[Kits\PredefinedKitsController::class, 'storeLicense']
)->name('kits.licenses.store');
@ -23,9 +19,11 @@ Route::group(['prefix' => 'kits/{kit_id}', 'middleware' => ['auth']], function (
[Kits\PredefinedKitsController::class, 'updateLicense']
)->name('kits.licenses.update');
Route::get('licenses/{license_id}/edit',
[Kits\PredefinedKitsController::class, 'editLicense']
)->name('kits.licenses.edit');
Route::get('licenses/{license_id}/edit', [Kits\PredefinedKitsController::class, 'editLicense'])
->name('kits.licenses.edit')
->breadcrumbs(fn (Trail $trail) =>
$trail->parent('settings.index')
->push(trans('admin/settings/general.backups'), route('kits.licenses.edit')));
Route::delete('licenses/{license_id}',
[Kits\PredefinedKitsController::class, 'detachLicense']
@ -35,7 +33,7 @@ Route::group(['prefix' => 'kits/{kit_id}', 'middleware' => ['auth']], function (
Route::put('models/{model_id}',
[Kits\PredefinedKitsController::class, 'updateModel']
)/* ->parameters([2 => 'kit_id', 1 => 'model_id'])*/->name('kits.models.update');
)->name('kits.models.update');
Route::get('models/{model_id}/edit',
[Kits\PredefinedKitsController::class, 'editModel']
@ -63,18 +61,24 @@ Route::group(['prefix' => 'kits/{kit_id}', 'middleware' => ['auth']], function (
[Kits\PredefinedKitsController::class, 'updateAccessory']
)/*->parameters([2 => 'kit_id', 1 => 'accessory_id'])*/->name('kits.accessories.update');
Route::get('accessories/{accessory_id}/edit',
[Kits\PredefinedKitsController::class, 'editAccessory']
)->name('kits.accessories.edit');
Route::get('accessories/{accessory_id}/edit', [Kits\PredefinedKitsController::class, 'editAccessory'])
->name('kits.accessories.edit');
Route::delete('accessories/{accessory_id}',
[Kits\PredefinedKitsController::class, 'detachAccessory']
)->name('kits.accessories.detach');
Route::get('checkout',
[Kits\CheckoutKitController::class, 'showCheckout']
)->name('kits.checkout.show');
Route::delete('accessories/{accessory_id}', [Kits\PredefinedKitsController::class, 'detachAccessory'])
->name('kits.accessories.detach');
Route::post('checkout',
[Kits\CheckoutKitController::class, 'store']
)->name('kits.checkout.store');
Route::get('checkout', [Kits\CheckoutKitController::class, 'showCheckout'])
->name('kits.checkout.show')
->breadcrumbs(fn (Trail $trail, PredefinedKit $kit) =>
$trail->parent('kits.show', $kit)
->push(trans('general.checkout'), route('kits.checkout.show', $kit)));
Route::post('checkout', [Kits\CheckoutKitController::class, 'store'])
->name('kits.checkout.store');
}); // kits
// Predefined Kit Management
Route::resource('kits', Kits\PredefinedKitsController::class, [
'middleware' => ['auth'],
]);

View file

@ -2,6 +2,9 @@
use App\Http\Controllers\Licenses;
use Illuminate\Support\Facades\Route;
use App\Models\License;
use App\Models\LicenseSeat;
use Tabuna\Breadcrumbs\Trail;
// Licenses
Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () {
@ -10,16 +13,25 @@ Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () {
Route::get('{licenseId}/freecheckout',
[Licenses\LicensesController::class, 'getFreeLicense']
)->name('licenses.freecheckout');
Route::get('{licenseId}/checkout/{seatId?}',
[Licenses\LicenseCheckoutController::class, 'create']
)->name('licenses.checkout');
Route::get('{license}/checkout/{seatId?}', [Licenses\LicenseCheckoutController::class, 'create'])
->name('licenses.checkout')
->breadcrumbs(fn (Trail $trail, License $license) =>
$trail->parent('licenses.show', $license)
->push(trans('general.checkout'), route('licenses.checkout', $license))
);
Route::post(
'{licenseId}/checkout/{seatId?}',
[Licenses\LicenseCheckoutController::class, 'store']
); //name() would duplicate here, so we skip it.
Route::get('{licenseSeatId}/checkin/{backto?}',
[Licenses\LicenseCheckinController::class, 'create']
)->name('licenses.checkin');
Route::get('{licenseSeat}/checkin/{backto?}', [Licenses\LicenseCheckinController::class, 'create'])
->name('licenses.checkin')
->breadcrumbs(fn (Trail $trail, LicenseSeat $licenseSeat) =>
$trail->parent('licenses.show', $licenseSeat->license)
->push(trans('general.checkin'), route('licenses.checkin', $licenseSeat))
);
Route::post('{licenseId}/checkin/{backto?}',
[Licenses\LicenseCheckinController::class, 'store']
@ -59,5 +71,4 @@ Route::group(['prefix' => 'licenses', 'middleware' => ['auth']], function () {
Route::resource('licenses', Licenses\LicensesController::class, [
'middleware' => ['auth'],
'parameters' => ['license' => 'license_id'],
]);

View file

@ -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']
]);

View file

@ -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,8 +25,8 @@ class ShowAccessoryTest extends TestCase
$userForCompanyB = User::factory()->for($companyB)->viewAccessories()->create();
$this->actingAs($userForCompanyB)
->get(route('accessories.show', $accessoryForCompanyA->id))
->assertForbidden();
->get(route('accessories.show', $accessoryForCompanyA))
->assertStatus(302);
}
public function testCanViewAccessory()
@ -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();
}

View file

@ -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();
}

View file

@ -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();
}
}

View file

@ -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());

View file

@ -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,

View file

@ -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();
}
}

View file

@ -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());

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -260,10 +260,10 @@ class AssetCheckoutTest extends TestCase
$asset->forceSave();
$this->actingAs(User::factory()->admin()->create())
->get(route('hardware.checkout.create', ['assetId' => $asset->id]))
->get(route('hardware.checkout.create', $asset))
->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()

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -24,7 +24,7 @@ class LicenseCheckoutTest extends TestCase
$licenseSeat = LicenseSeat::factory()->create();
$this->actingAs($admin)
->post("/licenses/{$licenseSeat->license->id}/checkout", [
->post(route('licenses.checkout', $licenseSeat->license), [
'checkout_to_type' => 'asset',
'assigned_to' => null,
'asset_id' => $asset->id,
@ -47,7 +47,7 @@ class LicenseCheckoutTest extends TestCase
$licenseSeat = LicenseSeat::factory()->create();
$this->actingAs($admin)
->post("/licenses/{$licenseSeat->license->id}/checkout", [
->post(route('licenses.checkout', $licenseSeat->license), [
'checkout_to_type' => 'user',
'assigned_to' => $admin->id,
'asset_id' => null,
@ -69,8 +69,8 @@ class LicenseCheckoutTest extends TestCase
$license = License::factory()->create();
$this->actingAs(User::factory()->admin()->create())
->from(route('licenses.checkout', ['licenseId' => $license->id]))
->post(route('licenses.checkout', ['licenseId' => $license->id]), [
->from(route('licenses.checkout', $license))
->post(route('licenses.checkout', $license), [
'assigned_to' => User::factory()->create()->id,
'redirect_option' => 'index',
'assigned_qty' => 1,
@ -84,13 +84,13 @@ class LicenseCheckoutTest extends TestCase
$license = License::factory()->create();
$this->actingAs(User::factory()->admin()->create())
->from(route('licenses.checkout', ['licenseId' => $license->id]))
->post(route('licenses.checkout' , ['licenseId' => $license->id]), [
->from(route('licenses.checkout', $license))
->post(route('licenses.checkout', $license), [
'assigned_to' => User::factory()->create()->id,
'redirect_option' => 'item',
])
->assertStatus(302)
->assertRedirect(route('licenses.show', ['license' => $license->id]));
->assertRedirect(route('licenses.show', $license));
}
public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsUserTarget()
@ -99,13 +99,13 @@ class LicenseCheckoutTest extends TestCase
$license = License::factory()->create();
$this->actingAs(User::factory()->admin()->create())
->from(route('licenses.checkout', ['licenseId' => $license->id]))
->from(route('licenses.checkout', $license))
->post(route('licenses.checkout' , $license), [
'assigned_to' => $user->id,
'redirect_option' => 'target',
])
->assertStatus(302)
->assertRedirect(route('users.show', ['user' => $user->id]));
->assertRedirect(route('users.show', $user));
}
public function testLicenseCheckoutPagePostIsRedirectedIfRedirectSelectionIsAssetTarget()
{
@ -113,12 +113,12 @@ class LicenseCheckoutTest extends TestCase
$license = License::factory()->create();
$this->actingAs(User::factory()->admin()->create())
->from(route('licenses.checkout', ['licenseId' => $license->id]))
->from(route('licenses.checkout', $license))
->post(route('licenses.checkout' , $license), [
'asset_id' => $asset->id,
'redirect_option' => 'target',
])
->assertStatus(302)
->assertRedirect(route('hardware.show', ['hardware' => $asset->id]));
->assertRedirect(route('hardware.show', $asset));
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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,10 +51,10 @@ 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();
->assertStatus(302);
}
public function testCannotSetQuantityToAmountLowerThanWhatIsCheckedOut()
@ -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',
])

View file

@ -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();
}
}

View file

@ -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',
])

View file

@ -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();
}
}

View file

@ -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'

View file

@ -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();
}
}

View file

@ -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',
])

View file

@ -17,7 +17,7 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi
$this->actingAs(User::factory()->create())
->post(route('report-templates.destroy', $reportTemplate->id))
->assertNotFound();
->assertStatus(302);
$this->assertModelExists($reportTemplate);
}
@ -28,7 +28,7 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi
$this->actingAs(User::factory()->canViewReports()->create())
->delete(route('report-templates.destroy', $reportTemplate->id))
->assertNotFound();
->assertStatus(302);
$this->assertModelExists($reportTemplate);
}

View file

@ -15,7 +15,7 @@ class EditReportTemplateTest extends TestCase implements TestsPermissionsRequire
{
$this->actingAs(User::factory()->create())
->get(route('report-templates.edit', ReportTemplate::factory()->create()))
->assertNotFound();
->assertStatus(302);
}
public function testCannotLoadEditPageForAnotherUsersReportTemplate()
@ -25,7 +25,7 @@ class EditReportTemplateTest extends TestCase implements TestsPermissionsRequire
$this->actingAs($user)
->get(route('report-templates.edit', $reportTemplate))
->assertNotFound();
->assertStatus(302);
}
public function testCanLoadEditReportTemplatePage()

View file

@ -15,7 +15,7 @@ class ShowReportTemplateTest extends TestCase implements TestsPermissionsRequire
{
$this->actingAs(User::factory()->create())
->get(route('report-templates.show', ReportTemplate::factory()->create()))
->assertNotFound();
->assertStatus(302);
}
public function testCanLoadASavedReportTemplate()
@ -38,6 +38,6 @@ class ShowReportTemplateTest extends TestCase implements TestsPermissionsRequire
$this->actingAs(User::factory()->canViewReports()->create())
->get(route('report-templates.show', $reportTemplate))
->assertNotFound();
->assertStatus(302);
}
}

View file

@ -15,14 +15,14 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi
{
$this->actingAs(User::factory()->create())
->post(route('report-templates.update', ReportTemplate::factory()->create()))
->assertNotFound();
->assertStatus(302);
}
public function testCannotUpdateAnotherUsersReportTemplate()
{
$this->actingAs(User::factory()->canViewReports()->create())
->post(route('report-templates.update', ReportTemplate::factory()->create()))
->assertNotFound();
->assertStatus(302);
}
public function testUpdatingReportTemplateRequiresValidFields()

View file

@ -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();
}
}

View file

@ -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')

View file

@ -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]))
->assertStatus(403);
->get(route('users.show', $user))
->assertStatus(302);
$this->actingAs($superuser)
->get(route('users.show', ['user' => $user->id]))
->get(route('users.show', $user))
->assertOk()
->assertStatus(200);
}