mirror of
https://github.com/snipe/snipe-it.git
synced 2024-12-25 05:34:06 -08:00
Accessories API routes
Still a bit of a WIP
This commit is contained in:
parent
75d35273c9
commit
5f49e7c1a7
|
@ -6,6 +6,8 @@ use Illuminate\Http\Request;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Helpers\Helper;
|
use App\Helpers\Helper;
|
||||||
use App\Models\Accessory;
|
use App\Models\Accessory;
|
||||||
|
use App\Http\Transformers\AccessoriesTransformer;
|
||||||
|
|
||||||
|
|
||||||
class AccessoriesController extends Controller
|
class AccessoriesController extends Controller
|
||||||
{
|
{
|
||||||
|
@ -16,11 +18,39 @@ class AccessoriesController extends Controller
|
||||||
* @since [v4.0]
|
* @since [v4.0]
|
||||||
* @return \Illuminate\Http\Response
|
* @return \Illuminate\Http\Response
|
||||||
*/
|
*/
|
||||||
public function index()
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$this->authorize('view', Accessory::class);
|
$this->authorize('view', Accessory::class);
|
||||||
$accessories = Accessory::all();
|
$allowed_columns = ['id','name','model_number','eol','notes','created_at','min_amt','company_id'];
|
||||||
return $accessories;
|
|
||||||
|
$accessories = Accessory::whereNull('accessories.deleted_at')->with('category', 'company', 'manufacturer', 'users', 'location');
|
||||||
|
|
||||||
|
if ($request->has('search')) {
|
||||||
|
$accessories = $accessories->TextSearch($request->input('search'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$offset = $request->input('offset', 0);
|
||||||
|
$limit = $request->input('limit', 50);
|
||||||
|
$order = $request->input('order') === 'asc' ? 'asc' : 'desc';
|
||||||
|
$sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at';
|
||||||
|
|
||||||
|
switch ($sort) {
|
||||||
|
case 'category':
|
||||||
|
$accessories = $accessories->OrderCategory($order);
|
||||||
|
break;
|
||||||
|
case 'companyName':
|
||||||
|
$accessories = $accessories->OrderCompany($order);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$accessories = $accessories->orderBy($sort, $order);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$accessories->orderBy($sort, $order);
|
||||||
|
|
||||||
|
$total = $accessories->count();
|
||||||
|
$accessories = $accessories->skip($offset)->take($limit)->get();
|
||||||
|
return (new AccessoriesTransformer)->transformAccessories($accessories, $total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,7 +87,25 @@ class AccessoriesController extends Controller
|
||||||
{
|
{
|
||||||
$this->authorize('view', Accessory::class);
|
$this->authorize('view', Accessory::class);
|
||||||
$accessory = Accessory::findOrFail($id);
|
$accessory = Accessory::findOrFail($id);
|
||||||
return $accessory;
|
return (new AccessoriesTransformer)->transformAccessory($accessory);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*
|
||||||
|
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||||
|
* @since [v4.0]
|
||||||
|
* @param int $id
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function checkedout($id)
|
||||||
|
{
|
||||||
|
$this->authorize('view', Accessory::class);
|
||||||
|
$accessory = Accessory::findOrFail($id)->with('users')->first();
|
||||||
|
$accessories_users = $accessory->users;
|
||||||
|
$total = $accessories_users->count();
|
||||||
|
return (new AccessoriesTransformer)->transformCheckedoutAccessories($accessories_users, $total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ use App\Helpers\Helper;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Http\Transformers\AssetModelsTransformer;
|
use App\Http\Transformers\AssetModelsTransformer;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class controls all actions related to asset models for
|
* This class controls all actions related to asset models for
|
||||||
* the Snipe-IT Asset Management application.
|
* the Snipe-IT Asset Management application.
|
||||||
|
|
55
app/Http/Transformers/AccessoriesTransformer.php
Normal file
55
app/Http/Transformers/AccessoriesTransformer.php
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
namespace App\Http\Transformers;
|
||||||
|
|
||||||
|
use App\Models\Accessory;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
|
||||||
|
class AccessoriesTransformer
|
||||||
|
{
|
||||||
|
|
||||||
|
public function transformAccessories (Collection $accessories, $total)
|
||||||
|
{
|
||||||
|
$array = array();
|
||||||
|
foreach ($accessories as $accessory) {
|
||||||
|
$array[] = self::transformAccessory($accessory);
|
||||||
|
}
|
||||||
|
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function transformAccessory (Accessory $accessory)
|
||||||
|
{
|
||||||
|
$transformed = [
|
||||||
|
'id' => $accessory->id,
|
||||||
|
'name' => e($accessory->name),
|
||||||
|
'company' => ($accessory->company) ? $accessory->company : null,
|
||||||
|
'manufacturer' => ($accessory->manufacturer_id) ? $accessory->manufacturer : null,
|
||||||
|
'model_number' => ($accessory->model_number) ? e($accessory->model_number) : null,
|
||||||
|
'category' => ($accessory->category_id) ? $accessory->category : null,
|
||||||
|
'location' => ($accessory->location) ? $accessory->location : null,
|
||||||
|
'notes' => ($accessory->notes) ? e($accessory->notes) : null,
|
||||||
|
'qty' => ($accessory->qty) ? e($accessory->qty) : null,
|
||||||
|
'purchase_date' => ($accessory->purchase_date) ? e($accessory->purchase_date) : null,
|
||||||
|
'purchase_cost' => ($accessory->purchase_cost) ? e($accessory->purchase_cost) : null,
|
||||||
|
'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null,
|
||||||
|
'min_qty' => ($accessory->min_amt) ? e($accessory->min_amt) : null,
|
||||||
|
'remaining_qty' => $accessory->numRemaining(),
|
||||||
|
|
||||||
|
];
|
||||||
|
return $transformed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function transformCheckedoutAccessories (Collection $accessories_users, $total)
|
||||||
|
{
|
||||||
|
|
||||||
|
$array = array();
|
||||||
|
foreach ($accessories_users as $user) {
|
||||||
|
$array[] = (new UsersTransformer)->transformUser($user);
|
||||||
|
}
|
||||||
|
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -25,42 +25,58 @@ class AccessoryPresenter extends Presenter
|
||||||
{
|
{
|
||||||
$layout = [
|
$layout = [
|
||||||
[
|
[
|
||||||
"field" => "companyName",
|
"field" => "company",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"switchable" => true,
|
"switchable" => true,
|
||||||
"title" => trans('admin/companies/table.title'),
|
"title" => trans('admin/companies/table.title'),
|
||||||
"visible" => false,
|
"visible" => false,
|
||||||
|
"formatter" => "companiesLinkObjFormatter"
|
||||||
], [
|
], [
|
||||||
"field" => "name",
|
"field" => "name",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"title" => trans('admin/accessories/table.title'),
|
"title" => trans('admin/accessories/table.title'),
|
||||||
|
"formatter" => "accessoriesLinkFormatter"
|
||||||
], [
|
], [
|
||||||
"field" => "category",
|
"field" => "category",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"title" => trans('admin/accessories/general.accessory_category'),
|
"title" => trans('admin/accessories/general.accessory_category'),
|
||||||
|
"formatter" => "categoriesLinkObjFormatter"
|
||||||
], [
|
], [
|
||||||
"field" => "model_number",
|
"field" => "model_number",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"title" => trans('admin/models/table.modelnumber'),
|
"title" => trans('admin/models/table.modelnumber'),
|
||||||
|
"formatter" => "accessoriesLinkFormatter"
|
||||||
], [
|
], [
|
||||||
"field" => "manufacturer",
|
"field" => "manufacturer",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"title" => trans('general.manufacturer'),
|
"title" => trans('general.manufacturer'),
|
||||||
|
"formatter" => "manufacturersLinkObjFormatter",
|
||||||
], [
|
], [
|
||||||
"field" => "location",
|
"field" => "location",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"title" => trans('general.location'),
|
"title" => trans('general.location'),
|
||||||
|
"formatter" => "locationsLinkObjFormatter",
|
||||||
], [
|
], [
|
||||||
"field" => "qty",
|
"field" => "qty",
|
||||||
"searchable" => false,
|
"searchable" => false,
|
||||||
"sortable" => false,
|
"sortable" => false,
|
||||||
"title" => trans('admin/accessories/general.total'),
|
"title" => trans('admin/accessories/general.total'),
|
||||||
|
], [
|
||||||
|
"field" => "min_qty",
|
||||||
|
"searchable" => false,
|
||||||
|
"sortable" => true,
|
||||||
|
"title" => trans('general.min_amt'),
|
||||||
|
], [
|
||||||
|
"field" => "remaining_qty",
|
||||||
|
"searchable" => false,
|
||||||
|
"sortable" => false,
|
||||||
|
"title" => trans('admin/accessories/general.remaining'),
|
||||||
], [
|
], [
|
||||||
"field" => "purchase_date",
|
"field" => "purchase_date",
|
||||||
"searchable" => true,
|
"searchable" => true,
|
||||||
|
@ -78,22 +94,13 @@ class AccessoryPresenter extends Presenter
|
||||||
"sortable" => true,
|
"sortable" => true,
|
||||||
"visible" => false,
|
"visible" => false,
|
||||||
"title" => trans('general.order_number'),
|
"title" => trans('general.order_number'),
|
||||||
], [
|
|
||||||
"field" => "min_amt",
|
|
||||||
"searchable" => false,
|
|
||||||
"sortable" => true,
|
|
||||||
"title" => trans('general.min_amt'),
|
|
||||||
], [
|
|
||||||
"field" => "numRemaining",
|
|
||||||
"searchable" => false,
|
|
||||||
"sortable" => false,
|
|
||||||
"title" => trans('admin/accessories/general.remaining'),
|
|
||||||
], [
|
], [
|
||||||
"field" => "actions",
|
"field" => "actions",
|
||||||
"searchable" => false,
|
"searchable" => false,
|
||||||
"sortable" => false,
|
"sortable" => false,
|
||||||
"switchable" => false,
|
"switchable" => false,
|
||||||
"title" => trans('table.actions'),
|
"title" => trans('table.actions'),
|
||||||
|
"formatter" => "accessoriesActionsFormatter",
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
name="accessories"
|
name="accessories"
|
||||||
class="table table-striped snipe-table"
|
class="table table-striped snipe-table"
|
||||||
id="table"
|
id="table"
|
||||||
data-url="{{route('api.accessories.list') }}"
|
data-url="{{route('api.accessories.index') }}"
|
||||||
data-cookie="true"
|
data-cookie="true"
|
||||||
data-click-to-select="true"
|
data-click-to-select="true"
|
||||||
data-cookie-id-table="accessoriesTable-{{ config('version.hash_version') }}">
|
data-cookie-id-table="accessoriesTable-{{ config('version.hash_version') }}">
|
||||||
|
|
|
@ -57,14 +57,14 @@
|
||||||
name="accessory_users"
|
name="accessory_users"
|
||||||
class="table table-striped snipe-table"
|
class="table table-striped snipe-table"
|
||||||
id="table"
|
id="table"
|
||||||
data-url="{{ route('api.accessories.view', $accessory->id) }}"
|
data-url="{{ route('api.accessories.show', $accessory->id) }}"
|
||||||
data-cookie="true"
|
data-cookie="true"
|
||||||
data-click-to-select="true"
|
data-click-to-select="true"
|
||||||
data-cookie-id-table="accessoryUsersTable"
|
data-cookie-id-table="accessoryUsersTable"
|
||||||
>
|
>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th data-switchable="false" data-searchable="false" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
|
<th data-switchable="false" data-searchable="false" data-formatter="userLinkObjFormatter" data-sortable="false" data-field="name">{{ trans('general.user') }}</th>
|
||||||
<th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
|
<th data-switchable="false" data-searchable="false" data-sortable="false" data-field="actions">{{ trans('table.actions') }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
|
@ -119,6 +119,7 @@ $('.snipe-table').bootstrapTable({
|
||||||
|
|
||||||
var formatters = [
|
var formatters = [
|
||||||
'hardware',
|
'hardware',
|
||||||
|
'accessories',
|
||||||
'locations',
|
'locations',
|
||||||
'users',
|
'users',
|
||||||
'manufacturers',
|
'manufacturers',
|
||||||
|
|
|
@ -190,8 +190,6 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Route::resource('consumables', 'ConsumablesController',
|
Route::resource('consumables', 'ConsumablesController',
|
||||||
['names' =>
|
['names' =>
|
||||||
[
|
[
|
||||||
|
@ -219,15 +217,28 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () {
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Route::group([ 'prefix' => 'accessories' ], function () {
|
||||||
|
Route::match(['DELETE'], '{id}', ['uses' => 'AccessoriessController@destroy','as' => 'api.accessories.destroy']);
|
||||||
|
Route::get(
|
||||||
|
'{id}/checkedout',
|
||||||
|
[ 'as' => 'api.accessories.checkedout', 'uses' => 'AccessoriesController@checkedout' ]
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Route::resource('accessories', 'AccessoriesController',
|
Route::resource('accessories', 'AccessoriesController',
|
||||||
['names' =>
|
['names' =>
|
||||||
[
|
[
|
||||||
'index' => 'api.accessories.index',
|
'index' => 'api.accessories.index',
|
||||||
'create' => 'api.accessories.create',
|
'show' => 'api.accessories.show',
|
||||||
|
'update' => 'api.accessories.update',
|
||||||
|
'store' => 'api.accessories.store',
|
||||||
'destroy' => 'api.accessories.destroy'
|
'destroy' => 'api.accessories.destroy'
|
||||||
],
|
],
|
||||||
'parameters' =>
|
'except' => ['edit'],
|
||||||
['accessory' => 'accessory_id']
|
'parameters' => ['accessory' => 'accessory_id']
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -252,18 +263,6 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
/*---Accessories API---*/
|
|
||||||
Route::group([ 'prefix' => 'accessories' ], function () {
|
|
||||||
|
|
||||||
Route::get('list', [ 'as' => 'api.accessories.list', 'uses' => 'AccessoriesController@getDatatable' ]);
|
|
||||||
Route::get(
|
|
||||||
'{accessoryID}/view',
|
|
||||||
[ 'as' => 'api.accessories.view', 'uses' => 'AccessoriesController@getDataView' ]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*---Locations API---*/
|
/*---Locations API---*/
|
||||||
Route::group(array('prefix'=>'locations'), function () {
|
Route::group(array('prefix'=>'locations'), function () {
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue