mirror of
https://github.com/snipe/snipe-it.git
synced 2025-01-12 06:17:28 -08:00
Merge pull request #14264 from snipe/feature/sc-24816
Added serial and status label to asset maintenances page and API
This commit is contained in:
commit
88a84e9350
|
@ -36,7 +36,8 @@ class AssetMaintenancesController extends Controller
|
||||||
{
|
{
|
||||||
$this->authorize('view', Asset::class);
|
$this->authorize('view', Asset::class);
|
||||||
|
|
||||||
$maintenances = AssetMaintenance::select('asset_maintenances.*')->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'admin');
|
$maintenances = AssetMaintenance::select('asset_maintenances.*')
|
||||||
|
->with('asset', 'asset.model', 'asset.location', 'asset.defaultLoc', 'supplier', 'asset.company', 'asset.assetstatus', 'admin');
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
$maintenances = $maintenances->TextSearch($request->input('search'));
|
$maintenances = $maintenances->TextSearch($request->input('search'));
|
||||||
|
@ -70,10 +71,13 @@ class AssetMaintenancesController extends Controller
|
||||||
'notes',
|
'notes',
|
||||||
'asset_tag',
|
'asset_tag',
|
||||||
'asset_name',
|
'asset_name',
|
||||||
|
'serial',
|
||||||
'user_id',
|
'user_id',
|
||||||
'supplier',
|
'supplier',
|
||||||
'is_warranty',
|
'is_warranty',
|
||||||
|
'status_label',
|
||||||
];
|
];
|
||||||
|
|
||||||
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
|
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
|
||||||
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
|
$sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at';
|
||||||
|
|
||||||
|
@ -90,6 +94,12 @@ class AssetMaintenancesController extends Controller
|
||||||
case 'asset_name':
|
case 'asset_name':
|
||||||
$maintenances = $maintenances->OrderByAssetName($order);
|
$maintenances = $maintenances->OrderByAssetName($order);
|
||||||
break;
|
break;
|
||||||
|
case 'serial':
|
||||||
|
$maintenances = $maintenances->OrderByAssetSerial($order);
|
||||||
|
break;
|
||||||
|
case 'status_label':
|
||||||
|
$maintenances = $maintenances->OrderStatusName($order);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
$maintenances = $maintenances->orderBy($sort, $order);
|
$maintenances = $maintenances->orderBy($sort, $order);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -148,30 +148,20 @@ class AssetMaintenancesController extends Controller
|
||||||
*/
|
*/
|
||||||
public function edit($assetMaintenanceId = null)
|
public function edit($assetMaintenanceId = null)
|
||||||
{
|
{
|
||||||
|
$this->authorize('update', Asset::class);
|
||||||
|
// Check if the asset maintenance exists
|
||||||
$this->authorize('update', Asset::class);
|
$this->authorize('update', Asset::class);
|
||||||
// Check if the asset maintenance exists
|
// Check if the asset maintenance exists
|
||||||
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
||||||
// Redirect to the improvement management page
|
// Redirect to the asset maintenance management page
|
||||||
return redirect()->route('maintenances.index')
|
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
|
||||||
->with('error', trans('admin/asset_maintenances/message.not_found'));
|
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
|
||||||
} elseif (! $assetMaintenance->asset) {
|
// Redirect to the asset maintenance management page
|
||||||
return redirect()->route('maintenances.index')
|
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
||||||
->with('error', 'The asset associated with this maintenance does not exist.');
|
|
||||||
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
||||||
return static::getInsufficientPermissionsRedirect();
|
return static::getInsufficientPermissionsRedirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($assetMaintenance->completion_date == '0000-00-00') {
|
|
||||||
$assetMaintenance->completion_date = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($assetMaintenance->start_date == '0000-00-00') {
|
|
||||||
$assetMaintenance->start_date = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($assetMaintenance->cost == '0.00') {
|
|
||||||
$assetMaintenance->cost = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare Improvement Type List
|
// Prepare Improvement Type List
|
||||||
$assetMaintenanceType = [
|
$assetMaintenanceType = [
|
||||||
|
@ -203,8 +193,10 @@ class AssetMaintenancesController extends Controller
|
||||||
// Check if the asset maintenance exists
|
// Check if the asset maintenance exists
|
||||||
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) {
|
||||||
// Redirect to the asset maintenance management page
|
// Redirect to the asset maintenance management page
|
||||||
return redirect()->route('maintenances.index')
|
return redirect()->route('maintenances.index')->with('error', trans('admin/asset_maintenances/message.not_found'));
|
||||||
->with('error', trans('admin/asset_maintenances/message.not_found'));
|
} elseif ((!$assetMaintenance->asset) || ($assetMaintenance->asset->deleted_at!='')) {
|
||||||
|
// Redirect to the asset maintenance management page
|
||||||
|
return redirect()->route('maintenances.index')->with('error', 'asset does not exist');
|
||||||
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
} elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) {
|
||||||
return static::getInsufficientPermissionsRedirect();
|
return static::getInsufficientPermissionsRedirect();
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,20 @@ class AssetMaintenancesTransformer
|
||||||
'id' => (int) $assetmaintenance->asset->id,
|
'id' => (int) $assetmaintenance->asset->id,
|
||||||
'name'=> ($assetmaintenance->asset->name) ? e($assetmaintenance->asset->name) : null,
|
'name'=> ($assetmaintenance->asset->name) ? e($assetmaintenance->asset->name) : null,
|
||||||
'asset_tag'=> e($assetmaintenance->asset->asset_tag),
|
'asset_tag'=> e($assetmaintenance->asset->asset_tag),
|
||||||
|
'serial'=> e($assetmaintenance->asset->serial),
|
||||||
|
'deleted_at'=> e($assetmaintenance->asset->deleted_at),
|
||||||
|
'created_at'=> e($assetmaintenance->asset->created_at),
|
||||||
] : null,
|
] : null,
|
||||||
'model' => (($assetmaintenance->asset) && ($assetmaintenance->asset->model)) ? [
|
'model' => (($assetmaintenance->asset) && ($assetmaintenance->asset->model)) ? [
|
||||||
'id' => (int) $assetmaintenance->asset->model->id,
|
'id' => (int) $assetmaintenance->asset->model->id,
|
||||||
'name'=> ($assetmaintenance->asset->model->name) ? e($assetmaintenance->asset->model->name).' '.e($assetmaintenance->asset->model->model_number) : null,
|
'name'=> ($assetmaintenance->asset->model->name) ? e($assetmaintenance->asset->model->name).' '.e($assetmaintenance->asset->model->model_number) : null,
|
||||||
] : null,
|
] : null,
|
||||||
|
'status_label' => ($assetmaintenance->asset->assetstatus) ? [
|
||||||
|
'id' => (int) $assetmaintenance->asset->assetstatus->id,
|
||||||
|
'name'=> e($assetmaintenance->asset->assetstatus->name),
|
||||||
|
'status_type'=> e($assetmaintenance->asset->assetstatus->getStatuslabelType()),
|
||||||
|
'status_meta' => e($assetmaintenance->asset->present()->statusMeta),
|
||||||
|
] : null,
|
||||||
'company' => (($assetmaintenance->asset) && ($assetmaintenance->asset->company)) ? [
|
'company' => (($assetmaintenance->asset) && ($assetmaintenance->asset->company)) ? [
|
||||||
'id' => (int) $assetmaintenance->asset->company->id,
|
'id' => (int) $assetmaintenance->asset->company->id,
|
||||||
'name'=> ($assetmaintenance->asset->company->name) ? e($assetmaintenance->asset->company->name) : null,
|
'name'=> ($assetmaintenance->asset->company->name) ? e($assetmaintenance->asset->company->name) : null,
|
||||||
|
@ -64,7 +72,7 @@ class AssetMaintenancesTransformer
|
||||||
];
|
];
|
||||||
|
|
||||||
$permissions_array['available_actions'] = [
|
$permissions_array['available_actions'] = [
|
||||||
'update' => Gate::allows('update', Asset::class),
|
'update' => (Gate::allows('update', Asset::class) && ($assetmaintenance->asset->deleted_at=='')) ? true : false,
|
||||||
'delete' => Gate::allows('delete', Asset::class),
|
'delete' => Gate::allows('delete', Asset::class),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -1560,7 +1560,7 @@ class Asset extends Depreciable
|
||||||
*
|
*
|
||||||
* In short, this set of statements tells the query builder to ONLY query against an
|
* In short, this set of statements tells the query builder to ONLY query against an
|
||||||
* actual field that's being passed if it doesn't meet known relational fields. This
|
* actual field that's being passed if it doesn't meet known relational fields. This
|
||||||
* allows us to query custom fields directly in the assetsv table
|
* allows us to query custom fields directly in the assets table
|
||||||
* (regardless of their name) and *skip* any fields that we already know can only be
|
* (regardless of their name) and *skip* any fields that we already know can only be
|
||||||
* searched through relational searches that we do earlier in this method.
|
* searched through relational searches that we do earlier in this method.
|
||||||
*
|
*
|
||||||
|
|
|
@ -62,7 +62,15 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableAttributes = ['title', 'notes', 'asset_maintenance_type', 'cost', 'start_date', 'completion_date'];
|
protected $searchableAttributes =
|
||||||
|
[
|
||||||
|
'title',
|
||||||
|
'notes',
|
||||||
|
'asset_maintenance_type',
|
||||||
|
'cost',
|
||||||
|
'start_date',
|
||||||
|
'completion_date'
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relations and their attributes that should be included when searching the model.
|
* The relations and their attributes that should be included when searching the model.
|
||||||
|
@ -70,9 +78,10 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $searchableRelations = [
|
protected $searchableRelations = [
|
||||||
'asset' => ['name', 'asset_tag'],
|
'asset' => ['name', 'asset_tag', 'serial'],
|
||||||
'asset.model' => ['name', 'model_number'],
|
'asset.model' => ['name', 'model_number'],
|
||||||
'asset.supplier' => ['name'],
|
'asset.supplier' => ['name'],
|
||||||
|
'asset.assetstatus' => ['name'],
|
||||||
'supplier' => ['name'],
|
'supplier' => ['name'],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -197,6 +206,7 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||||
->orderBy('suppliers_maintenances.name', $order);
|
->orderBy('suppliers_maintenances.name', $order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query builder scope to order on admin user
|
* Query builder scope to order on admin user
|
||||||
*
|
*
|
||||||
|
@ -239,4 +249,33 @@ class AssetMaintenance extends Model implements ICompanyableChild
|
||||||
return $query->leftJoin('assets', 'asset_maintenances.asset_id', '=', 'assets.id')
|
return $query->leftJoin('assets', 'asset_maintenances.asset_id', '=', 'assets.id')
|
||||||
->orderBy('assets.name', $order);
|
->orderBy('assets.name', $order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query builder scope to order on serial
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Database\Query\Builder $query Query builder instance
|
||||||
|
* @param string $order Order
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Query\Builder Modified query builder
|
||||||
|
*/
|
||||||
|
public function scopeOrderByAssetSerial($query, $order)
|
||||||
|
{
|
||||||
|
return $query->leftJoin('assets', 'asset_maintenances.asset_id', '=', 'assets.id')
|
||||||
|
->orderBy('assets.serial', $order);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query builder scope to order on status label name
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Database\Query\Builder $query Query builder instance
|
||||||
|
* @param text $order Order
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Query\Builder Modified query builder
|
||||||
|
*/
|
||||||
|
public function scopeOrderStatusName($query, $order)
|
||||||
|
{
|
||||||
|
return $query->join('assets as maintained_asset', 'asset_maintenances.asset_id', '=', 'maintained_asset.id')
|
||||||
|
->leftjoin('status_labels as maintained_asset_status', 'maintained_asset_status.id', '=', 'maintained_asset.status_id')
|
||||||
|
->orderBy('maintained_asset_status.name', $order);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,19 @@ class AssetMaintenancesPresenter extends Presenter
|
||||||
'sortable' => true,
|
'sortable' => true,
|
||||||
'title' => trans('admin/hardware/table.asset_tag'),
|
'title' => trans('admin/hardware/table.asset_tag'),
|
||||||
'formatter' => 'assetTagLinkFormatter',
|
'formatter' => 'assetTagLinkFormatter',
|
||||||
|
], [
|
||||||
|
'field' => 'serial',
|
||||||
|
'searchable' => true,
|
||||||
|
'sortable' => true,
|
||||||
|
'title' => trans('admin/hardware/table.serial'),
|
||||||
|
'formatter' => 'assetSerialLinkFormatter',
|
||||||
|
], [
|
||||||
|
'field' => 'status_label',
|
||||||
|
'searchable' => true,
|
||||||
|
'sortable' => true,
|
||||||
|
'title' => trans('admin/hardware/table.status'),
|
||||||
|
'visible' => true,
|
||||||
|
'formatter' => 'statuslabelsLinkObjFormatter',
|
||||||
], [
|
], [
|
||||||
'field' => 'model',
|
'field' => 'model',
|
||||||
'searchable' => true,
|
'searchable' => true,
|
||||||
|
|
|
@ -459,6 +459,7 @@ return [
|
||||||
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
|
'no_autoassign_licenses_help' => 'Do not include user for bulk-assigning through the license UI or cli tools.',
|
||||||
'modal_confirm_generic' => 'Are you sure?',
|
'modal_confirm_generic' => 'Are you sure?',
|
||||||
'cannot_be_deleted' => 'This item cannot be deleted',
|
'cannot_be_deleted' => 'This item cannot be deleted',
|
||||||
|
'cannot_be_edited' => 'This item cannot be edited.',
|
||||||
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
|
'undeployable_tooltip' => 'This item cannot be checked out. Check the quantity remaining.',
|
||||||
'serial_number' => 'Serial Number',
|
'serial_number' => 'Serial Number',
|
||||||
'item_notes' => ':item Notes',
|
'item_notes' => ':item Notes',
|
||||||
|
|
|
@ -872,11 +872,13 @@
|
||||||
|
|
||||||
|
|
||||||
@can('update', $asset)
|
@can('update', $asset)
|
||||||
|
@if ($asset->deleted_at=='')
|
||||||
<div class="col-md-12" style="padding-top: 5px;">
|
<div class="col-md-12" style="padding-top: 5px;">
|
||||||
<a href="{{ route('hardware.edit', $asset->id) }}" style="width: 100%;" class="btn btn-sm btn-primary hidden-print">
|
<a href="{{ route('hardware.edit', $asset->id) }}" style="width: 100%;" class="btn btn-sm btn-primary hidden-print">
|
||||||
{{ trans('admin/hardware/general.edit') }}
|
{{ trans('admin/hardware/general.edit') }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@endif
|
||||||
@endcan
|
@endcan
|
||||||
|
|
||||||
@can('create', $asset)
|
@can('create', $asset)
|
||||||
|
|
|
@ -296,6 +296,10 @@
|
||||||
|
|
||||||
if ((row.available_actions) && (row.available_actions.update === true)) {
|
if ((row.available_actions) && (row.available_actions.update === true)) {
|
||||||
actions += '<a href="{{ config('app.url') }}/' + dest + '/' + row.id + '/edit" class="actions btn btn-sm btn-warning" data-tooltip="true" title="{{ trans('general.update') }}"><i class="fas fa-pencil-alt" aria-hidden="true"></i><span class="sr-only">{{ trans('general.update') }}</span></a> ';
|
actions += '<a href="{{ config('app.url') }}/' + dest + '/' + row.id + '/edit" class="actions btn btn-sm btn-warning" data-tooltip="true" title="{{ trans('general.update') }}"><i class="fas fa-pencil-alt" aria-hidden="true"></i><span class="sr-only">{{ trans('general.update') }}</span></a> ';
|
||||||
|
} else {
|
||||||
|
if ((row.available_actions) && (row.available_actions.update != true)) {
|
||||||
|
actions += '<span data-tooltip="true" title="{{ trans('general.cannot_be_edited') }}"><a class="btn btn-warning btn-sm disabled" onClick="return false;"><i class="fas fa-pencil-alt"></i></a></span> ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((row.available_actions) && (row.available_actions.delete === true)) {
|
if ((row.available_actions) && (row.available_actions.delete === true)) {
|
||||||
|
@ -623,6 +627,9 @@
|
||||||
|
|
||||||
function assetTagLinkFormatter(value, row) {
|
function assetTagLinkFormatter(value, row) {
|
||||||
if ((row.asset) && (row.asset.id)) {
|
if ((row.asset) && (row.asset.id)) {
|
||||||
|
if (row.asset.deleted_at!='') {
|
||||||
|
return '<span style="white-space: nowrap;"><i class="fas fa-times text-danger"></i><span class="sr-only">deleted</span> <del><a href="{{ config('app.url') }}/hardware/' + row.asset.id + '" data-tooltip="true" title="{{ trans('admin/hardware/general.deleted') }}">' + row.asset.asset_tag + '</a></del></span>';
|
||||||
|
}
|
||||||
return '<a href="{{ config('app.url') }}/hardware/' + row.asset.id + '">' + row.asset.asset_tag + '</a>';
|
return '<a href="{{ config('app.url') }}/hardware/' + row.asset.id + '">' + row.asset.asset_tag + '</a>';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
|
@ -640,7 +647,17 @@
|
||||||
if ((row.asset) && (row.asset.name)) {
|
if ((row.asset) && (row.asset.name)) {
|
||||||
return '<a href="{{ config('app.url') }}/hardware/' + row.asset.id + '">' + row.asset.name + '</a>';
|
return '<a href="{{ config('app.url') }}/hardware/' + row.asset.id + '">' + row.asset.name + '</a>';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function assetSerialLinkFormatter(value, row) {
|
||||||
|
|
||||||
|
if ((row.asset) && (row.asset.serial)) {
|
||||||
|
if (row.asset.deleted_at!='') {
|
||||||
|
return '<span style="white-space: nowrap;"><i class="fas fa-times text-danger"></i><span class="sr-only">deleted</span> <del><a href="{{ config('app.url') }}/hardware/' + row.asset.id + '" data-tooltip="true" title="{{ trans('admin/hardware/general.deleted') }}">' + row.asset.serial + '</a></del></span>';
|
||||||
|
}
|
||||||
|
return '<a href="{{ config('app.url') }}/hardware/' + row.asset.id + '">' + row.asset.serial + '</a>';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
function trueFalseFormatter(value) {
|
function trueFalseFormatter(value) {
|
||||||
|
|
Loading…
Reference in a new issue