mirror of
https://github.com/snipe/snipe-it.git
synced 2024-12-25 05:34:06 -08:00
8a6713d5c0
* WIP - beginning of improved requested assets - Use Ajax tables for faster loading - Use new notifications for requesting an asset TODO: - Use ajax tables for requestable asset models - Use new notifications for canceling an asset request - Expire requests once the asset has been checked out to the requesting user * Only show asset name in email if it has one * Refactor requested method to only include non-canceled requests * Refactored requestable assets to log request and cancelation * Added softdeletes on checkout requests * Differentiate between canceling and deleting requests * Added asset request cancelation notification * Added timestamps and corrected unique key on requests table * Improved requests view * Re-use blade for cancel/request email * Refactored BS table formatter for requested assets * Location name min reduced to 2 * Added PAT test as maintenance option This needs to be refactored into database-driven options with a UI * Better slack message * Added getImageUrl method for assets * Include qty in request notifications TODO: - Try to pull requested info from original request for cancelation, otherwise it will default to 1 * Removed old asset request/cancel emails * Added user profile asset request routes * Added profile controller requested assets method * Added blade link to requested assets for profile view * Sort user history desc * Added requested assets blade * Added canceled at to checkoutRequest method * Include qty in request * Fixed comment, removed allowed_columns * Removed Queable methods, since we don’t use a queue * Fixed return type in method doc * Fixed version number * Changed id to user_id for clarity
167 lines
8.9 KiB
PHP
167 lines
8.9 KiB
PHP
@extends('layouts/default')
|
|
|
|
@section('title0')
|
|
{{ trans('admin/hardware/general.requestable') }}
|
|
{{ trans('general.assets') }}
|
|
@stop
|
|
|
|
{{-- Page title --}}
|
|
@section('title')
|
|
@yield('title0') @parent
|
|
@stop
|
|
|
|
{{-- Page content --}}
|
|
@section('content')
|
|
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
|
|
<div class="nav-tabs-custom">
|
|
<ul class="nav nav-tabs">
|
|
<li class="active">
|
|
<a href="#assets" data-toggle="tab" title="{{ trans('general.assets') }}">{{ trans('general.assets') }}</a>
|
|
</li>
|
|
<li>
|
|
<a href="#models" data-toggle="tab" title="{{ trans('general.asset_models') }}">{{ trans('general.asset_models') }}</a>
|
|
</li>
|
|
</ul>
|
|
<div class="tab-content">
|
|
<div class="tab-pane fade in active" id="assets">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<div class="table-responsive">
|
|
<table
|
|
data-click-to-select="true"
|
|
data-cookie-id-table="requestableAssetsListingTable"
|
|
data-pagination="true"
|
|
data-id-table="requestableAssetsListingTable"
|
|
data-search="true"
|
|
data-side-pagination="server"
|
|
data-show-columns="true"
|
|
data-show-export="false"
|
|
data-show-footer="false"
|
|
data-show-refresh="true"
|
|
data-sort-order="asc"
|
|
data-sort-name="name"
|
|
data-toolbar="#toolbar"
|
|
id="assetsListingTable"
|
|
class="table table-striped snipe-table"
|
|
data-url="{{ route('api.assets.requestable', ['requestable' => true]) }}">
|
|
|
|
<thead>
|
|
<tr>
|
|
<th class="col-md-1" data-field="image" data-formatter="imageFormatter" data-sortable="true">{{ trans('general.image') }}</th>
|
|
<th class="col-md-2" data-field="model" data-sortable="true">{{ trans('admin/hardware/table.asset_model') }}</th>
|
|
<th class="col-md-2" data-field="model_number" data-sortable="true">{{ trans('admin/models/table.modelnumber') }}</th>
|
|
<th class="col-md-2" data-field="name" data-sortable="true">{{ trans('admin/hardware/form.name') }}</th>
|
|
<th class="col-md-3" data-field="serial" data-sortable="true">{{ trans('admin/hardware/table.serial') }}</th>
|
|
<th class="col-md-2" data-field="location" data-sortable="true">{{ trans('admin/hardware/table.location') }}</th>
|
|
<th class="col-md-2" data-field="status" data-sortable="true">{{ trans('admin/hardware/table.status') }}</th>
|
|
<th class="col-md-2" data-field="expected_checkin" data-formatter="dateDisplayFormatter" data-sortable="true">{{ trans('admin/hardware/form.expected_checkin') }}</th>
|
|
<th class="col-md-1" data-formatter="assetRequestActionsFormatter" data-field="actions" data-sortable="false">{{ trans('table.actions') }}</th>
|
|
</tr>
|
|
</thead>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="tab-pane fade" id="models">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
|
|
@if ($models->count() > 0)
|
|
<h4>Requestable Models</h4>
|
|
<table
|
|
name="requested-assets"
|
|
data-toolbar="#toolbar"
|
|
class="table table-striped snipe-table"
|
|
id="table"
|
|
data-advanced-search="true"
|
|
data-id-table="advancedTable"
|
|
data-cookie-id-table="requestableAssets">
|
|
<thead>
|
|
<tr role="row">
|
|
<th class="col-md-1" data-sortable="true">{{ trans('general.image') }}</th>
|
|
<th class="col-md-6" data-sortable="true">{{ trans('admin/hardware/table.asset_model') }}</th>
|
|
<th class="col-md-3" data-sortable="true">{{ trans('admin/accessories/general.remaining') }}</th>
|
|
|
|
<th class="col-md-2 actions" data-sortable="false">{{ trans('table.actions') }}</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
@foreach($models as $requestableModel)
|
|
<tr>
|
|
|
|
<td>
|
|
|
|
@if ($requestableModel->image)
|
|
<a href="{{ url('/') }}/uploads/models/{{ $requestableModel->image }}" data-toggle="lightbox" data-type="image">
|
|
<img src="{{ url('/') }}/uploads/models/{{ $requestableModel->image }}" style="max-height: {{ $snipeSettings->thumbnail_max_h }}px; width: auto;" class="img-responsive">
|
|
</a>
|
|
@endif
|
|
|
|
</td>
|
|
|
|
|
|
<td>{{$requestableModel->name}}</td>
|
|
<td>{{$requestableModel->assets->where('requestable', '1')->count()}}</td>
|
|
|
|
<td>
|
|
<form action="{{route('account/request-item', ['itemType' => 'asset_model', 'itemId' => $requestableModel->id])}}" method="POST" accept-charset="utf-8">
|
|
{{ csrf_field() }}
|
|
<input type="text" style="width: 70px; margin-right: 10px;" class="form-control pull-left" name="request-quantity" value="" placeholder="{{ trans('general.qty') }}">
|
|
@if ($requestableModel->isRequestedBy(Auth::user()))
|
|
{{ Form::submit(trans('button.cancel'), ['class' => 'btn btn-danger btn-sm'])}}
|
|
@else
|
|
{{ Form::submit(trans('button.request'), ['class' => 'btn btn-primary btn-sm'])}}
|
|
@endif
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
|
|
@else
|
|
<div class="alert alert-info alert-block">
|
|
<i class="fa fa-info-circle"></i>
|
|
{{ trans('general.no_results') }}
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div> <!-- .tab-content-->
|
|
</div> <!-- .nav-tabs-custom -->
|
|
</div> <!-- .col-md-12> -->
|
|
</div> <!-- .row -->
|
|
@stop
|
|
|
|
|
|
@section('moar_scripts')
|
|
@include ('partials.bootstrap-table', [
|
|
'exportFile' => 'requested-export',
|
|
'search' => true,
|
|
'clientSearch' => true,
|
|
])
|
|
|
|
|
|
<script nonce="{{ csrf_token() }}">
|
|
|
|
$( "a[name='Request']").click(function(event) {
|
|
// event.preventDefault();
|
|
quantity = $(this).closest('td').siblings().find('input').val();
|
|
currentUrl = $(this).attr('href');
|
|
// $(this).attr('href', currentUrl + '?quantity=' + quantity);
|
|
// alert($(this).attr('href'));
|
|
});
|
|
</script>
|
|
@stop
|
|
|
|
|