New save mechanic
This commit is contained in:
parent
f1f7694835
commit
9d5cd27575
15 changed files with 685 additions and 128 deletions
|
@ -36,7 +36,7 @@ class PredefinedKitsController extends Controller
|
|||
|
||||
$total = $kits->count();
|
||||
$kits = $kits->skip($offset)->take($limit)->get();
|
||||
return (new PredefinedKitsTransformer)->transformPrdefinedKits($kits, $total);
|
||||
return (new PredefinedKitsTransformer)->transformPredefinedKits($kits, $total);
|
||||
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ class PredefinedKitsController extends Controller
|
|||
{
|
||||
$this->authorize('view', PredefinedKit::class);
|
||||
$kit = PredefinedKit::findOrFail($id);
|
||||
return (new PredefinedKitsTransformer)->transformPrdefinedKit($kit);
|
||||
return (new PredefinedKitsTransformer)->transformPredefinedKit($kit);
|
||||
}
|
||||
|
||||
|
||||
|
@ -247,16 +247,20 @@ class PredefinedKitsController extends Controller
|
|||
*/
|
||||
public function storeModel(Request $request, $kit_id)
|
||||
{
|
||||
//return response()->json(Helper::formatStandardApiResponse('error', 'string11', dd($request))); // TODO: trans
|
||||
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
|
||||
$kit = PredefinedKit::findOrFail($kit_id);
|
||||
|
||||
$quantity = $request->input('quantity', 1);
|
||||
if( $quantity < 1) {
|
||||
$quantity = 1;
|
||||
}
|
||||
//echo $request->get('model');
|
||||
$kit->models()->attach( $request->get('model'), ['quantity' => $quantity]);
|
||||
|
||||
return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License added successfull')); // TODO: trans
|
||||
|
||||
return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Model added successfull')); // TODO: trans
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
namespace App\Http\Controllers\Kits;
|
||||
|
||||
use App\Models\PredefinedKit;
|
||||
use App\Models\AssetModel;
|
||||
|
@ -7,6 +7,11 @@ use App\Models\PredefinedModel;
|
|||
use App\Models\License;
|
||||
use App\Models\PredefinedLicence;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\ImageUploadRequest;
|
||||
use App\Models\Accessory;
|
||||
use App\Models\SnipeItPivot;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -36,7 +41,7 @@ class PredefinedKitsController extends Controller
|
|||
{
|
||||
//$this->authorize('create', PredefinedKit::class);
|
||||
|
||||
return view('kits/edit')->with('item', new PredefinedKit);
|
||||
return view('kits/create')->with('item', new PredefinedKit);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -83,7 +88,7 @@ class PredefinedKitsController extends Controller
|
|||
if(!$success) {
|
||||
return redirect()->back()->withInput()->withErrors($kit->getErrors());
|
||||
}
|
||||
return redirect()->route("models.index")->with('success', 'Kit was successfully created.'); // TODO: trans()
|
||||
return redirect()->route("kits.index")->with('success', 'Kit was successfully created.'); // TODO: trans()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -91,13 +96,13 @@ class PredefinedKitsController extends Controller
|
|||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $kitId
|
||||
* @param int $kit_id
|
||||
* @return View
|
||||
*/
|
||||
public function edit($kitId = null)
|
||||
public function edit($kit_id = null)
|
||||
{
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
if ($kit = PredefinedKit::find($kitId)) {
|
||||
if ($kit = PredefinedKit::find($kit_id)) {
|
||||
return view('kits/edit')
|
||||
->with('item', $kit)
|
||||
->with('models', $kit->models)
|
||||
|
@ -113,40 +118,21 @@ class PredefinedKitsController extends Controller
|
|||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $kitId
|
||||
* @param int $kit_id
|
||||
* @return Redirect
|
||||
*/
|
||||
public function update(ImageUploadRequest $request, $kitId = null)
|
||||
public function update(ImageUploadRequest $request, $kit_id = null)
|
||||
{
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
// Check if the kit exists
|
||||
if (is_null($kit = PredefinedKit::find($kitId))) {
|
||||
if (is_null($kit = PredefinedKit::find($kit_id))) {
|
||||
// Redirect to the kits management page
|
||||
return redirect()->route('kits.index')->with('error','Kit does not exist'); // TODO: trans
|
||||
}
|
||||
|
||||
$kit->name = $request->input('name');
|
||||
|
||||
// update models
|
||||
$new_model_ids = $request->input('models');
|
||||
$old_model_ids = $kit->models()->pluck('id'); // METODO: проверить
|
||||
// для получения ид надо что-то такое https://stackoverflow.com/questions/34308169/eloquent-orm-laravel-5-get-array-of-ids
|
||||
// project built on Laravel 5.4
|
||||
list($add_model_ids, $remove_model_ids) = $this->getAddingDeletingElements($new_model_ids, $old_model_ids); // METODO: тут ошибка, надо именно ид-шки получать, а не сами модели
|
||||
|
||||
$new_licence_ids = $request->input('licences');
|
||||
$old_licence_ids = $kit->licences()->pluck('id'); // METODO: проверить
|
||||
list($add_licence_ids, $remove_licence_ids) = $this->getAddingDeletingElements($new_licence_ids, $old_licence_ids);
|
||||
|
||||
$success = DB::transaction(function() use($kit, $add_models, $remove_models, $add_licences, $remove_licences) {
|
||||
$kit->models()->detach($remove_models);
|
||||
$kit->models()->attach($add_models);
|
||||
$kit->licenses()->detach($remove_licenses);
|
||||
$kit->licenses()->attach($add_licenses);
|
||||
return $kit->save();
|
||||
});
|
||||
|
||||
if ($success) {
|
||||
|
||||
if ($kit->save()) {
|
||||
return redirect()->route("kits.index")->with('success', 'Kit was successfully updated'); // TODO: trans
|
||||
}
|
||||
return redirect()->back()->withInput()->withErrors($kit->getErrors());
|
||||
|
@ -158,14 +144,14 @@ class PredefinedKitsController extends Controller
|
|||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $kitId
|
||||
* @param int $kit_id
|
||||
* @return Redirect
|
||||
*/
|
||||
public function destroy($kitId)
|
||||
public function destroy($kit_id)
|
||||
{
|
||||
$this->authorize('delete', PredefinedKit::class);
|
||||
// Check if the kit exists
|
||||
if (is_null($kit = PredefinedKit::find($kitId))) {
|
||||
if (is_null($kit = PredefinedKit::find($kit_id))) {
|
||||
return redirect()->route('kits.index')->with('error', 'Kit not found'); // TODO: trans
|
||||
}
|
||||
|
||||
|
@ -180,28 +166,123 @@ class PredefinedKitsController extends Controller
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the model information to present to the model view page
|
||||
* Get the kit information to present to the kit view page
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $modelId
|
||||
* @return View
|
||||
*/
|
||||
public function show($modelId = null)
|
||||
public function show($kit_id = null)
|
||||
{
|
||||
$this->authorize('view', AssetModel::class);
|
||||
$model = AssetModel::withTrashed()->find($modelId);
|
||||
$this->authorize('view', PredefinedKit::class);
|
||||
$kit = PredefinedKit::find($kit_id);
|
||||
|
||||
if (isset($model->id)) {
|
||||
return view('models/view', compact('model'));
|
||||
if (isset($kit->id)) {
|
||||
return view('kits/view', compact('kit'));
|
||||
}
|
||||
// Prepare the error message
|
||||
$error = trans('admin/models/message.does_not_exist', compact('id'));
|
||||
$error = 'Kit does not exist.'; // TODO: trans
|
||||
|
||||
// Redirect to the user management page
|
||||
return redirect()->route('models.index')->with('error', $error);
|
||||
return redirect()->route('kits.index')->with('error', $error);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a view containing the Predefined Kit edit form.
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $kit_id
|
||||
* @return View
|
||||
*/
|
||||
public function editModel($kit_id, $model_id)
|
||||
{
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
if ( ($kit = PredefinedKit::find($kit_id))
|
||||
&& ($model = $kit->models()->find($model_id)) ) {
|
||||
// $item = $model->pivot;
|
||||
// $item->name1 = 'tesn1';
|
||||
// dd($item);
|
||||
//dd($model->pivot);
|
||||
// $item = $model->pivot;
|
||||
|
||||
return view('kits/model-edit', [
|
||||
'kit' => $kit,
|
||||
'model' => $model,
|
||||
'item' => $model->pivot
|
||||
]);
|
||||
}
|
||||
return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the kit information to present to the kit view page
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $modelId
|
||||
* @return View
|
||||
*/
|
||||
public function updateModel(Request $request, $kit_id) {
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
if (is_null($kit = PredefinedKit::find($kit_id))) {
|
||||
// Redirect to the kits management page
|
||||
return redirect()->route('kits.index')->with('error','Kit does not exist'); // TODO: trans
|
||||
}
|
||||
//return view('kits/create-model')->with('item', $kit);
|
||||
|
||||
|
||||
// $quantity = $request->input('quantity', 1);
|
||||
// if( $quantity < 1) {
|
||||
// $quantity = 1;
|
||||
// }
|
||||
|
||||
$validator = \Validator::make($request->all(), $kit->modelRules);
|
||||
if ($validator->fails()) {
|
||||
return redirect()->back()->withInput()->withErrors($validator);
|
||||
}
|
||||
// $kit->models()->sync([$request->input('model_id') => ['quantity' => $request->input('quantity')]]);
|
||||
// $kit->models()->updateExistingPivot($request->input('pivot_id'), ['model_id' => $request->input('model_id'), 'quantity' => $request->input('quantity')]);
|
||||
// $s = [$request->input('pivot_id') => ['model_id' => $request->input('model_id'), 'quantity' => $request->input('quantity')]];
|
||||
//dd($s);
|
||||
// $changes = $kit->models()->syncWithoutDetaching([$request->input('pivot_id') => ['model_id' => $request->input('model_id'), 'quantity' => $request->input('quantity')]]);
|
||||
// $changes = $kit->models()->syncWithoutDetaching(['1' => ['model_id' => '2', 'quantity' => '35']]);
|
||||
$pivot = $kit->models()->wherePivot('id', $request->input('pivot_id'))->first()->pivot;
|
||||
// $pivot = $kit->models()->newPivotStatement()->find('1');
|
||||
// $ret = $kit->models()->newPivotStatement()->find('1');
|
||||
$pivot->model_id = $request->input('model_id');
|
||||
$pivot->quantity = $request->input('quantity');
|
||||
$pivot->save();
|
||||
|
||||
// return $this->edit($kit_id)->with('success', 'Model updated successfully.');
|
||||
return redirect()->route('kits.edit', $kit_id)->with('success', 'Model updated successfully.'); // TODO: trans
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the kit information to present to the kit view page
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v1.0]
|
||||
* @param int $modelId
|
||||
* @return View
|
||||
*/
|
||||
public function detachModel($kit_id, $model_id) {
|
||||
$this->authorize('update', PredefinedKit::class);
|
||||
if (is_null($kit = PredefinedKit::find($kit_id))) {
|
||||
// Redirect to the kits management page
|
||||
return redirect()->route('kits.index')->with('error','Kit does not exist'); // TODO: trans
|
||||
}
|
||||
|
||||
// Delete childs
|
||||
$kit->models()->detach($model_id);
|
||||
|
||||
// Redirect to the kit management page
|
||||
return redirect()->route('kits.index')->with('success', 'Kit was successfully deleted'); // TODO: trans
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns true if a fieldset is set, 'add default values' is ticked and if
|
||||
* any default values were entered into the form.
|
||||
|
|
|
@ -36,4 +36,11 @@ class ModalController extends Controller
|
|||
return view('modals.manufacturer');
|
||||
}
|
||||
|
||||
function kitModel() {
|
||||
return view('modals.kit-model');
|
||||
}
|
||||
|
||||
function kitLicense() {
|
||||
return view('modals.kit-license');
|
||||
}
|
||||
}
|
||||
|
|
72
app/Http/Transformers/PredefinedKitsTransformer.php
Normal file
72
app/Http/Transformers/PredefinedKitsTransformer.php
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
namespace App\Http\Transformers;
|
||||
|
||||
use App\Models\PredefinedKit;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Gate;
|
||||
use App\Helpers\Helper;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\Models\SnipeModel;
|
||||
|
||||
class PredefinedKitsTransformer
|
||||
{
|
||||
|
||||
public function transformPredefinedKits (Collection $kits, $total)
|
||||
{
|
||||
$array = array();
|
||||
foreach ($kits as $kit) {
|
||||
$array[] = self::transformPredefinedKit($kit);
|
||||
}
|
||||
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||
}
|
||||
|
||||
public function transformPredefinedKit (PredefinedKit $kit)
|
||||
{
|
||||
$array = [
|
||||
'id' => (int) $kit->id,
|
||||
'name' => e($kit->name)
|
||||
];
|
||||
|
||||
$permissions_array['available_actions'] = [
|
||||
'update' => Gate::allows('update', PredefinedKit::class),
|
||||
'delete' => Gate::allows('delete', PredefinedKit::class),
|
||||
// 'clone' => Gate::allows('create', PredefinedKit::class),
|
||||
// 'restore' => Gate::allows('create', PredefinedKit::class),
|
||||
];
|
||||
|
||||
$array += $permissions_array;
|
||||
return $array;
|
||||
}
|
||||
|
||||
public function transformElements(Collection $elements, $total) {
|
||||
$array = array();
|
||||
foreach ($elements as $element) {
|
||||
$array[] = self::transformElement($element);
|
||||
}
|
||||
return (new DatatablesTransformer)->transformDatatables($array, $total);
|
||||
}
|
||||
|
||||
public function transformElement(SnipeModel $element) {
|
||||
$array = [
|
||||
'id' => (int) $element->id,
|
||||
'pivot_id' => (int) $element->pivot->id,
|
||||
'owner_id' => (int) $element->pivot->kit_id,
|
||||
'quantity' => (int) $element->pivot->quantity,
|
||||
'name' => e($element->name)
|
||||
];
|
||||
|
||||
$permissions_array['available_actions'] = [
|
||||
'update' => Gate::allows('update', PredefinedKit::class),
|
||||
'delete' => Gate::allows('delete', PredefinedKit::class),
|
||||
];
|
||||
|
||||
$array += $permissions_array;
|
||||
return $array;
|
||||
}
|
||||
|
||||
public function transformPredefinedKitsDatatable($kits) {
|
||||
return (new DatatablesTransformer)->transformDatatables($kits);
|
||||
}
|
||||
|
||||
|
||||
}
|
106
app/Models/PredefinedKit.php
Normal file
106
app/Models/PredefinedKit.php
Normal file
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
use App\Http\Traits\UniqueUndeletedTrait;
|
||||
use App\Models\SnipeModel;
|
||||
use App\Models\Traits\Searchable;
|
||||
use App\Presenters\Presentable;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Watson\Validating\ValidatingTrait;
|
||||
|
||||
/**
|
||||
* Model for Categories. Categories are a higher-level group
|
||||
* than Asset Models, and handle things like whether or not
|
||||
* to require acceptance from the user, whether or not to
|
||||
* send a EULA to the user, etc.
|
||||
*
|
||||
* @version v1.0
|
||||
*/
|
||||
class PredefinedKit extends SnipeModel
|
||||
{
|
||||
protected $presenter = 'App\Presenters\PredefinedKitPresenter';
|
||||
use Presentable;
|
||||
protected $table = 'kits';
|
||||
|
||||
/**
|
||||
* Category validation rules
|
||||
*/
|
||||
public $rules = array(
|
||||
'name' => 'required|min:1|max:255|unique'
|
||||
);
|
||||
|
||||
use ValidatingTrait;
|
||||
|
||||
public $modelRules = [
|
||||
'model_id' => 'required|exists:models,id',
|
||||
'quantity' => 'required|integer|min:1',
|
||||
'pivot_id' => 'integer|exists:kits_models,id'
|
||||
];
|
||||
|
||||
public $licenseRules = [
|
||||
'license_id' => 'required|exists:licenses,id',
|
||||
'quantity' => 'required|integer|min:1',
|
||||
'pivot_id' => 'integer|exists:kits_licenses,id'
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name'
|
||||
];
|
||||
|
||||
use Searchable;
|
||||
|
||||
/**
|
||||
* The attributes that should be included when searching the model.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $searchableAttributes = ['name'];
|
||||
|
||||
/**
|
||||
* The relations and their attributes that should be included when searching the model.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $searchableRelations = [];
|
||||
|
||||
|
||||
/**
|
||||
* Establishes the kits -> models relationship
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v2.0]
|
||||
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||
*/
|
||||
public function models()
|
||||
{
|
||||
return $this->belongsToMany('\App\Models\AssetModel', 'kits_models', 'kit_id', 'model_id')->withPivot('id', 'quantity');
|
||||
}
|
||||
|
||||
/**
|
||||
* Establishes the kits -> licenses relationship
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v4.3]
|
||||
* @return \Illuminate\Database\Eloquent\Relations\Relation
|
||||
*/
|
||||
public function licenses()
|
||||
{
|
||||
return $this->belongsToMany('\App\Models\License', 'kits_licenses', 'kit_id', 'license_id')->withPivot('id', 'quantity');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* -----------------------------------------------
|
||||
* BEGIN QUERY SCOPES
|
||||
* -----------------------------------------------
|
||||
**/
|
||||
|
||||
}
|
11
app/Models/SnipeItPivot.php
Normal file
11
app/Models/SnipeItPivot.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||
|
||||
class SnipeItPivot extends Pivot
|
||||
{
|
||||
|
||||
use ValidatingTrait;
|
||||
public $rules = [];
|
||||
}
|
178
app/Presenters/PredefinedKitPresenter.php
Normal file
178
app/Presenters/PredefinedKitPresenter.php
Normal file
|
@ -0,0 +1,178 @@
|
|||
<?php
|
||||
|
||||
namespace App\Presenters;
|
||||
|
||||
use App\Helpers\Helper;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
/**
|
||||
* Class LicensePresenter
|
||||
* @package App\Presenters
|
||||
*/
|
||||
class PredefinedKitPresenter extends Presenter
|
||||
{
|
||||
/**
|
||||
* Json Column Layout for bootstrap table
|
||||
* @return string
|
||||
*/
|
||||
public static function dataTableLayout()
|
||||
{
|
||||
$layout = [
|
||||
[
|
||||
"field" => "id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "name",
|
||||
"searchable" => true,
|
||||
"sortable" => true,
|
||||
"title" => 'Name', // TODO: trans
|
||||
"formatter" => "kitsLinkFormatter"
|
||||
]
|
||||
];
|
||||
|
||||
$layout[] = [
|
||||
"field" => "actions",
|
||||
"searchable" => false,
|
||||
"sortable" => false,
|
||||
"switchable" => false,
|
||||
"title" => trans('table.actions'),
|
||||
"formatter" => "kitsActionsFormatter",
|
||||
];
|
||||
|
||||
|
||||
return json_encode($layout);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Json Column Layout for bootstrap table
|
||||
* @return string
|
||||
*/
|
||||
public static function dataTableModels()
|
||||
{
|
||||
$layout = [
|
||||
[
|
||||
"field" => "id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "pivot_id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "owner_id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "name",
|
||||
"searchable" => true,
|
||||
"sortable" => true,
|
||||
"title" => 'Name', // TODO: trans
|
||||
"formatter" => "modelsLinkFormatter"
|
||||
], [
|
||||
"field" => "quantity",
|
||||
"searchable" => false,
|
||||
"sortable" => false,
|
||||
"title" => 'Quantity', // TODO: trans
|
||||
], [
|
||||
"field" => "actions",
|
||||
"searchable" => false,
|
||||
"sortable" => false,
|
||||
"switchable" => false,
|
||||
"title" => trans('table.actions'),
|
||||
"formatter" => "kits_modelsActionsFormatter",
|
||||
]
|
||||
];
|
||||
|
||||
return json_encode($layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Json Column Layout for bootstrap table
|
||||
* @return string
|
||||
*/
|
||||
public static function dataTableLicenses()
|
||||
{
|
||||
$layout = [
|
||||
[
|
||||
"field" => "id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "pivot_id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "owner_id",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('general.id'),
|
||||
"visible" => false
|
||||
], [
|
||||
"field" => "name",
|
||||
"searchable" => true,
|
||||
"sortable" => true,
|
||||
"title" => 'Name', // TODO: trans
|
||||
"formatter" => "licensesLinkFormatter"
|
||||
], [
|
||||
"field" => "actions",
|
||||
"searchable" => false,
|
||||
"sortable" => false,
|
||||
"switchable" => false,
|
||||
"title" => trans('table.actions'),
|
||||
"formatter" => "kits_licensesActionsFormatter",
|
||||
]
|
||||
];
|
||||
|
||||
return json_encode($layout);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Link to this kit Name
|
||||
* @return string
|
||||
*/
|
||||
public function nameUrl()
|
||||
{
|
||||
return (string)link_to_route('kits.show', $this->name, $this->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Link to this kit Name
|
||||
* @return string
|
||||
*/
|
||||
public function fullName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Url to view this item.
|
||||
* @return string
|
||||
*/
|
||||
public function viewUrl()
|
||||
{
|
||||
return route('kits.show', $this->id);
|
||||
}
|
||||
}
|
10
resources/views/kits/create.blade.php
Normal file
10
resources/views/kits/create.blade.php
Normal file
|
@ -0,0 +1,10 @@
|
|||
@extends('layouts/edit-form', [
|
||||
'createText' => 'Create kit',
|
||||
'updateText' => 'Update kit',
|
||||
'formAction' => ($item) ? route('kits.update', ['kit' => $item->id]) : route('kits.store'),
|
||||
])
|
||||
|
||||
{{-- Page content --}}
|
||||
@section('inputFields')
|
||||
@include ('partials.forms.edit.name', ['translated_name' => 'Name']) {{-- TODO: trans --}}
|
||||
@stop
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
{{-- Page content --}}
|
||||
@section('inputFields')
|
||||
@include ('partials.forms.edit.name')
|
||||
@include ('partials.forms.edit.name', ['translated_name' => 'Name']) {{-- TODO: trans --}}
|
||||
@stop
|
||||
|
||||
@section('content')
|
||||
|
@ -15,13 +15,14 @@
|
|||
<div class="col-md-12">
|
||||
<div class="box box-default">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">Models</h3>
|
||||
{{-- <h3 class="box-title"><span>Models </span><a href="{{ route('modal.kit.model', ['kit' => $item->id]) }}" data-toggle="modal" data-target="#createModal" class="btn btn-sm btn-primary"><i class="fa fa-plus icon-white"></i> Append</a></h3> --}}
|
||||
<h3 class="box-title"><span>Models </span></h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="table-responsive">
|
||||
<table
|
||||
data-cookie-id-table="kitModelsTable"
|
||||
data-columns="{{ \App\Presenters\::modelsDataTableLayout() }}"
|
||||
data-columns="{{ \App\Presenters\PredefinedKitPresenter::dataTableModels() }}"
|
||||
data-pagination="true"
|
||||
data-search="true"
|
||||
data-side-pagination="server"
|
||||
|
@ -32,12 +33,13 @@
|
|||
data-sort-name="name"
|
||||
id="kitModelsTable"
|
||||
class="table table-striped snipe-table"
|
||||
data-url="{{ route('api.kits.models.index') }}"
|
||||
data-url="{{ route('api.kits.models.index', $item->id) }}"
|
||||
data-export-options='{
|
||||
"fileName": "export-kit-models-{{ date('Y-m-d') }}",
|
||||
"ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]
|
||||
}'>
|
||||
</table>
|
||||
<a href="{{ route('modal.kit.model', ['kit' => $item->id]) }}" data-toggle="modal" data-target="#createModal" class="btn btn-primary pull-right"><i class="fa fa-plus icon-white"></i> Append</a>
|
||||
</div>
|
||||
</div> <!--.box-body-->
|
||||
</div> <!-- /.box.box-default-->
|
||||
|
@ -54,7 +56,7 @@
|
|||
|
||||
<table
|
||||
data-cookie-id-table="kitLicensesTable"
|
||||
data-columns="{{ \App\Presenters\::licensesDataTableLayout() }}"
|
||||
data-columns="{{ \App\Presenters\PredefinedKitPresenter::dataTableLicenses() }}"
|
||||
data-pagination="true"
|
||||
data-search="true"
|
||||
data-side-pagination="server"
|
||||
|
@ -65,7 +67,7 @@
|
|||
data-sort-name="name"
|
||||
id="kitLicensesTable"
|
||||
class="table table-striped snipe-table"
|
||||
data-url="{{ route('api.kits.licenses.index') }}"
|
||||
data-url="{{ route('api.kits.licenses.index', $item->id) }}"
|
||||
data-export-options='{
|
||||
"fileName": "export-kit-models-{{ date('Y-m-d') }}",
|
||||
"ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]
|
||||
|
@ -76,4 +78,8 @@
|
|||
</div> <!-- /.box.box-default-->
|
||||
</div> <!-- .col-md-12-->
|
||||
</div>
|
||||
@stop
|
||||
|
||||
@section('moar_scripts')
|
||||
@include ('partials.bootstrap-table')
|
||||
@stop
|
|
@ -21,7 +21,7 @@ Kits
|
|||
|
||||
<table
|
||||
data-cookie-id-table="kitsTable"
|
||||
data-columns="{{ \App\Presenters\::dataTableLayout() }}"
|
||||
data-columns="{{ \App\Presenters\PredefinedKitPresenter::dataTableLayout() }}"
|
||||
data-pagination="true"
|
||||
data-search="true"
|
||||
data-side-pagination="server"
|
||||
|
@ -39,6 +39,28 @@ Kits
|
|||
}'>
|
||||
</table>
|
||||
</div>
|
||||
{{-- <h2>Test</h2>
|
||||
<div class="table-responsive">
|
||||
<table
|
||||
data-cookie-id-table="kitModelsTable"
|
||||
data-columns="{{ \App\Presenters\PredefinedKitPresenter::dataTableModels() }}"
|
||||
data-pagination="true"
|
||||
data-search="true"
|
||||
data-side-pagination="server"
|
||||
data-show-columns="true"
|
||||
data-show-export="true"
|
||||
data-show-refresh="true"
|
||||
data-sort-order="asc"
|
||||
data-sort-name="name"
|
||||
id="kitModelsTable"
|
||||
class="table table-striped snipe-table"
|
||||
data-url="{{ route('api.kits.models.index', 1) }}"
|
||||
data-export-options='{
|
||||
"fileName": "export-kit-models-{{ date('Y-m-d') }}",
|
||||
"ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]
|
||||
}'>
|
||||
</table>
|
||||
</div> --}}
|
||||
</div> <!--.box-body-->
|
||||
</div> <!-- /.box.box-default-->
|
||||
</div> <!-- .col-md-12-->
|
||||
|
|
58
resources/views/kits/model-edit.blade.php
Normal file
58
resources/views/kits/model-edit.blade.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
@extends('layouts/edit-form', [
|
||||
'createText' => 'Append model', // TODO: trans
|
||||
'updateText' => 'Update appended model', // TODO: trans
|
||||
'formAction' => ($item) ? route('kits.models.update', ['kit_id' => $kit->id, 'model_id' => $item->model_id]) : route('kits.models.store', ['kit_id' => $kit->id]),
|
||||
])
|
||||
|
||||
{{-- Page content --}}
|
||||
@section('inputFields')
|
||||
{{-- <div class="form-group {{ $errors->has('name') ? ' has-error' : '' }}">
|
||||
<label for="model_id">{{ trans('general.asset_model') }}:</label>
|
||||
<div class="col-md-8 col-xs-12 required">
|
||||
<select class="js-data-ajax select2" data-endpoint="models" name="model" style="width: 100%" id="model_id" value="{{ Input::old('name', $pivot->model_id) }}" data-validation="required" />
|
||||
{{ Form::select('model_id', [] , Input::old('name', $pivot->model_id), array('class'=>'select2', 'style'=>'width:100%')) }}
|
||||
</div>
|
||||
</div> --}}
|
||||
{{-- At first, I tried to use partials.forms.edit.model-select. But, it required ValidatingTrait (rules method). Pivot class doesn't have it. --}}
|
||||
@include ('partials.forms.edit.model-select', ['translated_name' => trans('admin/hardware/form.model'), 'fieldname' => 'model_id', 'required' => 'true'])
|
||||
{{-- <div id="model_id" class="form-group{{ $errors->has('model_id') ? ' has-error' : '' }}">
|
||||
|
||||
{{ Form::label('model_id', trans('admin/hardware/form.model'), array('class' => 'col-md-3 control-label')) }}
|
||||
|
||||
<div class="col-md-7 required">
|
||||
<select class="js-data-ajax" data-endpoint="models" data-placeholder="{{ trans('general.select_model') }}" name="model_id" style="width: 100%" id="model_select_id" data-validation="required">
|
||||
@if ($model_id = Input::old('model_id', (isset($item)) ? $item->model_id : ''))
|
||||
<option value="{{ $model_id }}" selected="selected">
|
||||
{{ (\App\Models\AssetModel::find($model_id)) ? \App\Models\AssetModel::find($model_id)->name : '' }}
|
||||
</option>
|
||||
@else
|
||||
<option value="">{{ trans('general.select_model') }}</option>
|
||||
@endif
|
||||
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-1 col-sm-1 text-left">
|
||||
@can('create', \App\Models\AssetModel::class)
|
||||
@if ((!isset($hide_new)) || ($hide_new!='true'))
|
||||
<a href='{{ route('modal.model') }}' data-toggle="modal" data-target="#createModal" data-select='model_select_id' class="btn btn-sm btn-default">New</a>
|
||||
<span class="mac_spinner" style="padding-left: 10px; color: green; display:none; width: 30px;"><i class="fa fa-spinner fa-spin"></i> </span>
|
||||
@endif
|
||||
@endcan
|
||||
</div>
|
||||
|
||||
{!! $errors->first('model_id', '<div class="col-md-8 col-md-offset-3"><span class="alert-msg"><i class="fa fa-times"></i> :message</span></div>') !!}
|
||||
</div> --}}
|
||||
<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">
|
||||
<div class="col-md-2" style="padding-left:0px">
|
||||
<input class="form-control" type="text" name="quantity" id="quantity" value="{{ Input::old('quantity', $item->quantity) }}" />
|
||||
</div>
|
||||
{!! $errors->first('quantity', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="pivot_id" value="{{$item->id}}">
|
||||
{{-- <input class="form-control" type="text" name="quantity" id="quantity" value="{{ Input::old('quantity', $item->quantity) }}" /> --}}
|
||||
|
||||
@stop
|
38
resources/views/modals/kit-model.blade.php
Normal file
38
resources/views/modals/kit-model.blade.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
{{-- See snipeit_modals.js for what powers this --}}
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Append model{{-- TODO: trans --}}</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form action="{{ route('api.kits.models.store', ['kit_id' => request('kit')]) }}" onsubmit="return false">
|
||||
{{ csrf_field() }}
|
||||
<div class="alert alert-danger" id="modal_error_msg" style="display:none">
|
||||
</div>
|
||||
|
||||
<div class="dynamic-form-row">
|
||||
<div class="col-md-4 col-xs-12"><label for="modal-model_id">{{ trans('general.asset_model') }}:
|
||||
</label></div>
|
||||
<div class="col-md-8 col-xs-12 required">
|
||||
<select class="js-data-ajax" data-endpoint="models" name="model" style="width: 100%" id="modal-model_id" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dynamic-form-row">
|
||||
<div class="col-md-4 col-xs-12"><label for="modal-quantity_id">Quantity{{-- TODO: trans --}}:
|
||||
</label></div>
|
||||
<div class="col-md-8 col-xs-12 required">
|
||||
<input type='text' name='quantity' id='modal-quantity_id' class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('button.cancel') }}</button>
|
||||
<button type="button" class="btn btn-primary" id="modal-save">{{ trans('general.save') }}</button>
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div><!-- /.modal-dialog -->
|
|
@ -150,22 +150,26 @@
|
|||
}
|
||||
|
||||
// Make the edit/delete buttons
|
||||
function genericActionsFormatter(destination) {
|
||||
function genericActionsFormatter(owner_name, element_name = '') {
|
||||
return function (value,row) {
|
||||
|
||||
var actions = '<nobr>';
|
||||
|
||||
// Add some overrides for any funny urls we have
|
||||
var dest = destination;
|
||||
var dest = owner_name;
|
||||
|
||||
if (destination=='groups') {
|
||||
if (dest =='groups') {
|
||||
var dest = 'admin/groups';
|
||||
}
|
||||
|
||||
if (destination=='maintenances') {
|
||||
if (dest =='maintenances') {
|
||||
var dest = 'hardware/maintenances';
|
||||
}
|
||||
|
||||
if(element_name != '') {
|
||||
dest = dest + '/' + row.owner_id + '/' + element_name;
|
||||
}
|
||||
|
||||
if ((row.available_actions) && (row.available_actions.clone === true)) {
|
||||
actions += '<a href="{{ url('/') }}/' + dest + '/' + row.id + '/clone" class="btn btn-sm btn-info" data-toggle="tooltip" title="Clone"><i class="fa fa-copy"></i></a> ';
|
||||
}
|
||||
|
@ -195,52 +199,6 @@
|
|||
};
|
||||
}
|
||||
|
||||
// This only works for model index pages because it uses the row's model ID
|
||||
function genericChildActionsFormatter(parent, child) {
|
||||
return function (value,row) {
|
||||
|
||||
var actions = '<nobr>';
|
||||
|
||||
// Add some overrides for any funny urls we have
|
||||
var dest = destination;
|
||||
|
||||
if (destination=='groups') {
|
||||
var dest = 'admin/groups';
|
||||
}
|
||||
|
||||
if (destination=='maintenances') {
|
||||
var dest = 'hardware/maintenances';
|
||||
}
|
||||
|
||||
if ((row.available_actions) && (row.available_actions.clone === true)) {
|
||||
actions += '<a href="{{ url('/') }}/' + dest + '/' + row.id + '/clone" class="btn btn-sm btn-info" data-toggle="tooltip" title="Clone"><i class="fa fa-copy"></i></a> ';
|
||||
}
|
||||
|
||||
if ((row.available_actions) && (row.available_actions.update === true)) {
|
||||
actions += '<a href="{{ url('/') }}/' + dest + '/' + row.id + '/edit" class="btn btn-sm btn-warning" data-toggle="tooltip" title="Update"><i class="fa fa-pencil"></i></a> ';
|
||||
}
|
||||
|
||||
if ((row.available_actions) && (row.available_actions.delete === true)) {
|
||||
actions += '<a href="{{ url('/') }}/' + dest + '/' + row.id + '" '
|
||||
+ ' class="btn btn-danger btn-sm delete-asset" data-tooltip="true" '
|
||||
+ ' data-toggle="modal" '
|
||||
+ ' data-content="{{ trans('general.sure_to_delete') }} ' + row.name + '?" '
|
||||
+ ' data-title="{{ trans('general.delete') }}" onClick="return false;">'
|
||||
+ '<i class="fa fa-trash"></i></a> ';
|
||||
} else {
|
||||
actions += '<a class="btn btn-danger btn-sm delete-asset disabled" onClick="return false;"><i class="fa fa-trash"></i></a> ';
|
||||
}
|
||||
|
||||
if ((row.available_actions) && (row.available_actions.restore === true)) {
|
||||
actions += '<a href="{{ url('/') }}/' + dest + '/' + row.id + '/restore" class="btn btn-sm btn-warning" data-toggle="tooltip" title="Restore"><i class="fa fa-retweet"></i></a> ';
|
||||
}
|
||||
|
||||
actions +='</nobr>';
|
||||
return actions;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// This handles the icons and display of polymorphic entries
|
||||
function polymorphicItemFormatter(value) {
|
||||
|
@ -370,10 +328,7 @@
|
|||
'depreciations',
|
||||
'fieldsets',
|
||||
'groups',
|
||||
'kits',
|
||||
// METODO: проверить, что эти пути работают
|
||||
'kits.models',
|
||||
'kits.licenses',
|
||||
'kits'
|
||||
];
|
||||
|
||||
for (var i in formatters) {
|
||||
|
@ -383,15 +338,15 @@
|
|||
window[formatters[i] + 'InOutFormatter'] = genericCheckinCheckoutFormatter(formatters[i]);
|
||||
}
|
||||
|
||||
var childFormatters = [
|
||||
var child_formatters = [
|
||||
['kits', 'models'],
|
||||
['kits', 'licenses'],
|
||||
];
|
||||
|
||||
for (var i in childFormatters) {
|
||||
var parentName = childFormatters[i][0];
|
||||
var childName = childFormatters[i][2];
|
||||
window[childFormatters[i][0] + 'ChildsActionsFormatter'] = genericChildActionsFormatter(childFormatters[i][0], childFormatters[i][1]);
|
||||
for (var i in child_formatters) {
|
||||
var owner_name = child_formatters[i][0];
|
||||
var child_name = child_formatters[i][1];
|
||||
window[owner_name + '_' + child_name + 'ActionsFormatter'] = genericActionsFormatter(owner_name, child_name);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -87,6 +87,8 @@ Route::group(['middleware' => 'auth','prefix' => 'modals'], function () {
|
|||
Route::get('statuslabel',['as' => 'modal.statuslabel','uses' => 'ModalController@statuslabel']);
|
||||
Route::get('supplier',['as' => 'modal.supplier','uses' => 'ModalController@supplier']);
|
||||
Route::get('user',['as' => 'modal.user','uses' => 'ModalController@user']);
|
||||
Route::get('kit-model',['as' => 'modal.kit.model','uses' => 'ModalController@kitModel']);
|
||||
Route::get('kit-license',['as' => 'modal.kit.license','uses' => 'ModalController@kitLicense']);
|
||||
});
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
// Predefined Kit Management
|
||||
Route::resource('kit', 'Kits\PredefinedKitController', [
|
||||
Route::resource('kits', 'Kits\PredefinedKitsController', [
|
||||
'middleware' => ['auth'],
|
||||
'parameters' => ['kit' => 'kit_id']
|
||||
]);
|
||||
|
@ -10,12 +10,12 @@ Route::resource('kit', 'Kits\PredefinedKitController', [
|
|||
|
||||
Route::group([ 'prefix' => 'kits/{kit_id}', 'middleware' => ['auth'] ], function () {
|
||||
|
||||
Route::get('licenses',
|
||||
[
|
||||
'as' => 'kits.licenses.index',
|
||||
'uses' => 'Kits\PredefinedKitsController@indexLicenses',
|
||||
]
|
||||
);
|
||||
// Route::get('licenses',
|
||||
// [
|
||||
// 'as' => 'kits.licenses.index',
|
||||
// 'uses' => 'Kits\PredefinedKitsController@indexLicenses',
|
||||
// ]
|
||||
// );
|
||||
|
||||
Route::post('licenses',
|
||||
[
|
||||
|
@ -33,18 +33,18 @@ Route::group([ 'prefix' => 'kits/{kit_id}', 'middleware' => ['auth'] ], function
|
|||
|
||||
Route::delete('licenses/{license_id}',
|
||||
[
|
||||
'as' => 'kits.licenses.destroy',
|
||||
'uses' => 'Kits\PredefinedKitsController@destroyLicense',
|
||||
'as' => 'kits.licenses.detach',
|
||||
'uses' => 'Kits\PredefinedKitsController@detachLicense',
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
Route::get('models',
|
||||
[
|
||||
'as' => 'kits.models.index',
|
||||
'uses' => 'Kits\PredefinedKitsController@indexModels',
|
||||
]
|
||||
);
|
||||
// Route::get('models',
|
||||
// [
|
||||
// 'as' => 'kits.models.index',
|
||||
// 'uses' => 'Kits\PredefinedKitsController@indexModels',
|
||||
// ]
|
||||
// );
|
||||
|
||||
Route::post('models',
|
||||
[
|
||||
|
@ -59,11 +59,18 @@ Route::group([ 'prefix' => 'kits/{kit_id}', 'middleware' => ['auth'] ], function
|
|||
'uses' => 'Kits\PredefinedKitsController@updateModel',
|
||||
]
|
||||
);
|
||||
|
||||
Route::get('models/{model_id}/edit',
|
||||
[
|
||||
'as' => 'kits.models.edit',
|
||||
'uses' => 'Kits\PredefinedKitsController@editModel',
|
||||
]
|
||||
);
|
||||
|
||||
Route::delete('models/{model_id}',
|
||||
[
|
||||
'as' => 'kits.models.destroy',
|
||||
'uses' => 'Kits\PredefinedKitsController@destroyModel',
|
||||
'as' => 'kits.models.detach',
|
||||
'uses' => 'Kits\PredefinedKitsController@detachModel',
|
||||
]
|
||||
);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue