diff --git a/.all-contributorsrc b/.all-contributorsrc index 5a0a631176..b7a9b304a3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -800,6 +800,15 @@ "contributions": [ "code" ] + }, + { + "login": "techincolor", + "name": "Danielle", + "avatar_url": "https://avatars1.githubusercontent.com/u/14809698?v=4", + "profile": "https://github.com/techincolor", + "contributions": [ + "doc" + ] } ] } diff --git a/.env.example b/.env.example index 51f9e3e5b2..b497b854b0 100644 --- a/.env.example +++ b/.env.example @@ -12,7 +12,7 @@ APP_LOCALE=en # REQUIRED: DATABASE SETTINGS # -------------------------------------------- DB_CONNECTION=mysql -DB_HOST=localhost +DB_HOST=127.0.0.1 DB_DATABASE=null DB_USERNAME=null DB_PASSWORD=null diff --git a/.gitignore b/.gitignore index d158248e1d..437be0ca0d 100755 --- a/.gitignore +++ b/.gitignore @@ -28,8 +28,15 @@ public/uploads/logo.svg public/uploads/models/* public/uploads/suppliers/* public/uploads/accessories/* +public/uploads/locations/* +public/uploads/manufacturers/* +public/uploads/components/* +public/uploads/consumables/* +public/uploads/companies/* +public/uploads/categories/* public/uploads/users/* storage/app/private_uploads/users/* +public/uploads/departments/* storage/debugbar/ storage/dumps/* storage/laravel-backups diff --git a/README.md b/README.md index 4a5172016c..51b913d31f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Build Status](https://travis-ci.org/snipe/snipe-it.svg?branch=develop)](https://travis-ci.org/snipe/snipe-it) [![Stories in Ready](https://badge.waffle.io/snipe/snipe-it.png?label=ready+for+dev&title=Ready+for+development)](http://waffle.io/snipe/snipe-it) [![Maintenance](https://img.shields.io/maintenance/yes/2017.svg)]() [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeyhead.svg?style=social)](https://twitter.com/snipeyhead) [![Zenhub](https://img.shields.io/badge/Shipping_faster_with-ZenHub-5e60ba.svg)](https://zenhub.io) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade) -[![All Contributors](https://img.shields.io/badge/all_contributors-86-orange.svg?style=flat-square)](#contributors) +[![All Contributors](https://img.shields.io/badge/all_contributors-87-orange.svg?style=flat-square)](#contributors) ## Snipe-IT - Open Source Asset Management System @@ -68,7 +68,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken | [
Gil Rutkowski](http://FlashingCursor.com)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=flashingcursor "Code") | [
Desmond Morris](http://www.desmondmorris.com)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=desmondmorris "Code") | [
Nick Peelman](http://peelman.us)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=peelman "Code") | [
Abraham Vegh](https://abrahamvegh.com)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=abrahamvegh "Code") | [
Mohamed Rashid](https://github.com/rashivkp)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=rashivkp "Documentation") | [
Kasey](http://hinchk.github.io)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=HinchK "Code") | [
Brett](https://github.com/BrettFagerlund)
[⚠️](https://github.com/snipe/snipe-it/commits?author=BrettFagerlund "Tests") | | [
Jason Spriggs](http://jasonspriggs.com)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=jasonspriggs "Code") | [
Nate Felton](http://n8felton.wordpress.com)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=n8felton "Code") | [
Manasses Ferreira](http://homepages.dcc.ufmg.br/~manassesferreira)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=manassesferreira "Code") | [
Steve](https://github.com/steveelwood)
[⚠️](https://github.com/snipe/snipe-it/commits?author=steveelwood "Tests") | [
matc](http://twitter.com/matc)
[⚠️](https://github.com/snipe/snipe-it/commits?author=matc "Tests") | [
Cole R. Davis](http://www.davisracingteam.com)
[⚠️](https://github.com/snipe/snipe-it/commits?author=VanillaNinjaD "Tests") | [
gibsonjoshua55](https://github.com/gibsonjoshua55)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=gibsonjoshua55 "Code") | | [
Robin Temme](https://github.com/zwerch)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=zwerch "Code") | [
Iman](https://github.com/imanghafoori1)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=imanghafoori1 "Code") | [
Richard Hofman](https://github.com/richardhofman6)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=richardhofman6 "Code") | [
gizzmojr](https://github.com/gizzmojr)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=gizzmojr "Code") | [
Jenny Li](https://github.com/imjennyli)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=imjennyli "Documentation") | [
Geoff Young](https://github.com/GeoffYoung)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=GeoffYoung "Code") | [
Elliot Blackburn](http://www.elliotblackburn.com)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=BlueHatbRit "Documentation") | -| [
TΓ΅nis Ormisson](http://andmemasin.eu)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [
Nicolai Essig](http://www.nicolai-essig.de)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | +| [
TΓ΅nis Ormisson](http://andmemasin.eu)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=TonisOrmisson "Code") | [
Nicolai Essig](http://www.nicolai-essig.de)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=thakilla "Code") | [
Danielle](https://github.com/techincolor)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! diff --git a/app/Http/Controllers/AccessoriesController.php b/app/Http/Controllers/AccessoriesController.php index 10d28b1012..dde84fce6b 100755 --- a/app/Http/Controllers/AccessoriesController.php +++ b/app/Http/Controllers/AccessoriesController.php @@ -54,14 +54,9 @@ class AccessoriesController extends Controller public function create(Request $request) { $this->authorize('create', Accessory::class); - // Show the page - return view('accessories/edit') - ->with('item', new Accessory) - ->with('category_list', Helper::categoryList('accessory')) - ->with('company_list', Helper::companyList()) - ->with('supplier_list', Helper::suppliersList()) - ->with('location_list', Helper::locationsList()) - ->with('manufacturer_list', Helper::manufacturerList()); + $category_type = 'accessory'; + return view('accessories/edit')->with('category_type', $category_type) + ->with('item', new Accessory); } @@ -130,19 +125,15 @@ class AccessoriesController extends Controller */ public function edit(Request $request, $accessoryId = null) { - // Check if the accessory exists - if (is_null($item = Accessory::find($accessoryId))) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); + + if ($item = Accessory::find($accessoryId)) { + $this->authorize($item); + $category_type = 'accessory'; + return view('accessories/edit', compact('item'))->with('category_type', $category_type); } - $this->authorize($item); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); - return view('accessories/edit', compact('item')) - ->with('category_list', Helper::categoryList('accessory')) - ->with('company_list', Helper::companyList()) - ->with('location_list', Helper::locationsList()) - ->with('supplier_list', Helper::suppliersList()) - ->with('manufacturer_list', Helper::manufacturerList()); } @@ -271,7 +262,7 @@ class AccessoriesController extends Controller $this->authorize('checkout', $accessory); // Get the dropdown of users and then pass it to the checkout view - return view('accessories/checkout', compact('accessory'))->with('users_list', Helper::usersList()); + return view('accessories/checkout', compact('accessory')); } @@ -296,7 +287,7 @@ class AccessoriesController extends Controller $this->authorize('checkout', $accessory); if (!$user = User::find(Input::get('assigned_to'))) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.not_found')); + return redirect()->route('checkout/accessory', $accessory->id)->with('error', trans('admin/accessories/message.checkout.user_does_not_exist')); } // Update the accessory data @@ -323,6 +314,7 @@ class AccessoriesController extends Controller $data['note'] = $logaction->note; $data['require_acceptance'] = $accessory->requireAcceptance(); // TODO: Port this to new mail notifications + if ((($accessory->requireAcceptance()=='1') || ($accessory->getEula())) && ($user->email!='')) { Mail::send('emails.accept-accessory', $data, function ($m) use ($user) { diff --git a/app/Http/Controllers/Api/AccessoriesController.php b/app/Http/Controllers/Api/AccessoriesController.php index aaa5140095..3a1857b9a6 100644 --- a/app/Http/Controllers/Api/AccessoriesController.php +++ b/app/Http/Controllers/Api/AccessoriesController.php @@ -100,8 +100,6 @@ class AccessoriesController extends Controller { $this->authorize('view', Accessory::class); $accessory = Accessory::findOrFail($id); - $accessory_users = $accessory->users; - return (new AccessoriesTransformer)->transformAccessory($accessory); } diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php index d4b66041a3..8b81947d2a 100644 --- a/app/Http/Controllers/Api/AssetModelsController.php +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -8,6 +8,7 @@ use App\Helpers\Helper; use Illuminate\Http\Request; use App\Http\Transformers\AssetModelsTransformer; use App\Http\Transformers\AssetsTransformer; +use App\Http\Transformers\SelectlistTransformer; /** @@ -158,8 +159,51 @@ class AssetModelsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.assoc_users'))); } + if ($assetmodel->image) { + try { + unlink(public_path().'/uploads/models/'.$assetmodel->image); + } catch (\Exception $e) { + \Log::error($e); + } + } + $assetmodel->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/assetmodels/message.delete.success'))); } + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', AssetModel::class); + + $assetmodels = AssetModel::select([ + 'models.id', + 'models.name', + 'models.image', + 'models.model_number', + ]); + + + if ($request->has('search')) { + $assetmodels = $assetmodels->where('models.name', 'LIKE', '%'.$request->get('search').'%') + ->orWhere('models.model_number', 'LIKE', '%'.$request->get('search').'%'); + } + $assetmodels = $assetmodels->paginate(50); + + foreach ($assetmodels as $assetmodel) { + $assetmodel->use_text = $assetmodel->present()->modelName; + $assetmodel->use_image = ($assetmodel->image) ? url('/').'/uploads/models/'.$assetmodel->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($assetmodels); + } + } diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 180a51f7ae..b88bac9df1 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -30,6 +30,7 @@ use Str; use TCPDF; use Validator; use View; +use App\Http\Transformers\SelectlistTransformer; /** @@ -69,7 +70,8 @@ class AssetsController extends Controller 'created_at', 'updated_at', 'purchase_date', - 'purchase_cost' + 'purchase_cost', + 'warranty_months', ]; $filter = array(); @@ -84,7 +86,7 @@ class AssetsController extends Controller } $assets = Company::scopeCompanyables(Asset::select('assets.*'))->with( - 'assetloc', 'assetstatus', 'defaultLoc', 'assetlog', 'company', + 'location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo', 'model.category', 'model.manufacturer', 'model.fieldset','supplier'); @@ -255,12 +257,54 @@ class AssetsController extends Controller */ public function show($id) { - if ($asset = Asset::withTrashed()->find($id)) { + if ($asset = Asset::with('assetstatus')->with('assignedTo')->withTrashed()->findOrFail($id)) { $this->authorize('view', $asset); return (new AssetsTransformer)->transformAsset($asset); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + } + + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Asset::class); + + $assets = Company::scopeCompanyables(Asset::select([ + 'assets.id', + 'assets.name', + 'assets.asset_tag', + 'assets.model_id', + ]))->with('model')->RTD(); + + + if ($request->has('search')) { + $assets = $assets->where('assets.name', 'LIKE', '%'.$request->get('search').'%') + ->orWhere('assets.asset_tag', 'LIKE', '%'.$request->get('search').'%') + ->join('models AS assets_models',function ($join) use ($request) { + $join->on('assets_models.id', "=", "assets.model_id"); + })->orWhere('assets_models.name','LIKE','%'.$request->get('search').'%'); + } + + $assets = $assets->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($assets as $asset) { + $asset->use_text = $asset->present()->fullName; + $asset->use_image = ($asset->getImageUrl()) ? $asset->getImageUrl() : null; + } + + return (new SelectlistTransformer)->transformSelectlist($assets); + } @@ -305,12 +349,12 @@ class AssetsController extends Controller $model = AssetModel::find($request->get('model_id')); if ($model->fieldset) { foreach ($model->fieldset->fields as $field) { - $asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug())); + $asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug(), null)); } } if ($asset->save()) { - $asset->logCreate(); + if ($request->get('assigned_user')) { $target = User::find(request('assigned_user')); } elseif ($request->get('assigned_asset')) { @@ -481,11 +525,23 @@ class AssetsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', $error_payload, 'No valid checkout target specified for asset '.e($asset->asset_tag).'.')); } + + $checkout_at = request('checkout_at', date("Y-m-d H:i:s")); $expected_checkin = request('expected_checkin', null); $note = request('note', null); $asset_name = request('name', null); + // Set the location ID to the RTD location id if there is one + if ($asset->rtd_location_id!='') { + $asset->location_id = $target->rtd_location_id; + } + + // Overwrite that if the target has a location ID though + if ($target->location_id!='') { + $asset->location_id = $target->location_id; + } + if ($asset->checkOut($target, Auth::user(), $checkout_at, $expected_checkin, $note, $asset_name)) { return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.success'))); diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index 58f6dd0a14..f94e786f00 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use App\Helpers\Helper; use App\Models\Category; use App\Http\Transformers\CategoriesTransformer; +use App\Http\Transformers\SelectlistTransformer; class CategoriesController extends Controller { @@ -20,9 +21,9 @@ class CategoriesController extends Controller public function index(Request $request) { $this->authorize('view', Category::class); - $allowed_columns = ['id', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count']; + $allowed_columns = ['id', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count', 'image']; - $categories = Category::select(['id', 'created_at', 'updated_at', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email']) + $categories = Category::select(['id', 'created_at', 'updated_at', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email','image']) ->withCount('assets', 'accessories', 'consumables', 'components'); if ($request->has('search')) { @@ -128,4 +129,41 @@ class CategoriesController extends Controller return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success'))); } + + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request, $category_type = 'asset') + { + $this->authorize('view', Categories::class); + + $categories = Category::select([ + 'id', + 'name', + 'image', + ]); + + if ($request->has('search')) { + $categories = $categories->where('name', 'LIKE', '%'.$request->get('search').'%'); + } + + $categories = $categories->where('category_type', $category_type)->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($categories as $category) { + $category->use_image = ($category->image) ? url('/').'/uploads/categories/'.$category->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($categories); + + } + } diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index f2a5d36ed9..3a21e80290 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Helpers\Helper; use App\Models\Company; +use App\Http\Transformers\SelectlistTransformer; class CompaniesController extends Controller { @@ -141,4 +142,38 @@ class CompaniesController extends Controller } } + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Company::class); + + $companies = Company::select([ + 'companies.id', + 'companies.name', + 'companies.image', + ]); + + if ($request->has('search')) { + $companies = $companies->where('companies.name', 'LIKE', '%'.$request->get('search').'%'); + } + + $companies = $companies->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($companies as $company) { + $company->use_image = ($company->image) ? url('/').'/uploads/companies/'.$company->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($companies); + } } diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index 48e4d05ca3..4e7a3c4ed7 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -34,7 +34,7 @@ class ComponentsController extends Controller $offset = request('offset', 0); $limit = request('limit', 50); - $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','company','category','qty','location']; + $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','company','category','qty','location','image']; $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index 793de92140..e817c2b07f 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -43,7 +43,7 @@ class ConsumablesController extends Controller $offset = request('offset', 0); $limit = request('limit', 50); - $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location','qty']; + $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location','qty','image']; $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php index 38976d2840..43100f8faa 100644 --- a/app/Http/Controllers/Api/CustomFieldsController.php +++ b/app/Http/Controllers/Api/CustomFieldsController.php @@ -57,15 +57,15 @@ class CustomFieldsController extends Controller */ public function destroy($field_id) { - $field = CustomField::find($field_id); + $field = CustomField::findOrFail($field_id); if ($field->fieldset->count() >0) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Field is in use.')); - } else { - $field->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); - } + + $field->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); + } } diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php index 8119c735ef..a899708ee7 100644 --- a/app/Http/Controllers/Api/DepartmentsController.php +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -8,6 +8,7 @@ use App\Models\Department; use App\Http\Transformers\DepartmentsTransformer; use App\Helpers\Helper; use Auth; +use App\Http\Transformers\SelectlistTransformer; class DepartmentsController extends Controller { @@ -21,7 +22,7 @@ class DepartmentsController extends Controller public function index(Request $request) { $this->authorize('view', Department::class); - $allowed_columns = ['id','name']; + $allowed_columns = ['id','name','image']; $departments = Department::select([ 'id', @@ -30,7 +31,8 @@ class DepartmentsController extends Controller 'company_id', 'manager_id', 'created_at', - 'updated_at' + 'updated_at', + 'image' ])->with('users')->with('location')->with('manager')->with('company')->withCount('users'); if ($request->has('search')) { @@ -110,4 +112,39 @@ class DepartmentsController extends Controller } + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Department::class); + + $departments = Department::select([ + 'id', + 'name', + 'image', + ]); + + if ($request->has('search')) { + $departments = $departments->where('name', 'LIKE', '%'.$request->get('search').'%'); + } + + $departments = $departments->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($departments as $department) { + $department->use_image = ($department->image) ? url('/').'/uploads/departments/'.$department->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($departments); + + } + } diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php index 06d06d936b..163f1cd7ad 100644 --- a/app/Http/Controllers/Api/LocationsController.php +++ b/app/Http/Controllers/Api/LocationsController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use App\Helpers\Helper; use App\Models\Location; use App\Http\Transformers\LocationsTransformer; +use App\Http\Transformers\SelectlistTransformer; class LocationsController extends Controller { @@ -20,8 +21,10 @@ class LocationsController extends Controller public function index(Request $request) { $this->authorize('view', Location::class); - $allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at', - 'updated_at','parent_id', 'manager_id']; + $allowed_columns = [ + 'id','name','address','address2','city','state','country','zip','created_at', + 'updated_at','parent_id', 'manager_id','image', + 'rtd_assets_count','users_count','assets_count']; $locations = Location::with('parent', 'manager', 'childLocations')->select([ 'locations.id', @@ -36,9 +39,9 @@ class LocationsController extends Controller 'locations.manager_id', 'locations.created_at', 'locations.updated_at', + 'locations.image', 'locations.currency' - ])->withCount('locationAssets') - ->withCount('assignedAssets') + ])->withCount('rtd_assets') ->withCount('assets') ->withCount('users'); @@ -138,4 +141,41 @@ class LocationsController extends Controller $location->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success'))); } + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Location::class); + + $locations = Location::select([ + 'locations.id', + 'locations.name', + 'locations.image', + ]); + + if ($request->has('search')) { + $locations = $locations->where('locations.name', 'LIKE', '%'.$request->get('search').'%'); + } + + $locations = $locations->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($locations as $location) { + $location->use_text = $location->name; + $location->use_image = ($location->image) ? url('/').'/uploads/locations/'.$location->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($locations); + + } + } diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index 3840bc3634..21c99810a1 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -8,6 +8,7 @@ use App\Helpers\Helper; use App\Models\Manufacturer; use App\Http\Transformers\DatatablesTransformer; use App\Http\Transformers\ManufacturersTransformer; +use App\Http\Transformers\SelectlistTransformer; class ManufacturersController extends Controller { @@ -21,10 +22,10 @@ class ManufacturersController extends Controller public function index(Request $request) { $this->authorize('view', Manufacturer::class); - $allowed_columns = ['id','name','url','support_url','support_email','support_phone','created_at','updated_at']; + $allowed_columns = ['id','name','url','support_url','support_email','support_phone','created_at','updated_at','image']; $manufacturers = Manufacturer::select( - array('id','name','url','support_url','support_email','support_phone','created_at','updated_at') + array('id','name','url','support_url','support_email','support_phone','created_at','updated_at','image') )->withCount('assets')->withCount('licenses')->withCount('consumables')->withCount('accessories'); @@ -120,4 +121,40 @@ class ManufacturersController extends Controller return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success'))); } + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Manufacturers::class); + + $manufacturers = Manufacturer::select([ + 'id', + 'name', + 'image', + ]); + + if ($request->has('search')) { + $manufacturers = $manufacturers->where('name', 'LIKE', '%'.$request->get('search').'%'); + } + + $manufacturers = $manufacturers->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($manufacturers as $manufacturer) { + $manufacturer->use_text = $manufacturer->name; + $manufacturer->use_image = ($manufacturer->image) ? url('/').'/uploads/manufacturers/'.$manufacturer->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($manufacturers); + + } } diff --git a/app/Http/Controllers/Api/SettingsController.php b/app/Http/Controllers/Api/SettingsController.php index 820dc7216b..8500b182c9 100644 --- a/app/Http/Controllers/Api/SettingsController.php +++ b/app/Http/Controllers/Api/SettingsController.php @@ -11,73 +11,8 @@ use Mail; class SettingsController extends Controller { - /** - * Display a listing of the resource. - * - * @author [A. Gianotto] [] - * @since [v4.0] - * - * @return \Illuminate\Http\Response - */ - public function index() - { - // - } - /** - * Store a newly created resource in storage. - * - * @author [A. Gianotto] [] - * @since [v4.0] - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @author [A. Gianotto] [] - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - - /** - * Update the specified resource in storage. - * - * @author [A. Gianotto] [] - * @since [v4.0] - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * - * @author [A. Gianotto] [] - * @since [v4.0] - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy($id) - { - // - } - public function ldaptest() { diff --git a/app/Http/Controllers/Api/SuppliersController.php b/app/Http/Controllers/Api/SuppliersController.php index 063f82438b..672858a5a8 100644 --- a/app/Http/Controllers/Api/SuppliersController.php +++ b/app/Http/Controllers/Api/SuppliersController.php @@ -7,6 +7,8 @@ use App\Http\Controllers\Controller; use App\Helpers\Helper; use App\Models\Supplier; use App\Http\Transformers\SuppliersTransformer; +use App\Http\Transformers\SelectlistTransformer; + class SuppliersController extends Controller { @@ -23,7 +25,7 @@ class SuppliersController extends Controller $allowed_columns = ['id','name','address','phone','contact','fax','email','image','assets_count','licenses_count', 'accessories_count']; $suppliers = Supplier::select( - array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at') + array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at','image') )->withCount('assets')->withCount('licenses')->withCount('accessories')->whereNull('deleted_at'); @@ -133,4 +135,41 @@ class SuppliersController extends Controller return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/suppliers/message.delete.success'))); } + + /** + * Gets a paginated collection for the select2 menus + * + * @author [A. Gianotto] [] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer + * + */ + public function selectlist(Request $request) + { + $this->authorize('view', Supplier::class); + + $suppliers = Supplier::select([ + 'id', + 'name', + 'image', + ]); + + if ($request->has('search')) { + $suppliers = $suppliers->where('locations.name', 'LIKE', '%'.$request->get('search').'%'); + } + + $suppliers = $suppliers->orderBy('name', 'ASC')->paginate(50); + + // Loop through and set some custom properties for the transformer to use. + // This lets us have more flexibility in special cases like assets, where + // they may not have a ->name value but we want to display something anyway + foreach ($suppliers as $supplier) { + $supplier->use_text = $supplier->name; + $supplier->use_image = ($supplier->image) ? url('/').'/uploads/suppliers/'.$supplier->image : null; + } + + return (new SelectlistTransformer)->transformSelectlist($suppliers); + + } + } diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 98807c5363..37dc05cacd 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -11,6 +11,7 @@ use App\Helpers\Helper; use App\Http\Requests\SaveUserRequest; use App\Models\Asset; use App\Http\Transformers\AssetsTransformer; +use App\Http\Transformers\SelectlistTransformer; class UsersController extends Controller { @@ -33,6 +34,11 @@ class UsersController extends Controller 'users.jobtitle', 'users.email', 'users.phone', + 'users.address', + 'users.city', + 'users.state', + 'users.country', + 'users.zip', 'users.username', 'users.location_id', 'users.manager_id', @@ -47,7 +53,7 @@ class UsersController extends Controller 'users.activated', 'users.avatar', - ])->with('manager', 'groups', 'userloc', 'company', 'department','throttle','assets','licenses','accessories','consumables') + ])->with('manager', 'groups', 'location', 'company', 'department','throttle','assets','licenses','accessories','consumables') ->withCount('assets','licenses','accessories','consumables'); $users = Company::scopeCompanyables($users); @@ -97,7 +103,8 @@ class UsersController extends Controller 'last_name','first_name','email','jobtitle','username','employee_num', 'assets','accessories', 'consumables','licenses','groups','activated','created_at', 'two_factor_enrolled','two_factor_optin','last_login', 'assets_count', 'licenses_count', - 'consumables_count', 'accessories_count', 'phone' + 'consumables_count', 'accessories_count', 'phone', 'address', 'city', 'state', + 'country', 'zip' ]; $sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name'; @@ -111,12 +118,12 @@ class UsersController extends Controller /** - * Display a listing of the resource. + * Gets a paginated collection for the select2 menus * * @author [A. Gianotto] [] - * @since [v4.0] + * @since [v4.0.16] + * @see \App\Http\Transformers\SelectlistTransformer * - * @return \Illuminate\Http\Response */ public function selectlist(Request $request) { @@ -137,15 +144,14 @@ class UsersController extends Controller $users = Company::scopeCompanyables($users); if ($request->has('search')) { - $users = $users->where('first_name', '=', '%'.$request->get('search').'%') + $users = $users->where('first_name', 'LIKE', '%'.$request->get('search').'%') ->orWhere('last_name', 'LIKE', '%'.$request->get('search').'%') ->orWhere('username', 'LIKE', '%'.$request->get('search').'%') - ->orWhere('employee_num', '=', '%'.$request->get('search').'%'); + ->orWhere('employee_num', 'LIKE', '%'.$request->get('search').'%'); } - $users = $users->orderBy('last_name', 'asc'); + $users = $users->orderBy('last_name', 'asc')->orderBy('first_name', 'asc'); $users = $users->paginate(50); - $users_array = []; foreach ($users as $user) { $name_str = ''; @@ -158,26 +164,12 @@ class UsersController extends Controller $name_str .= ' (#'.e($user->employee_num).')'; } - $users_array[] = - [ - 'id' => $user->id, - 'text' => $name_str, - 'image' => ($user->present()->gravatar) ? $user->present()->gravatar : null, - ]; + $user->use_text = $name_str; + $user->use_image = ($user->present()->gravatar) ? $user->present()->gravatar : null; } - $results = [ - 'items' => $users_array, - 'pagination' => - [ - 'more' => ($users->currentPage() >= $users->lastPage()) ? false : true, - 'per_page' => $users->perPage() - ], - 'total_count' => $users->total(), - 'page' => $users->currentPage(), - 'page_count' => $users->lastPage() - ]; - return $results; + return (new SelectlistTransformer)->transformSelectlist($users); + } @@ -237,6 +229,9 @@ class UsersController extends Controller $user->password = bcrypt($request->input('password')); } + // Update the location of any assets checked out to this user + Asset::where('assigned_type', User::class) + ->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]); if ($user->save()) { return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.update'))); @@ -283,6 +278,5 @@ class UsersController extends Controller $this->authorize('view', User::class); $assets = Asset::where('assigned_to', '=', $id)->with('model')->get(); return (new AssetsTransformer)->transformAssets($assets, $assets->count()); - // return response()->json($assets); } } diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index 8ac1539553..f7041f38e5 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -115,8 +115,8 @@ class AssetMaintenancesController extends Controller ); } - if (($maintenance->cost) && (isset($maintenance->asset)) && ($maintenance->asset->assetloc) && ($maintenance->asset->assetloc->currency!='')) { - $maintenance_cost = $maintenance->asset->assetloc->currency.$maintenance->cost; + if (($maintenance->cost) && (isset($maintenance->asset)) && ($maintenance->asset->location) && ($maintenance->asset->location->currency!='')) { + $maintenance_cost = $maintenance->asset->location->currency.$maintenance->cost; } else { $maintenance_cost = $settings->default_currency.$maintenance->cost; } diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index a7fdd51310..cad33d7793 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -35,7 +35,6 @@ class AssetModelsController extends Controller * the content for the accessories listing, which is generated in getDatatable. * * @author [A. Gianotto] [] - * @see AssetModelsController::getDatatable() method that generates the JSON response * @since [v1.0] * @return View */ @@ -53,11 +52,9 @@ class AssetModelsController extends Controller */ public function create() { - // Show the page - return view('models/edit') - ->with('category_list', Helper::categoryList('asset')) + $category_type = 'asset'; + return view('models/edit')->with('category_type',$category_type) ->with('depreciation_list', Helper::depreciationList()) - ->with('manufacturer_list', Helper::manufacturerList()) ->with('item', new AssetModel); } @@ -93,7 +90,7 @@ class AssetModelsController extends Controller if (Input::file('image')) { $image = Input::file('image'); - $file_name = str_random(25) . "." . $image->getClientOriginalExtension(); + $file_name = slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); $path = public_path('uploads/models/'); if ($image->getClientOriginalExtension()!='svg') { @@ -165,17 +162,15 @@ class AssetModelsController extends Controller */ public function edit($modelId = null) { - // Check if the model exists - if (is_null($item = AssetModel::find($modelId))) { - // Redirect to the model management page - return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); + if ($item = AssetModel::find($modelId)) { + $category_type = 'asset'; + $view = View::make('models/edit', compact('item','category_type')); + $view->with('depreciation_list', Helper::depreciationList()); + return $view; } - $view = View::make('models/edit', compact('item')); - $view->with('category_list', Helper::categoryList('asset')); - $view->with('depreciation_list', Helper::depreciationList()); - $view->with('manufacturer_list', Helper::manufacturerList()); - return $view; + return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); + } @@ -213,9 +208,17 @@ class AssetModelsController extends Controller } if (Input::file('image')) { + $image = Input::file('image'); - $file_name = str_random(25) . "." . $image->getClientOriginalExtension(); + $file_name = str_slug($image->getClientOriginalName()) . "." . $image->getClientOriginalExtension(); $path = public_path('uploads/models/'); + $old_image = $path.$model->image; + + try { + unlink($old_image); + } catch (\Exception $e) { + \Log::error($e); + } if ($image->getClientOriginalExtension()!='svg') { Image::make($image->getRealPath())->resize(500, null, function ($constraint) { @@ -259,6 +262,15 @@ class AssetModelsController extends Controller // Throw an error that this model is associated with assets return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users')); } + + if ($model->image) { + try { + unlink(public_path().'/uploads/models/'.$model->image); + } catch (\Exception $e) { + \Log::error($e); + } + } + // Delete the model $model->delete(); diff --git a/app/Http/Controllers/AssetsController.php b/app/Http/Controllers/AssetsController.php index 01fc3d55c2..debaf11855 100755 --- a/app/Http/Controllers/AssetsController.php +++ b/app/Http/Controllers/AssetsController.php @@ -110,17 +110,12 @@ class AssetsController extends Controller $this->authorize('create', Asset::class); $view = View::make('hardware/edit') ->with('supplier_list', Helper::suppliersList()) - ->with('company_list', Helper::companyList()) ->with('model_list', Helper::modelList()) ->with('statuslabel_list', Helper::statusLabelList()) - ->with('location_list', Helper::locationsList()) ->with('item', new Asset) ->with('manufacturer', Helper::manufacturerList()) //handled in modal now? ->with('category', Helper::categoryList('asset')) //handled in modal now? - ->with('statuslabel_types', Helper::statusTypeList()) //handled in modal now? - ->with('users_list', Helper::usersList()) - ->with('assets_list', Helper::assetsList()) - ->with('locations_list', Helper::locationsList()); + ->with('statuslabel_types', Helper::statusTypeList()); if ($request->has('model_id')) { $selected_model = AssetModel::find($request->input('model_id')); @@ -139,17 +134,18 @@ class AssetsController extends Controller public function store(AssetRequest $request) { $this->authorize(Asset::class); - // create a new model instance - $asset = new Asset(); - $asset->model()->associate(AssetModel::find(e(Input::get('model_id')))); - $asset->name = Input::get('name'); - $asset->serial = Input::get('serial'); - $asset->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $asset->model_id = Input::get('model_id'); - $asset->order_number = Input::get('order_number'); - $asset->notes = Input::get('notes'); - $asset->asset_tag = Input::get('asset_tag'); + + $asset = new Asset(); + $asset->model()->associate(AssetModel::find($request->input('model_id'))); + + $asset->name = $request->input('name'); + $asset->serial = $request->input('serial'); + $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $asset->model_id = $request->input('model_id'); + $asset->order_number = $request->input('order_number'); + $asset->notes = $request->input('notes'); + $asset->asset_tag = $request->input('asset_tag'); $asset->user_id = Auth::id(); $asset->archived = '0'; $asset->physical = '1'; @@ -164,8 +160,8 @@ class AssetsController extends Controller $asset->rtd_location_id = request('rtd_location_id', null); // Create the image (if one was chosen.) - if (Input::has('image')) { - $image = Input::get('image'); + if ($request->has('image')) { + $image = $request->input('image'); // After modification, the image is prefixed by mime info like the following: // data:image/jpeg;base64,; This causes the image library to be unhappy, so we need to remove it. @@ -259,14 +255,8 @@ class AssetsController extends Controller return view('hardware/edit', compact('item')) ->with('model_list', Helper::modelList()) - ->with('supplier_list', Helper::suppliersList()) - ->with('company_list', Helper::companyList()) - ->with('locations_list', Helper::locationsList()) ->with('statuslabel_list', Helper::statusLabelList()) - ->with('assigned_to', Helper::usersList()) - ->with('manufacturer', Helper::manufacturerList()) - ->with('statuslabel_types', Helper::statusTypeList()) - ->with('category', Helper::categoryList('asset')); + ->with('statuslabel_types', Helper::statusTypeList()); } @@ -404,9 +394,8 @@ class AssetsController extends Controller $logaction->item_id = $asset->id; $logaction->created_at = date("Y-m-d H:i:s"); $logaction->user_id = Auth::user()->id; - $log = $logaction->logaction('deleted'); + $logaction->logaction('deleted'); - // Redirect to the asset management page return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); } @@ -430,10 +419,7 @@ class AssetsController extends Controller $this->authorize('checkout', $asset); // Get the dropdown of users and then pass it to the checkout view - return view('hardware/checkout', compact('asset')) - ->with('users_list', Helper::usersList()) - ->with('assets_list', Helper::detailedAssetList()) - ->with('locations_list', Helper::locationsList()); + return view('hardware/checkout', compact('asset')); } /** @@ -476,6 +462,17 @@ class AssetsController extends Controller } else { $expected_checkin = ''; } + + // Set the location ID to the RTD location id if there is one + if ($asset->rtd_location_id!='') { + $asset->location_id = $target->rtd_location_id; + } + + // Overwrite that if the target has a location ID though + if ($target->location_id!='') { + $asset->location_id = $target->location_id; + } + if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), Input::get('name'))) { // Redirect to the new asset page return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkout.success')); @@ -547,6 +544,11 @@ class AssetsController extends Controller if (Input::has('status_id')) { $asset->status_id = e(Input::get('status_id')); } + + if (Input::has('location_id')) { + $asset->location_id = e(Input::get('location_id')); + } + // Was the asset updated? if ($asset->save()) { $logaction = $asset->logCheckin($target, e(request('note'))); @@ -595,15 +597,17 @@ class AssetsController extends Controller $asset = Asset::withTrashed()->find($assetId); $this->authorize('view', $asset); $settings = Setting::getSettings(); - $audit_log = Actionlog::where('action_type', '=', 'audit') - ->where('item_id', '=', $assetId) - ->where('item_type', '=', Asset::class) - ->orderBy('created_at', 'DESC')->first(); + if (isset($asset)) { - if (!is_null($asset->assetloc)) { - $use_currency = $asset->assetloc->currency; + $audit_log = Actionlog::where('action_type', '=', 'audit') + ->where('item_id', '=', $assetId) + ->where('item_type', '=', Asset::class) + ->orderBy('created_at', 'DESC')->first(); + + if ($asset->location) { + $use_currency = $asset->location->currency; } else { if ($settings->default_currency!='') { $use_currency = $settings->default_currency; @@ -621,7 +625,7 @@ class AssetsController extends Controller ->with('use_currency', $use_currency)->with('audit_log', $audit_log); } - return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist', compact('id'))); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } /** @@ -712,18 +716,9 @@ class AssetsController extends Controller $asset->assigned_to = ''; return view('hardware/edit') - ->with('supplier_list', Helper::suppliersList()) - ->with('model_list', Helper::modelList()) ->with('statuslabel_list', Helper::statusLabelList()) ->with('statuslabel_types', Helper::statusTypeList()) - ->with('assigned_to', Helper::usersList()) - ->with('item', $asset) - ->with('locations_list', Helper::locationsList()) - ->with('manufacturer', Helper::manufacturerList()) - ->with('category', Helper::categoryList('asset')) - ->with('users_list', Helper::usersList()) - ->with('assets_list', Helper::assetsList()) - ->with('company_list', Helper::companyList()); + ->with('item', $asset); } /** @@ -915,27 +910,23 @@ class AssetsController extends Controller if (!$asset = Asset::find($assetId)) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } + $this->authorize('update', $asset); $destinationPath = config('app.private_uploads').'/assets'; - if (Input::hasFile('assetfile')) { - foreach (Input::file('assetfile') as $file) { + if ($request->hasFile('image')) { + foreach ($request->file('image') as $file) { $extension = $file->getClientOriginalExtension(); $filename = 'hardware-'.$asset->id.'-'.str_random(8); $filename .= '-'.str_slug($file->getClientOriginalName()).'.'.$extension; - $upload_success = $file->move($destinationPath, $filename); - //Log the deletion of seats to the log + $file->move($destinationPath, $filename); $asset->logUpload($filename, e(Input::get('notes'))); } - } else { - return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles')); - } - - if ($upload_success) { return redirect()->back()->with('success', trans('admin/hardware/message.upload.success')); } - return redirect()->back()->with('error', trans('admin/hardware/message.upload.error')); + + return redirect()->back()->with('error', trans('admin/hardware/message.upload.nofiles')); } /** @@ -965,11 +956,9 @@ class AssetsController extends Controller $log->delete(); return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success')); } - // Prepare the error message - $error = trans('admin/hardware/message.does_not_exist', compact('id')); // Redirect to the hardware management page - return redirect()->route('hardware.index')->with('error', $error); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } /** @@ -1017,8 +1006,6 @@ class AssetsController extends Controller { $this->authorize('update', Asset::class); - - if (!$request->has('ids')) { return redirect()->back()->with('error', 'No assets selected'); } @@ -1035,10 +1022,9 @@ class AssetsController extends Controller return view('hardware/labels') ->with('assets', Asset::find($asset_ids)) ->with('settings', Setting::getSettings()) - ->with('count', $count) - ->with('settings', Setting::getSettings()); + ->with('count', $count); } elseif ($request->input('bulk_actions')=='delete') { - $assets = Asset::with('assignedTo', 'assetloc')->find($asset_ids); + $assets = Asset::with('assignedTo', 'location')->find($asset_ids); $assets->each(function ($asset) { $this->authorize('delete', $asset); }); @@ -1047,10 +1033,7 @@ class AssetsController extends Controller } elseif ($request->input('bulk_actions')=='edit') { return view('hardware/bulk') ->with('assets', request('ids')) - ->with('supplier_list', Helper::suppliersList()) ->with('statuslabel_list', Helper::statusLabelList()) - ->with('location_list', Helper::locationsList()) - ->with('models_list', Helper::modelList()) ->with( 'companies_list', array('' => '') + array('clear' => trans('general.remove_company')) + Helper::companyList() @@ -1167,10 +1150,9 @@ class AssetsController extends Controller { $this->authorize('checkout', Asset::class); // Filter out assets that are not deployable. - $assets_list = Company::scopeCompanyables(Asset::RTD()->get(), 'assets.company_id')->pluck('detailed_name', 'id')->toArray(); + return view('hardware/bulk-checkout') - ->with('users_list', Helper::usersList()) - ->with('assets_list', $assets_list); + ->with('users_list', Helper::usersList()); } public function postBulkCheckout(Request $request) @@ -1222,21 +1204,21 @@ class AssetsController extends Controller } - public function quickScan(Request $request) + public function quickScan() { $this->authorize('audit', Asset::class); $dt = Carbon::now()->addMonths(12)->toDateString(); - return view('hardware/quickscan')->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList()); + return view('hardware/quickscan')->with('next_audit_date', $dt); } - public function audit(Request $request, $id) + public function audit($id) { $this->authorize('audit', Asset::class); $dt = Carbon::now()->addMonths(12)->toDateString(); $asset = Asset::findOrFail($id); - return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list', Helper::locationsList()); + return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list'); } public function auditStore(Request $request, $id) diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index b502050e6a..f1ccb10668 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -15,6 +15,8 @@ use Lang; use Redirect; use Str; use View; +use Image; +use App\Http\Requests\ImageUploadRequest; /** * This class controls all actions related to Categories for @@ -67,7 +69,7 @@ class CategoriesController extends Controller * @since [v1.0] * @return \Illuminate\Http\RedirectResponse */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { // create a new model instance $category = new Category(); @@ -80,6 +82,18 @@ class CategoriesController extends Controller $category->checkin_email = $request->input('checkin_email', '0'); $category->user_id = Auth::id(); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/categories/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $category->image = $file_name; + } + + if ($category->save()) { return redirect()->route('categories.index')->with('success', trans('admin/categories/message.create.success')); } @@ -118,7 +132,7 @@ class CategoriesController extends Controller * @return \Illuminate\Http\RedirectResponse * @since [v1.0] */ - public function update(Request $request, $categoryId = null) + public function update(ImageUploadRequest $request, $categoryId = null) { // Check if the blog post exists if (is_null($category = Category::find($categoryId))) { @@ -136,6 +150,20 @@ class CategoriesController extends Controller $category->require_acceptance = $request->input('require_acceptance', '0'); $category->checkin_email = $request->input('checkin_email', '0'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/categories/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $category->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $category->image = null; + } + + if ($category->save()) { // Redirect to the new category page return redirect()->route('categories.index')->with('success', trans('admin/categories/message.update.success')); diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 8ef76a9333..c6dbea0fad 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -7,6 +7,8 @@ use Lang; use Redirect; use View; use Illuminate\Http\Request; +use Image; +use App\Http\Requests\ImageUploadRequest; /** * This controller handles all actions related to Companies for @@ -50,11 +52,22 @@ final class CompaniesController extends Controller * @param Request $request * @return \Illuminate\Http\RedirectResponse */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $company = new Company; $company->name = $request->input('name'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/companies/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $company->image = $file_name; + } + if ($company->save()) { return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.create.success')); @@ -89,7 +102,7 @@ final class CompaniesController extends Controller * @param int $companyId * @return \Illuminate\Http\RedirectResponse */ - public function update(Request $request, $companyId) + public function update(ImageUploadRequest $request, $companyId) { if (is_null($company = Company::find($companyId))) { return redirect()->route('companies.index')->with('error', trans('admin/companies/message.does_not_exist')); @@ -97,6 +110,20 @@ final class CompaniesController extends Controller $company->name = $request->input('name'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/companies/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $company->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $company->image = null; + } + + if ($company->save()) { return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.update.success')); diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php index c0636379d7..01574ea794 100644 --- a/app/Http/Controllers/ComponentsController.php +++ b/app/Http/Controllers/ComponentsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; use App\Helpers\Helper; +use App\Http\Requests\ImageUploadRequest; use App\Models\Company; use App\Models\Component; use App\Models\CustomField; @@ -21,6 +22,7 @@ use View; use Validator; use Illuminate\Http\Request; use Gate; +use Image; /** * This class controls all actions related to Components for @@ -57,12 +59,9 @@ class ComponentsController extends Controller public function create() { $this->authorize('create', Component::class); - // Show the page - return view('components/edit') - ->with('item', new Component) - ->with('category_list', Helper::categoryList('component')) - ->with('company_list', Helper::companyList()) - ->with('location_list', Helper::locationsList()); + $category_type = 'component'; + return view('components/edit')->with('category_type',$category_type) + ->with('item', new Component); } @@ -74,7 +73,7 @@ class ComponentsController extends Controller * @since [v3.0] * @return \Illuminate\Http\RedirectResponse */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Component::class); $component = new Component(); @@ -90,6 +89,18 @@ class ComponentsController extends Controller $component->qty = $request->input('qty'); $component->user_id = Auth::id(); + + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/components/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $component->image = $file_name; + } + if ($component->save()) { return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); } @@ -107,16 +118,18 @@ class ComponentsController extends Controller */ public function edit($componentId = null) { - if (is_null($item = Component::find($componentId))) { - return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + + + if ($item = Component::find($componentId)) { + $this->authorize('update', $item); + $category_type = 'component'; + return view('components/edit', compact('item'))->with('category_type', $category_type); } + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); + + - $this->authorize('update', $item); - return view('components/edit', compact('item')) - ->with('category_list', Helper::categoryList('component')) - ->with('company_list', Helper::companyList()) - ->with('location_list', Helper::locationsList()); } @@ -129,7 +142,7 @@ class ComponentsController extends Controller * @since [v3.0] * @return \Illuminate\Http\RedirectResponse */ - public function update($componentId = null) + public function update(ImageUploadRequest $request, $componentId = null) { if (is_null($component = Component::find($componentId))) { return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); @@ -150,6 +163,19 @@ class ComponentsController extends Controller $component->purchase_cost = request('purchase_cost'); $component->qty = Input::get('qty'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/components/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $component->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $component->image = null; + } + if ($component->save()) { return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); } @@ -228,7 +254,7 @@ class ComponentsController extends Controller return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } $this->authorize('checkout', $component); - return view('components/checkout', compact('component'))->with('assets_list', Helper::detailedAssetList()); + return view('components/checkout', compact('component')); } /** diff --git a/app/Http/Controllers/ConsumablesController.php b/app/Http/Controllers/ConsumablesController.php index eb61431258..b67f41f235 100644 --- a/app/Http/Controllers/ConsumablesController.php +++ b/app/Http/Controllers/ConsumablesController.php @@ -19,6 +19,8 @@ use Slack; use Str; use View; use Gate; +use Image; +use App\Http\Requests\ImageUploadRequest; /** * This controller handles all actions related to Consumables for @@ -54,13 +56,9 @@ class ConsumablesController extends Controller public function create() { $this->authorize('create', Consumable::class); - // Show the page - return view('consumables/edit') - ->with('item', new Consumable) - ->with('category_list', Helper::categoryList('consumable')) - ->with('company_list', Helper::companyList()) - ->with('location_list', Helper::locationsList()) - ->with('manufacturer_list', Helper::manufacturerList()); + $category_type = 'consumable'; + return view('consumables/edit')->with('category_type', $category_type) + ->with('item', new Consumable); } @@ -72,24 +70,36 @@ class ConsumablesController extends Controller * @since [v1.0] * @return \Illuminate\Http\RedirectResponse */ - public function store() + public function store(ImageUploadRequest $request) { $this->authorize('create', Consumable::class); $consumable = new Consumable(); - $consumable->name = Input::get('name'); - $consumable->category_id = Input::get('category_id'); - $consumable->location_id = Input::get('location_id'); - $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $consumable->order_number = Input::get('order_number'); - $consumable->min_amt = Input::get('min_amt'); - $consumable->manufacturer_id = Input::get('manufacturer_id'); - $consumable->model_number = Input::get('model_number'); - $consumable->item_no = Input::get('item_no'); - $consumable->purchase_date = Input::get('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); - $consumable->qty = Input::get('qty'); + $consumable->name = $request->input('name'); + $consumable->category_id = $request->input('category_id'); + $consumable->location_id = $request->input('location_id'); + $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $consumable->order_number = $request->input('order_number'); + $consumable->min_amt = $request->input('min_amt'); + $consumable->manufacturer_id = $request->input('manufacturer_id'); + $consumable->model_number = $request->input('model_number'); + $consumable->item_no = $request->input('item_no'); + $consumable->purchase_date = $request->input('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat($request->input('purchase_cost')); + $consumable->qty = $request->input('qty'); $consumable->user_id = Auth::id(); + + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/consumables/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $consumable->image = $file_name; + } + if ($consumable->save()) { return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.create.success')); } @@ -109,17 +119,14 @@ class ConsumablesController extends Controller */ public function edit($consumableId = null) { - if (is_null($item = Consumable::find($consumableId))) { - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); + if ($item = Consumable::find($consumableId)) { + $this->authorize($item); + $category_type = 'consumable'; + return view('consumables/edit', compact('item'))->with('category_type', $category_type); } - $this->authorize($item); + return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - return view('consumables/edit', compact('item')) - ->with('category_list', Helper::categoryList('consumable')) - ->with('company_list', Helper::companyList()) - ->with('location_list', Helper::locationsList()) - ->with('manufacturer_list', Helper::manufacturerList()); } @@ -132,7 +139,7 @@ class ConsumablesController extends Controller * @since [v1.0] * @return \Illuminate\Http\RedirectResponse */ - public function update($consumableId = null) + public function update(ImageUploadRequest $request, $consumableId = null) { if (is_null($consumable = Consumable::find($consumableId))) { return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); @@ -140,19 +147,32 @@ class ConsumablesController extends Controller $this->authorize($consumable); - $consumable->name = Input::get('name'); - $consumable->category_id = Input::get('category_id'); - $consumable->location_id = Input::get('location_id'); - $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); - $consumable->order_number = Input::get('order_number'); - $consumable->min_amt = Input::get('min_amt'); - $consumable->manufacturer_id = Input::get('manufacturer_id'); - $consumable->model_number = Input::get('model_number'); - $consumable->item_no = Input::get('item_no'); - $consumable->purchase_date = Input::get('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); + $consumable->name = $request->input('name'); + $consumable->category_id = $request->input('category_id'); + $consumable->location_id = $request->input('location_id'); + $consumable->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $consumable->order_number = $request->input('order_number'); + $consumable->min_amt = $request->input('min_amt'); + $consumable->manufacturer_id = $request->input('manufacturer_id'); + $consumable->model_number = $request->input('model_number'); + $consumable->item_no = $request->input('item_no'); + $consumable->purchase_date = $request->input('purchase_date'); + $consumable->purchase_cost = Helper::ParseFloat(Input::get('purchase_cost')); $consumable->qty = Helper::ParseFloat(Input::get('qty')); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/consumables/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $consumable->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $consumable->image = null; + } + if ($consumable->save()) { return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); } @@ -212,7 +232,7 @@ class ConsumablesController extends Controller return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); } $this->authorize('checkout', $consumable); - return view('consumables/checkout', compact('consumable'))->with('users_list', Helper::usersList()); + return view('consumables/checkout', compact('consumable')); } /** @@ -238,7 +258,7 @@ class ConsumablesController extends Controller // Check if the user exists if (is_null($user = User::find($assigned_to))) { // Redirect to the consumable management page with error - return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.user_does_not_exist')); + return redirect()->route('checkout/consumable', $consumable)->with('error', trans('admin/consumables/message.checkout.user_does_not_exist')); } // Update the consumable data @@ -259,7 +279,7 @@ class ConsumablesController extends Controller $data['note'] = $logaction->note; $data['require_acceptance'] = $consumable->requireAcceptance(); - if (($consumable->requireAcceptance()=='1') || ($consumable->getEula())) { + if ((($consumable->requireAcceptance()=='1') || ($consumable->getEula())) && $user->email!='') { Mail::send('emails.accept-asset', $data, function ($m) use ($user) { $m->to($user->email, $user->first_name . ' ' . $user->last_name); diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index a78e2cecf0..5b3452793c 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -6,6 +6,8 @@ use Illuminate\Http\Request; use App\Models\Department; use App\Helpers\Helper; use Auth; +use Image; +use App\Http\Requests\ImageUploadRequest; class DepartmentsController extends Controller { @@ -43,7 +45,7 @@ class DepartmentsController extends Controller * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Department::class); $department = new Department; @@ -51,6 +53,17 @@ class DepartmentsController extends Controller $department->user_id = Auth::user()->id; $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/departments/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $department->image = $file_name; + } + if ($department->save()) { return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success')); } @@ -87,10 +100,7 @@ class DepartmentsController extends Controller */ public function create() { - return view('departments/edit')->with('item', new Department) - ->with('manager_list', Helper::managerList()) - ->with('location_list', Helper::locationsList()) - ->with('company_list', Helper::companyList()); + return view('departments/edit')->with('item', new Department); } @@ -131,10 +141,7 @@ class DepartmentsController extends Controller if (is_null($item = Department::find($id))) { return redirect()->back()->with('error', trans('admin/locations/message.does_not_exist')); } - return view('departments/edit', compact('item')) - ->with('manager_list', Helper::managerList()) - ->with('location_list', Helper::locationsList()) - ->with('company_list', Helper::companyList()); + return view('departments/edit', compact('item')); } public function update(Request $request, $id) { @@ -145,6 +152,20 @@ class DepartmentsController extends Controller } $department->fill($request->all()); + + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/departments/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $department->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $department->image = null; + } + $department->manager_id = ($request->has('manager_id' ) ? $request->input('manager_id') : null); if ($department->save()) { diff --git a/app/Http/Controllers/LicensesController.php b/app/Http/Controllers/LicensesController.php index 2d0dcf5a4a..3d4366adbc 100755 --- a/app/Http/Controllers/LicensesController.php +++ b/app/Http/Controllers/LicensesController.php @@ -67,10 +67,7 @@ class LicensesController extends Controller return view('licenses/edit') //->with('license_options',$license_options) ->with('depreciation_list', Helper::depreciationList()) - ->with('supplier_list', Helper::suppliersList()) ->with('maintained_list', $maintained_list) - ->with('company_list', Helper::companyList()) - ->with('manufacturer_list', Helper::manufacturerList()) ->with('item', new License); } @@ -144,10 +141,7 @@ class LicensesController extends Controller return view('licenses/edit', compact('item')) ->with('depreciation_list', Helper::depreciationList()) - ->with('supplier_list', Helper::suppliersList()) - ->with('company_list', Helper::companyList()) - ->with('maintained_list', $maintained_list) - ->with('manufacturer_list', Helper::manufacturerList()); + ->with('maintained_list', $maintained_list); } @@ -254,9 +248,7 @@ class LicensesController extends Controller } $this->authorize('checkout', $licenseSeat); - return view('licenses/checkout', compact('licenseSeat')) - ->with('users_list', Helper::usersList()) - ->with('asset_list', Helper::detailedAssetList()); + return view('licenses/checkout', compact('licenseSeat')); } @@ -472,11 +464,8 @@ class LicensesController extends Controller // Show the page return view('licenses/edit') ->with('depreciation_list', Helper::depreciationList()) - ->with('supplier_list', Helper::suppliersList()) ->with('item', $license) - ->with('maintained_list', $maintained_list) - ->with('company_list', Helper::companyList()) - ->with('manufacturer_list', Helper::manufacturerList()); + ->with('maintained_list', $maintained_list); } diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index ffe480c63f..340965866b 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -16,6 +16,8 @@ use Validator; use View; use Auth; use Symfony\Component\HttpFoundation\JsonResponse; +use Image; +use App\Http\Requests\ImageUploadRequest; /** * This controller handles all actions related to Locations for @@ -63,8 +65,7 @@ class LocationsController extends Controller return view('locations/edit') ->with('location_options', $location_options) - ->with('item', new Location) - ->with('manager_list', Helper::managerList()); + ->with('item', new Location); } @@ -77,22 +78,33 @@ class LocationsController extends Controller * @since [v1.0] * @return \Illuminate\Http\RedirectResponse */ - public function store() + public function store(ImageUploadRequest $request) { $location = new Location(); - $location->name = Input::get('name'); - $location->parent_id = Input::get('parent_id', null); - $location->currency = Input::get('currency', '$'); - $location->address = Input::get('address'); - $location->address2 = Input::get('address2'); - $location->city = Input::get('city'); - $location->state = Input::get('state'); - $location->country = Input::get('country'); - $location->zip = Input::get('zip'); - $location->ldap_ou = Input::get('ldap_ou'); - $location->manager_id = Input::get('manager_id'); + $location->name = $request->input('name'); + $location->parent_id = $request->input('parent_id', null); + $location->currency = $request->input('currency', '$'); + $location->address = $request->input('address'); + $location->address2 = $request->input('address2'); + $location->city = $request->input('city'); + $location->state = $request->input('state'); + $location->country = $request->input('country'); + $location->zip = $request->input('zip'); + $location->ldap_ou = $request->input('ldap_ou'); + $location->manager_id = $request->input('manager_id'); $location->user_id = Auth::id(); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/locations/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $location->image = $file_name; + } + if ($location->save()) { return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); } @@ -108,7 +120,7 @@ class LocationsController extends Controller * @since [v1.0] * @return String JSON */ - public function apiStore() + public function apiStore(Request $request) { $new['currency']=Setting::first()->default_currency; @@ -116,13 +128,13 @@ class LocationsController extends Controller $location = new Location(); // Save the location data - $location->name = Input::get('name'); + $location->name = $request->input('name'); $location->currency = Setting::first()->default_currency; //e(Input::get('currency')); $location->address = ''; //e(Input::get('address')); // $location->address2 = e(Input::get('address2')); - $location->city = Input::get('city'); + $location->city = $request->input('city'); $location->state = '';//e(Input::get('state')); - $location->country = Input::get('country'); + $location->country = $request->input('country'); // $location->zip = e(Input::get('zip')); $location->user_id = Auth::id(); @@ -172,7 +184,7 @@ class LocationsController extends Controller * @since [v1.0] * @return \Illuminate\Http\RedirectResponse */ - public function update($locationId = null) + public function update(ImageUploadRequest $request, $locationId = null) { // Check if the location exists if (is_null($location = Location::find($locationId))) { @@ -180,24 +192,35 @@ class LocationsController extends Controller } // Update the location data - $location->name = Input::get('name'); - $location->parent_id = Input::get('parent_id', null); - $location->currency = Input::get('currency', '$'); - $location->address = Input::get('address'); - $location->address2 = Input::get('address2'); - $location->city = Input::get('city'); - $location->state = Input::get('state'); - $location->country = Input::get('country'); - $location->zip = Input::get('zip'); - $location->ldap_ou = Input::get('ldap_ou'); - $location->manager_id = Input::get('manager_id'); + $location->name = $request->input('name'); + $location->parent_id = $request->input('parent_id', null); + $location->currency = $request->input('currency', '$'); + $location->address = $request->input('address'); + $location->address2 = $request->input('address2'); + $location->city = $request->input('city'); + $location->state = $request->input('state'); + $location->country = $request->input('country'); + $location->zip = $request->input('zip'); + $location->ldap_ou = $request->input('ldap_ou'); + $location->manager_id = $request->input('manager_id'); + + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/locations/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $location->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $location->image = null; + } + - // Was the location updated? if ($location->save()) { - // Redirect to the saved location page return redirect()->route("locations.index")->with('success', trans('admin/locations/message.update.success')); } - // Redirect to the location management page return redirect()->back()->withInput()->withInput()->withErrors($location->getErrors()); } @@ -211,20 +234,22 @@ class LocationsController extends Controller */ public function destroy($locationId) { - // Check if the location exists if (is_null($location = Location::find($locationId))) { - // Redirect to the blogs management page return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.not_found')); } if ($location->users->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_users')); + } elseif ($location->childLocations->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_child_loc')); + } elseif ($location->assets->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); + } elseif ($location->assignedassets->count() > 0) { return redirect()->to(route('locations.index'))->with('error', trans('admin/locations/message.assoc_assets')); + } else { $location->delete(); return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); @@ -248,11 +273,8 @@ class LocationsController extends Controller if (isset($location->id)) { return view('locations/view', compact('location')); } - // Prepare the error message - $error = trans('admin/locations/message.does_not_exist', compact('id')); - // Redirect to the user management page - return redirect()->route('locations.index')->with('error', $error); + return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist', compact('id'))); } } diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 1f20d5ccfc..5d058f501d 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; use App\Helpers\Helper; +use App\Http\Requests\ImageUploadRequest; use App\Models\CustomField; use App\Models\Manufacturer; use Auth; @@ -13,6 +14,7 @@ use Redirect; use Str; use View; use Illuminate\Http\Request; +use Image; /** * This controller handles all actions related to Manufacturers for @@ -60,7 +62,7 @@ class ManufacturersController extends Controller * @param Request $request * @return \Illuminate\Http\RedirectResponse */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $manufacturer = new Manufacturer; @@ -72,6 +74,18 @@ class ManufacturersController extends Controller $manufacturer->support_email = $request->input('support_email'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_slug($image->getClientOriginalName()).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/manufacturers/'.$file_name); + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $manufacturer->image = $file_name; + } + + if ($manufacturer->save()) { return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.create.success')); @@ -124,6 +138,29 @@ class ManufacturersController extends Controller $manufacturer->support_phone = $request->input('support_phone'); $manufacturer->support_email = $request->input('support_email'); + if ($request->file('image')) { + $image = $request->file('image'); + $file_name = str_slug($image->getClientOriginalName()).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/manufacturers/'.$file_name); + $old_image = $path.$model->image; + + try { + unlink($old_image); + } catch (\Exception $e) { + \Log::error($e); + } + + + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $manufacturer->image = $file_name; + } elseif ($request->input('image_delete')=='1') { + $manufacturer->image = null; + } + + if ($manufacturer->save()) { return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.update.success')); } @@ -150,6 +187,16 @@ class ManufacturersController extends Controller // Redirect to the asset management page return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.assoc_users')); } + + if ($manufacturer->image) { + try { + unlink(public_path().'/uploads/manufacturers/'.$manufacturer->image); + } catch (\Exception $e) { + \Log::error($e); + } + } + + // Delete the manufacturer $manufacturer->delete(); // Redirect to the manufacturers management page @@ -158,11 +205,10 @@ class ManufacturersController extends Controller /** * Returns a view that invokes the ajax tables which actually contains - * the content for the manufacturers detail listing, which is generated in getDatatable. + * the content for the manufacturers detail listing, which is generated via API. * This data contains a listing of all assets that belong to that manufacturer. * * @author [A. Gianotto] [] - * @see ManufacturersController::getDataView() * @param int $manufacturerId * @since [v1.0] * @return \Illuminate\Contracts\View\View @@ -174,43 +220,13 @@ class ManufacturersController extends Controller if (isset($manufacturer->id)) { return view('manufacturers/view', compact('manufacturer')); } - // Prepare the error message - $error = trans('admin/manufacturers/message.does_not_exist', compact('id')); + + $error = trans('admin/manufacturers/message.does_not_exist'); // Redirect to the user management page - return redirect()->route('manufacturers')->with('error', $error); + return redirect()->route('manufacturers.index')->with('error', $error); } - /** - * Generates the JSON used to display the manufacturer detail. - * This JSON returns data on all of the assets with the specified - * manufacturer ID number. - * - * @author [A. Gianotto] [] - * @see ManufacturersController::getView() - * @param int $manufacturerId - * @param string $itemType - * @param Request $request - * @return String JSON* @since [v1.0] - */ - public function getDataView($manufacturerId, $itemType = null, Request $request) - { - $manufacturer = Manufacturer::find($manufacturerId); - - switch ($itemType) { - case "assets": - return $this->getDataAssetsView($manufacturer, $request); - case "licenses": - return $this->getDataLicensesView($manufacturer, $request); - case "accessories": - return $this->getDataAccessoriesView($manufacturer, $request); - case "consumables": - return $this->getDataConsumablesView($manufacturer, $request); - } - - return "We shouldn't be here"; - - } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 431542c4ef..97d605425f 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -30,8 +30,7 @@ class ProfileController extends Controller public function getIndex() { $user = Auth::user(); - $location_list = Helper::locationsList(); - return view('account/profile', compact('user'))->with('location_list', $location_list); + return view('account/profile', compact('user')); } /** @@ -144,10 +143,11 @@ class ProfileController extends Controller } /** - * Returns a page with the API token generation interface. + * Save the menu state of open/closed when the user clicks on the hamburger + * menu. * - * We created a controller method for this because closures aren't allowed - * in the routes file if you want to be able to cache the routes. + * This URL is triggered via jquery in + * resources/views/layouts/default.blade.php * * @author [A. Gianotto] [] * @since [v4.0] diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index c3740c8c43..d9d2c1aa45 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -114,7 +114,7 @@ class ReportsController extends Controller // Open output stream $handle = fopen('php://output', 'w'); - $assets = Asset::with('assignedTo', 'assetLoc','defaultLoc','assignedTo','model','supplier','assetstatus','model.manufacturer'); + $assets = Asset::with('assignedTo', 'location','defaultLoc','assignedTo','model','supplier','assetstatus','model.manufacturer'); // This is used by the sidenav, mostly switch ($request->input('status')) { @@ -182,7 +182,7 @@ class ReportsController extends Controller ($asset->supplier) ? e($asset->supplier->name) : '', ($asset->assignedTo) ? e($asset->assignedTo->present()->name()) : '', ($asset->last_checkout!='') ? e($asset->last_checkout) : '', - ($asset->assetLoc) ? e($asset->assetLoc->present()->name()) : '', + ($asset->location) ? e($asset->location->present()->name()) : '', ($asset->notes) ? e($asset->notes) : '', ]; foreach ($customfields as $field) { @@ -215,7 +215,7 @@ class ReportsController extends Controller { // Grab all the assets - $assets = Asset::with( 'assignedTo', 'assetstatus', 'defaultLoc', 'assetloc', 'assetlog', 'company', 'model.category', 'model.depreciation') + $assets = Asset::with( 'assignedTo', 'assetstatus', 'defaultLoc', 'location', 'assetlog', 'company', 'model.category', 'model.depreciation') ->orderBy('created_at', 'DESC')->get(); return view('reports/depreciation', compact('assets')); @@ -270,7 +270,7 @@ class ReportsController extends Controller $row[] = ''; // Empty string if unassigned } - if (( $asset->assigned_to > 0 ) && ( $location = $asset->assetLoc )) { + if (( $asset->assigned_to > 0 ) && ( $location = $asset->location )) { if ($location->city) { $row[] = e($location->city) . ', ' . e($location->state); } elseif ($location->name) { @@ -282,8 +282,8 @@ class ReportsController extends Controller $row[] = ''; // Empty string if location is not set } - if ($asset->assetloc) { - $currency = e($asset->assetloc->currency); + if ($asset->location) { + $currency = e($asset->location->currency); } else { $currency = e(Setting::first()->default_currency); } @@ -562,8 +562,8 @@ class ReportsController extends Controller } if (e(Input::get('location')) == '1') { - if($asset->assetLoc) { - $show_loc = $asset->assetLoc->present()->name(); + if($asset->location) { + $show_loc = $asset->location->present()->name(); } else { $show_loc = 'Default location '.$asset->rtd_location_id.' is invalid'; } diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index 0b075d6e79..bd5c34360a 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -32,18 +32,17 @@ class StatuslabelsController extends Controller public function index() { - return view('statuslabels/index', compact('statuslabels')); + return view('statuslabels.index', compact('statuslabels')); } public function show($id) { - $statuslabel = Statuslabel::find($id); - if (isset($statuslabel->id)) { - return view('statuslabels/view', compact('statuslabel')); + if ($statuslabel = Statuslabel::find($id)) { + return view('statuslabels.view')->with('statuslabel', $statuslabel); } - return redirect()->route('statuslabels.index')->with('error', trans('admin/locations/message.does_not_exist', compact('id'))); + return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist', compact('id'))); } diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index 6e579180c2..8d6c4926c2 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -77,19 +77,18 @@ class SuppliersController extends Controller $supplier->url = $supplier->addhttp(request('url')); $supplier->user_id = Auth::id(); - if (Input::file('image')) { + if ($request->file('image')) { $image = $request->file('image'); $file_name = str_random(25).".".$image->getClientOriginalExtension(); $path = public_path('uploads/suppliers/'.$file_name); - Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); })->save($path); - $supplier->image = $file_name; + $supplier->image = $file_name; } if ($supplier->save()) { - // Redirect to the nw supplier page return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); } return redirect()->back()->withInput()->withErrors($supplier->getErrors()); @@ -160,16 +159,16 @@ class SuppliersController extends Controller $supplier->notes = request('notes'); - if (Input::file('image')) { + if ($request->file('image')) { $image = $request->file('image'); - $file_name = 'suppliers-'.str_random(25).".".$image->getClientOriginalExtension(); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); $path = public_path('uploads/suppliers/'.$file_name); - Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + Image::make($image->getRealPath())->resize(200, null, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); })->save($path); $supplier->image = $file_name; - } elseif (request('image_delete') == 1) { + } elseif ($request->input('image_delete')=='1') { $supplier->image = null; } diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 0a8eb4c0fa..e592d3b02d 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -85,10 +85,6 @@ class UsersController extends Controller $permissions = $this->filterDisplayable($permissions); return view('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('location_list', Helper::locationsList()) - ->with('manager_list', Helper::managerList()) - ->with('company_list', Helper::companyList()) - ->with('department_list', Helper::departmentList()) ->with('user', new User); } @@ -123,6 +119,11 @@ class UsersController extends Controller $user->company_id = Company::getIdForUser($request->input('company_id', null)); $user->manager_id = $request->input('manager_id', null); $user->notes = $request->input('notes'); + $user->address = $request->input('address', null); + $user->city = $request->input('city', null); + $user->state = $request->input('state', null); + $user->country = $request->input('country', null); + $user->zip = $request->input('zip', null); // Strip out the superuser permission if the user isn't a superadmin $permissions_array = $request->input('permission'); @@ -232,9 +233,9 @@ class UsersController extends Controller public function edit($id) { - try { - $user = User::find($id); + if ($user = User::find($id)) { + $this->authorize('update', $user); $permissions = config('permissions'); @@ -244,19 +245,14 @@ class UsersController extends Controller $user->permissions = $user->decodePermissions(); $userPermissions = Helper::selectedPermissionsArray($permissions, $user->permissions); $permissions = $this->filterDisplayable($permissions); - - } catch (UserNotFoundException $e) { - $error = trans('admin/users/message.user_not_found', compact('id')); - return redirect()->route('users.index')->with('error', $error); + return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions'))->with('item', $user); } - // Show the page - return view('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions')) - ->with('location_list', Helper::locationsList()) - ->with('department_list', Helper::departmentList()) - ->with('company_list', Helper::companyList()) - ->with('manager_list', Helper::managerList()); + $error = trans('admin/users/message.user_not_found', compact('id')); + return redirect()->route('users.index')->with('error', $error); + + } /** @@ -321,15 +317,24 @@ class UsersController extends Controller $user->locale = $request->input('locale'); $user->employee_num = $request->input('employee_num'); $user->activated = $request->input('activated', $user->activated); - $user->jobtitle = $request->input('jobtitle'); + $user->jobtitle = $request->input('jobtitle', null); $user->phone = $request->input('phone'); $user->location_id = $request->input('location_id', null); $user->company_id = Company::getIdForUser($request->input('company_id', null)); $user->manager_id = $request->input('manager_id', null); $user->notes = $request->input('notes'); $user->department_id = $request->input('department_id', null); + $user->address = $request->input('address', null); + $user->city = $request->input('city', null); + $user->state = $request->input('state', null); + $user->country = $request->input('country', null); + $user->zip = $request->input('zip', null); + // Update the location of any assets checked out to this user + Asset::where('assigned_type', User::class) + ->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]); + // Do we want to update the user password? if ($request->has('password')) { $user->password = bcrypt($request->input('password')); @@ -435,11 +440,6 @@ class UsersController extends Controller if ($request->input('bulk_actions')=='edit') { return view('users/bulk-edit', compact('users')) - ->with('location_list', Helper::locationsList()) - ->with('company_list', Helper::companyList()) - ->with('manager_list', Helper::managerList()) - ->with('manager_list', Helper::managerList()) - ->with('department_list', Helper::departmentList()) ->with('groups', Group::pluck('name', 'id')); } @@ -725,7 +725,7 @@ class UsersController extends Controller $user->first_name = ''; $user->last_name = ''; $user->email = substr($user->email, ($pos = strpos($user->email, '@')) !== false ? $pos : 0); - ; + $user->id = null; // Get this user groups @@ -738,10 +738,6 @@ class UsersController extends Controller // Show the page return view('users/edit', compact('permissions', 'userPermissions')) - ->with('location_list', Helper::locationsList()) - ->with('company_list', Helper::companyList()) - ->with('manager_list', Helper::managerList()) - ->with('department_list', Helper::departmentList()) ->with('user', $user) ->with('groups', Group::pluck('name', 'id')) ->with('userGroups', $userGroups) diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 5a7ac1eb9c..d913c216c4 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -68,7 +68,7 @@ class ViewAssetsController extends Controller public function getRequestableIndex() { - $assets = Asset::with('model', 'defaultLoc', 'assetloc', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get(); + $assets = Asset::with('model', 'defaultLoc', 'location', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get(); $models = AssetModel::with('category', 'requests', 'assets')->RequestableModels()->get(); return view('account/requestable-assets', compact('user', 'assets', 'models')); diff --git a/app/Http/Transformers/AssetsTransformer.php b/app/Http/Transformers/AssetsTransformer.php index 92ba702a15..801b439bc3 100644 --- a/app/Http/Transformers/AssetsTransformer.php +++ b/app/Http/Transformers/AssetsTransformer.php @@ -30,7 +30,7 @@ class AssetsTransformer 'id' => (int) $asset->model->id, 'name'=> e($asset->model->name) ] : null, - 'model_number' => ($asset->model) ? e($asset->model->model_number) : null, + 'model_number' => (($asset->model) && ($asset->model->model_number)) ? e($asset->model->model_number) : null, 'status_label' => ($asset->assetstatus) ? [ 'id' => (int) $asset->assetstatus->id, 'name'=> e($asset->present()->statusText), @@ -48,15 +48,15 @@ class AssetsTransformer 'id' => (int) $asset->supplier->id, 'name'=> e($asset->supplier->name) ] : null, - 'notes' => e($asset->notes), - 'order_number' => e($asset->order_number), + 'notes' => ($asset->notes) ? e($asset->notes) : null, + 'order_number' => ($asset->order_number) ? e($asset->order_number) : null, 'company' => ($asset->company) ? [ 'id' => (int) $asset->company->id, 'name'=> e($asset->company->name) ] : null, - 'location' => ($asset->assetLoc) ? [ - 'id' => (int) $asset->assetLoc->id, - 'name'=> e($asset->assetLoc->name) + 'location' => ($asset->location) ? [ + 'id' => (int) $asset->location->id, + 'name'=> e($asset->location->name) ] : null, 'rtd_location' => ($asset->defaultLoc) ? [ 'id' => (int) $asset->defaultLoc->id, @@ -64,10 +64,11 @@ class AssetsTransformer ] : null, 'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null, 'assigned_to' => $this->transformAssignedTo($asset), - 'warranty' => ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null, + 'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null, 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, 'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'), + 'deleted_at' => Helper::getFormattedDateObject($asset->deleted_at, 'datetime'), 'purchase_date' => Helper::getFormattedDateObject($asset->purchase_date, 'date'), 'last_checkout' => Helper::getFormattedDateObject($asset->last_checkout, 'datetime'), 'expected_checkin' => Helper::getFormattedDateObject($asset->expected_checkin, 'date'), @@ -129,19 +130,19 @@ class AssetsTransformer public function transformAssignedTo($asset) { if ($asset->checkedOutToUser()) { - return $asset->assignedTo ? [ - 'id' => (int) $asset->assignedTo->id, - 'username' => e($asset->assignedTo->username), - 'name' => e($asset->assignedTo->getFullNameAttribute()), - 'first_name'=> e($asset->assignedTo->first_name), - 'last_name'=> e($asset->assignedTo->last_name), - 'employee_number' => e($asset->assignedTo->employee_num), + return $asset->assigned ? [ + 'id' => (int) $asset->assigned->id, + 'username' => e($asset->assigned->username), + 'name' => e($asset->assigned->getFullNameAttribute()), + 'first_name'=> e($asset->assigned->first_name), + 'last_name'=> ($asset->assigned->last_name) ? e($asset->assigned->last_name) : null, + 'employee_number' => ($asset->assigned->employee_num) ? e($asset->assigned->employee_num) : null, 'type' => 'user' ] : null; } - return $asset->assignedTo ? [ - 'id' => $asset->assignedTo->id, - 'name' => $asset->assignedTo->display_name, + return $asset->assigned ? [ + 'id' => $asset->assigned->id, + 'name' => $asset->assigned->display_name, 'type' => $asset->assignedType() ] : null; } diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php index 213793c90a..121e73803e 100644 --- a/app/Http/Transformers/CategoriesTransformer.php +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -25,6 +25,7 @@ class CategoriesTransformer $array = [ 'id' => (int) $category->id, 'name' => e($category->name), + 'image' => ($category->image) ? e(url('/').'/uploads/categories/'.e($category->image)) : null, 'type' => e($category->category_type), 'eula' => ($category->getEula()) ? true : false, 'checkin_email' => ($category->checkin_email =='1') ? true : false, diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php index fb94535976..107ed59b17 100644 --- a/app/Http/Transformers/CompaniesTransformer.php +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -25,6 +25,7 @@ class CompaniesTransformer $array = [ 'id' => (int) $company->id, 'name' => e($company->name), + 'image' => ($company->image) ? e(url('/').'/uploads/companies/'.e($company->image)) : null, "created_at" => Helper::getFormattedDateObject($company->created_at, 'datetime'), "updated_at" => Helper::getFormattedDateObject($company->updated_at, 'datetime'), "assets_count" => (int) $company->assets_count, diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index f80124e1db..bb24cafb0b 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -22,7 +22,8 @@ class ComponentsTransformer $array = [ 'id' => (int) $component->id, 'name' => e($component->name), - 'serial_number' => e($component->serial), + 'image' => ($component->image) ? e(url('/').'/uploads/components/'.e($component->image)) : null, + 'serial_number' => ($component->serial) ? e($component->serial) : null, 'location' => ($component->location) ? [ 'id' => (int) $component->location->id, 'name' => e($component->location->name) diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 44bfe73818..426cfb9d41 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -22,6 +22,8 @@ class ConsumablesTransformer { $array = [ 'id' => (int) $consumable->id, + 'name' => e($consumable->name), + 'image' => ($consumable->image) ? e(url('/').'/uploads/consumables/'.e($consumable->image)) : null, 'category' => ($consumable->category) ? ['id' => $consumable->category->id, 'name' => e($consumable->category->name)] : null, 'company' => ($consumable->company) ? ['id' => (int) $consumable->company->id, 'name' => e($consumable->company->name)] : null, 'item_no' => e($consumable->item_no), @@ -29,7 +31,6 @@ class ConsumablesTransformer 'manufacturer' => ($consumable->manufacturer) ? ['id' => (int) $consumable->manufacturer->id, 'name' => e($consumable->manufacturer->name)] : null, 'min_amt' => (int) $consumable->min_amt, 'model_number' => e($consumable->model_number), - 'name' => e($consumable->name), 'remaining' => $consumable->numRemaining(), 'order_number' => e($consumable->order_number), 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), diff --git a/app/Http/Transformers/DepartmentsTranformer.php b/app/Http/Transformers/DepartmentsTranformer.php index 8531a3b8ef..00a8746e8b 100644 --- a/app/Http/Transformers/DepartmentsTranformer.php +++ b/app/Http/Transformers/DepartmentsTranformer.php @@ -25,6 +25,7 @@ class DepartmentsTransformer $array = [ 'id' => (int) $department->id, 'name' => e($department->name), + 'image' => ($department->image) ? e(url('/').'/uploads/departments/'.e($department->image)) : null, 'company' => ($department->company) ? [ 'id' => (int) $department->company->id, 'name'=> e($department->company->name) diff --git a/app/Http/Transformers/LocationsTransformer.php b/app/Http/Transformers/LocationsTransformer.php index 5dc8961dba..3009f93ead 100644 --- a/app/Http/Transformers/LocationsTransformer.php +++ b/app/Http/Transformers/LocationsTransformer.php @@ -33,13 +33,15 @@ class LocationsTransformer $array = [ 'id' => (int) $location->id, 'name' => e($location->name), + 'image' => ($location->image) ? e(url('/').'/uploads/locations/'.e($location->image)) : null, 'address' => e($location->address), 'city' => e($location->city), 'state' => e($location->state), 'country' => e($location->country), 'zip' => e($location->zip), - 'assets_checkedout' => $location->location_assets_count, - 'assets_default' => $location->assigned_assets_count, + 'assets_count' => (int) $location->assets_count, + 'rtd_assets_count' => (int) $location->rtd_assets_count, + 'users_count' => (int) $location->users_count, 'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'), diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php index a1911a4468..93bcf36d24 100644 --- a/app/Http/Transformers/ManufacturersTransformer.php +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -26,6 +26,7 @@ class ManufacturersTransformer 'id' => (int) $manufacturer->id, 'name' => e($manufacturer->name), 'url' => e($manufacturer->url), + 'image' => ($manufacturer->image) ? e(url('/').'/uploads/manufacturers/'.e($manufacturer->image)) : null, 'support_url' => e($manufacturer->support_url), 'support_phone' => e($manufacturer->support_phone), 'support_email' => e($manufacturer->support_email), diff --git a/app/Http/Transformers/SelectlistTransformer.php b/app/Http/Transformers/SelectlistTransformer.php new file mode 100644 index 0000000000..54b55122fc --- /dev/null +++ b/app/Http/Transformers/SelectlistTransformer.php @@ -0,0 +1,51 @@ +] + * @since [v4.0.16] + * @return \Illuminate\Http\Response + */ + +class SelectlistTransformer +{ + + public function transformSelectlist (LengthAwarePaginator $select_items) + { + $items_array = []; + + // Loop through the paginated collection to set the array values + foreach ($select_items as $select_item) { + $items_array[]= [ + 'id' => (int) $select_item->id, + 'text' => ($select_item->use_text) ? e($select_item->use_text) : e($select_item->name), + 'image' => ($select_item->use_image) ? e($select_item->use_image) : null, + + ]; + + } + + $results = [ + 'items' => $items_array, + 'pagination' => + [ + 'more' => ($select_items->currentPage() >= $select_items->lastPage()) ? false : true, + 'per_page' => $select_items->perPage() + ], + 'total_count' => $select_items->total(), + 'page' => $select_items->currentPage(), + 'page_count' => $select_items->lastPage() + ]; + + return $results; + + } + +} diff --git a/app/Http/Transformers/SuppliersTransformer.php b/app/Http/Transformers/SuppliersTransformer.php index 5802c87d86..bd3aac350b 100644 --- a/app/Http/Transformers/SuppliersTransformer.php +++ b/app/Http/Transformers/SuppliersTransformer.php @@ -25,6 +25,7 @@ class SuppliersTransformer $array = [ 'id' => (int) $supplier->id, 'name' => e($supplier->name), + 'image' => ($supplier->image) ? e(url('/').'/uploads/suppliers/'.e($supplier->image)) : null, 'address' => ($supplier->address) ? e($supplier->address) : null, 'address2' => ($supplier->address2) ? e($supplier->address2) : null, 'city' => ($supplier->city) ? e($supplier->city) : null, @@ -38,7 +39,6 @@ class SuppliersTransformer 'assets_count' => (int) $supplier->assets_count, 'accessories_count' => (int) $supplier->accessories_count, 'licenses_count' => (int) $supplier->licenses_count, - 'image' => ($supplier->image) ? url('/').'/uploads/suppliers/'.e($supplier->image) : null, 'notes' => ($supplier->notes) ? e($supplier->notes) : null, 'created_at' => Helper::getFormattedDateObject($supplier->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($supplier->updated_at, 'datetime'), diff --git a/app/Http/Transformers/UsersTransformer.php b/app/Http/Transformers/UsersTransformer.php index 8b283da8d0..8d9bab60ff 100644 --- a/app/Http/Transformers/UsersTransformer.php +++ b/app/Http/Transformers/UsersTransformer.php @@ -35,6 +35,11 @@ class UsersTransformer ] : null, 'jobtitle' => ($user->jobtitle) ? e($user->jobtitle) : null, 'phone' => ($user->phone) ? e($user->phone) : null, + 'address' => ($user->address) ? e($user->address) : null, + 'city' => ($user->city) ? e($user->city) : null, + 'state' => ($user->state) ? e($user->state) : null, + 'country' => ($user->country) ? e($user->country) : null, + 'zip' => ($user->zip) ? e($user->zip) : null, 'email' => e($user->email), 'department' => ($user->department) ? [ 'id' => (int) $user->department->id, diff --git a/app/Importer/AssetImporter.php b/app/Importer/AssetImporter.php index 7518663098..e2987ed2e0 100644 --- a/app/Importer/AssetImporter.php +++ b/app/Importer/AssetImporter.php @@ -67,7 +67,7 @@ class AssetImporter extends ItemImporter } $this->item['image'] = $this->findCsvMatch($row, "image"); - $this->item['warranty_months'] = intval($this->findCsvMatch($row, "warranty")); + $this->item['warranty_months'] = intval($this->findCsvMatch($row, "warranty_months")); $this->item['model_id'] = $this->createOrFetchAssetModel($row); // If no status ID is found diff --git a/app/Models/Asset.php b/app/Models/Asset.php index a1dc0bd93a..8a4d4eed8b 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -21,8 +21,7 @@ use Illuminate\Notifications\Notifiable; class Asset extends Depreciable { protected $presenter = 'App\Presenters\AssetPresenter'; - use Loggable, Requestable, Presentable, Notifiable; - use SoftDeletes; + use Loggable, Requestable, Presentable, Notifiable, SoftDeletes, ValidatingTrait, UniqueUndeletedTrait; const LOCATION = 'location'; const ASSET = 'asset'; @@ -53,7 +52,6 @@ class Asset extends Depreciable ]; - use ValidatingTrait, UniqueUndeletedTrait; protected $rules = [ 'name' => 'max:255|nullable', @@ -85,6 +83,7 @@ class Asset extends Depreciable 'model_id', 'name', 'notes', + 'order_number', 'purchase_cost', 'purchase_date', 'rtd_location_id', @@ -94,6 +93,8 @@ class Asset extends Depreciable 'warranty_months', ]; + + public function getDisplayNameAttribute() { return $this->present()->name(); @@ -126,11 +127,10 @@ class Asset extends Depreciable public function availableForCheckout() { - return ( - empty($this->assigned_to) && - $this->assetstatus->deployable == 1 && - empty($this->deleted_at) - ); + if ((empty($this->assigned_to)) && (empty($this->deleted_at)) && ($this->assetstatus->deployable == 1)) { + return true; + } + return false; } /** @@ -254,23 +254,33 @@ class Asset extends Depreciable **/ public function assetLoc() { + static $iterations=0; + static $first_asset; if (!empty($this->assignedType())) { - // dd($this->assignedType()); if ($this->assignedType() == self::ASSET) { - return $this->assignedto->assetloc(); // Recurse until we have a final location + $iterations++; + if(!$first_asset) { + $first_asset=$this; + } + if($iterations>10) { + throw new \Exception("Asset assignment Loop for Asset ID: ".$first_asset->id); + } + $assigned_to=Asset::find($this->assigned_to); //have to do this this way because otherwise it errors + return $assigned_to->assetLoc(); // Recurse until we have a final location } if ($this->assignedType() == self::LOCATION) { - return $this->assignedTo(); + return $this->assignedTo; } if ($this->assignedType() == self::USER) { - if (!$this->assignedTo) { - return $this->defaultLoc(); + if (!$this->assignedTo->userLoc) { + //this makes no sense + return $this->defaultLoc; } - return $this->assignedTo->userLoc(); + return $this->assignedTo->userLoc; } } - return $this->defaultLoc(); + return $this->defaultLoc; } public function assignedType() @@ -406,6 +416,12 @@ class Asset extends Depreciable } + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id'); + } + + /** * Get auto-increment diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index e353a149aa..aa485399d8 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -149,7 +149,7 @@ class AssetModel extends SnipeModel public function scopeTextSearch($query, $search) { - return $query->where('name', 'LIKE', "%$search%") + return $query->where('models.name', 'LIKE', "%$search%") ->orWhere('model_number', 'LIKE', "%$search%") ->orWhere(function ($query) use ($search) { $query->whereHas('depreciation', function ($query) use ($search) { diff --git a/app/Models/CheckoutRequest.php b/app/Models/CheckoutRequest.php index 39d046a9f8..668f326402 100644 --- a/app/Models/CheckoutRequest.php +++ b/app/Models/CheckoutRequest.php @@ -37,12 +37,6 @@ class CheckoutRequest extends Model public function location() { - if ($this->itemType() == "asset") { - $asset = $this->itemRequested(); - if ($asset->assignedTo) { - return $asset->assetloc; - } - } return $this->itemRequested()->location; } diff --git a/app/Models/Company.php b/app/Models/Company.php index fe621ff4fe..e3b23e8645 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -192,4 +192,20 @@ final class Company extends SnipeModel { return $this->hasMany(Component::class); } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + } } diff --git a/app/Models/Location.php b/app/Models/Location.php index 3275c296d4..6a416a4173 100755 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -54,10 +54,10 @@ class Location extends SnipeModel public function assets() { - return $this->hasManyThrough('\App\Models\Asset', '\App\Models\User', 'location_id', 'assigned_to', 'id')->where("assets.assigned_type",User::class); + return $this->hasMany('\App\Models\Asset', 'location_id'); } - public function locationAssets() + public function rtd_assets() { /* This used to have an ...->orHas() clause that referred to assignedAssets, and that was probably incorrect, as well as @@ -88,6 +88,7 @@ class Location extends SnipeModel return $this->hasMany('\App\Models\Location', 'parent_id'); } + // I don't think we need this anymore since we de-normed location_id in assets? public function assignedAssets() { return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); diff --git a/app/Models/Statuslabel.php b/app/Models/Statuslabel.php index c650521ca0..bfaba26c49 100755 --- a/app/Models/Statuslabel.php +++ b/app/Models/Statuslabel.php @@ -49,9 +49,10 @@ class Statuslabel extends SnipeModel return 'archived'; } elseif (($this->pending == '0') && ($this->archived == '0') && ($this->deployable == '0')) { return 'undeployable'; - } else { - return 'deployable'; } + + return 'deployable'; + } public function scopePending() @@ -78,6 +79,11 @@ class Statuslabel extends SnipeModel public static function getStatuslabelTypesForDB($type) { + + $statustype['pending'] = 0; + $statustype['deployable'] = 0; + $statustype['archived'] = 0; + if ($type == 'pending') { $statustype['pending'] = 1; $statustype['deployable'] = 0; @@ -92,12 +98,6 @@ class Statuslabel extends SnipeModel $statustype['pending'] = 0; $statustype['deployable'] = 0; $statustype['archived'] = 1; - - } else { - $statustype['pending'] = 0; - $statustype['deployable'] = 0; - $statustype['archived'] = 0; - } return $statustype; diff --git a/app/Models/User.php b/app/Models/User.php index fd18d50921..537e07f5ad 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,8 +4,10 @@ namespace App\Models; use App\Presenters\Presentable; use Illuminate\Auth\Authenticatable; use Illuminate\Auth\Passwords\CanResetPassword; +use Illuminate\Foundation\Auth\Access\Authorizable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; +use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; use Watson\Validating\ValidatingTrait; use Illuminate\Database\Eloquent\SoftDeletes; use App\Http\Traits\UniqueUndeletedTrait; @@ -16,7 +18,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo { protected $presenter = 'App\Presenters\UserPresenter'; use SoftDeletes, ValidatingTrait; - use Authenticatable, CanResetPassword, HasApiTokens; + use Authenticatable, Authorizable, CanResetPassword, HasApiTokens; use UniqueUndeletedTrait; use Notifiable; use Presentable; @@ -36,6 +38,11 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo 'phone_number', 'username', 'first_name', + 'address', + 'city', + 'state', + 'country', + 'zip', ]; protected $casts = [ @@ -53,7 +60,8 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo 'username' => 'required|string|min:1|unique_undeleted', 'email' => 'email|nullable', 'password' => 'required|min:6', - 'locale' => 'max:10|nullable' + 'locale' => 'max:10|nullable', + 'manager_id' => 'nullable|different:id', ]; @@ -191,12 +199,22 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo /** * Get the asset's location based on the assigned user + * @todo - this should be removed once we're sure we've switched it + * to location() **/ public function userloc() { return $this->belongsTo('\App\Models\Location', 'location_id')->withTrashed(); } + /** + * Get the asset's location based on the assigned user + **/ + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id')->withTrashed(); + } + /** * Get the user's manager based on the assigned user **/ diff --git a/app/Policies/AccessoryPolicy.php b/app/Policies/AccessoryPolicy.php index 8405f14686..b010f844ef 100644 --- a/app/Policies/AccessoryPolicy.php +++ b/app/Policies/AccessoryPolicy.php @@ -2,118 +2,12 @@ namespace App\Policies; -use App\Models\Accessory; -use App\Models\Company; -use App\Models\User; -use Illuminate\Auth\Access\HandlesAuthorization; +use App\Policies\CheckoutablePermissionsPolicy; -class AccessoryPolicy +class AccessoryPolicy extends CheckoutablePermissionsPolicy { - use HandlesAuthorization; - - public function before(User $user, $ability, $accessory) + protected function columnName() { - // Lets move all company related checks here. - if ($accessory instanceof \App\Models\Accessory && !Company::isCurrentUserHasAccess($accessory)) { - return false; - } - // If an admin, they can do all asset related tasks. - if ($user->hasAccess('admin')) { - return true; - } - } - - public function index(User $user) - { - // dd('here'); - return $user->hasAccess('accessories.view'); - } - /** - * Determine whether the user can view the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function view(User $user, Accessory $accessory = null) - { - // - return $user->hasAccess('accessories.view'); - } - - /** - * Determine whether the user can create accessories. - * - * @param \App\User $user - * @return mixed - */ - public function create(User $user) - { - // - return $user->hasAccess('accessories.create'); - } - - /** - * Determine whether the user can update the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function update(User $user, Accessory $accessory = null) - { - // - return $user->hasAccess('accessories.edit'); - } - - /** - * Determine whether the user can delete the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function delete(User $user, Accessory $accessory = null) - { - // - return $user->hasAccess('accessories.delete'); - } - - /** - * Determine whether the user can checkout the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function checkout(User $user, Accessory $accessory = null) - { - return $user->hasAccess('accessories.checkout'); - } - - /** - * Determine whether the user can checkin the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function checkin(User $user, Accessory $accessory = null) - { - return $user->hasAccess('accessories.checkin'); - } - - /** - * Determine whether the user can manage the accessory. - * - * @param \App\User $user - * @param \App\Accessory $accessory - * @return mixed - */ - public function manage(User $user, Accessory $accessory = null) - { - return $user->hasAccess('accessories.checkin') - || $user->hasAccess('accessories.edit') - || $user->hasAccess('accessories.checkout'); + return 'accessories'; } } diff --git a/app/Policies/AssetModelPolicy.php b/app/Policies/AssetModelPolicy.php new file mode 100644 index 0000000000..84fb495691 --- /dev/null +++ b/app/Policies/AssetModelPolicy.php @@ -0,0 +1,13 @@ +hasAccess('admin')) { - return true; - } - } - public function index(User $user) - { - return $user->hasAccess('assets.view'); - } - public function view(User $user, Asset $asset) - { - return $user->hasAccess('assets.view'); + return 'assets'; } public function viewRequestable(User $user, Asset $asset = null) { return $user->hasAccess('assets.view.requestable'); } - - public function create(User $user) - { - return $user->hasAccess('assets.create'); - } - - public function checkout(User $user, Asset $asset = null) - { - return $user->hasAccess('assets.checkout'); - } - - public function checkin(User $user, Asset $asset = null) - { - return $user->hasAccess('assets.checkin'); - } - - public function delete(User $user, Asset $asset = null) - { - return $user->hasAccess('assets.delete'); - } - public function manage(User $user, Asset $asset = null) - { - return $user->hasAccess('assets.checkin') - || $user->hasAccess('assets.edit') - || $user->hasAccess('assets.delete') - || $user->hasAccess('assets.checkout'); - } - - public function update(User $user, Asset $asset = null) - { - return $user->hasAccess('assets.edit'); - } } diff --git a/app/Policies/CategoryPolicy.php b/app/Policies/CategoryPolicy.php index a0b0c095d4..3ec1274f6f 100644 --- a/app/Policies/CategoryPolicy.php +++ b/app/Policies/CategoryPolicy.php @@ -2,98 +2,12 @@ namespace App\Policies; -use App\Models\Company; -use App\Models\Category; -use App\Models\User; -use Illuminate\Auth\Access\HandlesAuthorization; +use App\Policies\SnipePermissionsPolicy; -class CategoryPolicy +class CategoryPolicy extends SnipePermissionsPolicy { - use HandlesAuthorization; - - - public function before(User $user, $category) + protected function columnName() { - // Lets move all company related checks here. - if ($category instanceof \App\Models\Category && !Company::isCurrentUserHasAccess($category)) { - return false; - } - // If an admin, they can do all asset related tasks. - if ($user->hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the category. - * - * @param \App\Models\User $user - * @param \App\Category $category - * @return mixed - */ - public function view(User $user) - { - return $user->hasAccess('categories.view'); - } - - /** - * Determine whether the user can create categories. - * - * @param \App\Models\User $user - * @return mixed - */ - public function create(User $user) - { - return $user->hasAccess('categories.create'); - } - - /** - * Determine whether the user can update the category. - * - * @param \App\Models\User $user - * @param \App\Category $category - * @return mixed - */ - public function update(User $user) - { - // - return $user->hasAccess('categories.edit'); - } - - /** - * Determine whether the user can delete the category. - * - * @param \App\Models\User $user - * @param \App\Category $category - * @return mixed - */ - public function delete(User $user) - { - // - return $user->hasAccess('categories.delete'); - } - - /** - * Determine whether the user can view the category index. - * - * @param \App\Models\User $user - * @param \App\Models\Category $category - * @return mixed - */ - - public function index(User $user) - { - return $user->hasAccess('categories.view'); - } - - /** - * Determine whether the user can manage the category. - * - * @param \App\Models\User $user - * @param \App\Models\Category $category - * @return mixed - */ - public function manage(User $user) - { - return $user->hasAccess('categories.edit'); + return 'categories'; } } diff --git a/app/Policies/CheckoutablePermissionsPolicy.php b/app/Policies/CheckoutablePermissionsPolicy.php new file mode 100644 index 0000000000..5d2b975d2c --- /dev/null +++ b/app/Policies/CheckoutablePermissionsPolicy.php @@ -0,0 +1,44 @@ +hasAccess($this->columnName().'.checkout'); + } + + /** + * Determine whether the user can checkin the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function checkin(User $user, $item = null) + { + return $user->hasAccess($this->columnName().'.checkin'); + } + + /** + * Determine whether the user can manage the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function manage(User $user, $item = null) + { + return $user->hasAccess($this->columnName().'.checkin') + || $user->hasAccess($this->columnName().'.edit') + || $user->hasAccess($this->columnName().'.checkout'); + } +} diff --git a/app/Policies/ComponentPolicy.php b/app/Policies/ComponentPolicy.php index 5b138d0a5c..b6a64d5b69 100644 --- a/app/Policies/ComponentPolicy.php +++ b/app/Policies/ComponentPolicy.php @@ -2,113 +2,12 @@ namespace App\Policies; -use App\Models\Company; -use App\Models\Component; -use App\Models\User; -use Illuminate\Auth\Access\HandlesAuthorization; +use App\Policies\CheckoutablePermissionsPolicy; -class ComponentPolicy +class ComponentPolicy extends CheckoutablePermissionsPolicy { - use HandlesAuthorization; - - - public function before(User $user, $ability, $component) + protected function columnName() { - // Lets move all company related checks here. - if ($component instanceof \App\Models\Component && !Company::isCurrentUserHasAccess($component)) { - return false; - } - // If an admin, they can do all asset related tasks. - if ($user->hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the component. - * - * @param \App\User $user - * @param \App\Component $component - * @return mixed - */ - public function view(User $user, Component $component = null) - { - // - return $user->hasAccess('components.view'); - } - - /** - * Determine whether the user can create components. - * - * @param \App\User $user - * @return mixed - */ - public function create(User $user) - { - // - return $user->hasAccess('components.create'); - } - - /** - * Determine whether the user can update the component. - * - * @param \App\User $user - * @param \App\Component $component - * @return mixed - */ - public function update(User $user, Component $component = null) - { - // - return $user->hasAccess('components.edit'); - } - - /** - * Determine whether the user can delete the component. - * - * @param \App\User $user - * @param \App\Component $component - * @return mixed - */ - public function delete(User $user, Component $component = null) - { - // - return $user->hasAccess('components.delete'); - } - - /** - * Determine whether the user can checkout the component. - * - * @param \App\User $user - * @param \App\Accessory $component - * @return mixed - */ - public function checkout(User $user, Component $component = null) - { - return $user->hasAccess('components.checkout'); - } - - /** - * Determine whether the user can checkin the component. - * - * @param \App\User $user - * @param \App\Component $component - * @return mixed - */ - public function checkin(User $user, Component $component = null) - { - return $user->hasAccess('components.checkin'); - } - - /** - * Determine whether the user can manage the component. - * - * @param \App\User $user - * @param \App\Component $component - * @return mixed - */ - public function manage(User $user, Component $component = null) - { - return $user->hasAccess('components.checkin') - || $user->hasAccess('components.edit') - || $user->hasAccess('components.checkout'); + return 'components'; } } diff --git a/app/Policies/ConsumablePolicy.php b/app/Policies/ConsumablePolicy.php index d6f6408452..9df229a4d4 100644 --- a/app/Policies/ConsumablePolicy.php +++ b/app/Policies/ConsumablePolicy.php @@ -2,118 +2,12 @@ namespace App\Policies; -use App\Models\Company; -use App\Models\Consumable; -use App\Models\User; -use Illuminate\Auth\Access\HandlesAuthorization; +use App\Policies\CheckoutablePermissionsPolicy; -class ConsumablePolicy +class ConsumablePolicy extends CheckoutablePermissionsPolicy { - use HandlesAuthorization; - - - public function before(User $user, $ability, $consumable) + protected function columnName() { - // Lets move all company related checks here. - if ($consumable instanceof \App\Models\Consumable && !Company::isCurrentUserHasAccess($consumable)) { - return false; - } - // If an admin, they can do all asset related tasks. - if ($user->hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the consumable. - * - * @param \App\User $user - * @param \App\Consumable $consumable - * @return mixed - */ - public function view(User $user, Consumable $consumable = null) - { - // - return $user->hasAccess('consumables.view'); - } - - /** - * Determine whether the user can create consumables. - * - * @param \App\User $user - * @return mixed - */ - public function create(User $user) - { - // - return $user->hasAccess('consumables.create'); - } - - /** - * Determine whether the user can update the consumable. - * - * @param \App\User $user - * @param \App\Consumable $consumable - * @return mixed - */ - public function update(User $user, Consumable $consumable = null) - { - // - return $user->hasAccess('consumables.edit'); - } - - /** - * Determine whether the user can delete the consumable. - * - * @param \App\User $user - * @param \App\Consumable $consumable - * @return mixed - */ - public function delete(User $user, Consumable $consumable = null) - { - // - return $user->hasAccess('consumables.delete'); - } - - /** - * Determine whether the user can checkout the consumable. - * - * @param \App\User $user - * @param \App\Accessory $consumable - * @return mixed - */ - public function checkout(User $user, Consumable $consumable = null) - { - return $user->hasAccess('consumables.checkout'); - } - - /** - * Determine whether the user can checkin the consumable. - * - * @param \App\User $user - * @param \App\Consumable $consumable - * @return mixed - */ - public function checkin(User $user, Consumable $consumable = null) - { - return $user->hasAccess('consumables.checkin'); - } - - public function index(User $user) - { - return $user->hasAccess('consumables.view'); - } - - /** - * Determine whether the user can manage the consumable. - * - * @param \App\User $user - * @param \App\Consumable $consumable - * @return mixed - */ - public function manage(User $user, Consumable $consumable = null) - { - return $user->hasAccess('consumables.checkin') - || $user->hasAccess('consumables.edit') - || $user->hasAccess('consumables.checkout'); + return 'consumables'; } } diff --git a/app/Policies/CustomFieldPolicy.php b/app/Policies/CustomFieldPolicy.php new file mode 100644 index 0000000000..4f5f947185 --- /dev/null +++ b/app/Policies/CustomFieldPolicy.php @@ -0,0 +1,13 @@ +hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the license. - * - * @param \App\User $user - * @param \App\License $license - * @return mixed - */ - public function view(User $user, License $license = null) - { - // - return $user->hasAccess('licenses.view'); + return 'licenses'; } - /** - * Determine whether the user can create licenses. - * - * @param \App\User $user - * @return mixed - */ - public function create(User $user) - { - // - return $user->hasAccess('licenses.create'); - } - - /** - * Determine whether the user can update the license. - * - * @param \App\User $user - * @param \App\License $license - * @return mixed - */ - public function update(User $user, License $license = null) - { - // - return $user->hasAccess('licenses.edit'); - } - - /** - * Determine whether the user can delete the license. - * - * @param \App\User $user - * @param \App\License $license - * @return mixed - */ - public function delete(User $user, License $license = null) - { - // - return $user->hasAccess('licenses.delete'); - } - - /** - * Determine whether the user can checkout the license. - * - * @param \App\User $user - * @param \App\Accessory $license - * @return mixed - */ - public function checkout(User $user, LicenseSeat $license = null) - { - return $user->hasAccess('licenses.checkout'); - } - - /** - * Determine whether the user can checkin the license. - * - * @param \App\User $user - * @param \App\License $license - * @return mixed - */ - public function checkin(User $user, LicenseSeat $license = null) - { - return $user->hasAccess('licenses.checkin'); - } /** * Determine whether the user can view license keys * @@ -110,18 +25,4 @@ class LicensePolicy return $user->hasAccess('licenses.keys'); } - /** - * Determine whether the user can manage the license. - * - * @param \App\User $user - * @param \App\License $license - * @return mixed - */ - public function manage(User $user, License $license = null) - { - return $user->hasAccess('licenses.checkin') - || $user->hasAccess('licenses.edit') - || $user->hasAccess('licenses.delete') - || $user->hasAccess('licenses.checkout'); - } } diff --git a/app/Policies/LocationPolicy.php b/app/Policies/LocationPolicy.php index dddc82f4ca..c0aafec789 100644 --- a/app/Policies/LocationPolicy.php +++ b/app/Policies/LocationPolicy.php @@ -2,98 +2,12 @@ namespace App\Policies; -use App\Models\Company; -use App\Models\Location; -use App\Models\User; -use Illuminate\Auth\Access\HandlesAuthorization; +use App\Policies\SnipePermissionsPolicy; -class LocationPolicy +class LocationPolicy extends SnipePermissionsPolicy { - use HandlesAuthorization; - - - public function before(User $user, $location) + protected function columnName() { - // Lets move all company related checks here. - if ($location instanceof \App\Models\Location && !Company::isCurrentUserHasAccess($location)) { - return false; - } - // If an admin, they can do all asset related tasks. - if ($user->hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the location. - * - * @param \App\Models\User $user - * @param \App\Models\Location $location - * @return mixed - */ - public function view(User $user) - { - return $user->hasAccess('locations.view'); - } - - /** - * Determine whether the user can create locations. - * - * @param \App\Models\\User $user - * @return mixed - */ - public function create(User $user) - { - return $user->hasAccess('locations.create'); - } - - /** - * Determine whether the user can update the location. - * - * @param \App\Models\User $user - * @param \App\Models\Location $location - * @return mixed - */ - public function update(User $user) - { - // - return $user->hasAccess('locations.edit'); - } - - /** - * Determine whether the user can delete the location. - * - * @param \App\Models\User $user - * @param \App\Models\Location $location - * @return mixed - */ - public function delete(User $user) - { - // - return $user->hasAccess('locations.delete'); - } - - /** - * Determine whether the user can view the location index. - * - * @param \App\Models\User $user - * @param \App\Models\Accessory $location - * @return mixed - */ - - public function index(User $user) - { - return $user->hasAccess('locations.view'); - } - - /** - * Determine whether the user can manage the location. - * - * @param \App\Models\User $user - * @param \App\Models\Location $location - * @return mixed - */ - public function manage(User $user) - { - return $user->hasAccess('locations.edit'); + return 'locations'; } } diff --git a/app/Policies/SnipePermissionsPolicy.php b/app/Policies/SnipePermissionsPolicy.php new file mode 100644 index 0000000000..55d2a5032b --- /dev/null +++ b/app/Policies/SnipePermissionsPolicy.php @@ -0,0 +1,90 @@ +hasAccess('admin')) { + return true; + } + } + + public function index(User $user) + { + // dd('here'); + return $user->hasAccess($this->columnName().'.view'); + } + /** + * Determine whether the user can view the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function view(User $user, $item = null) + { + // + return $user->hasAccess($this->columnName().'.view'); + } + + /** + * Determine whether the user can create accessories. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + return $user->hasAccess($this->columnName().'.create'); + } + + /** + * Determine whether the user can update the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function update(User $user, $item = null) + { + // + return $user->hasAccess($this->columnName().'.edit'); + } + + /** + * Determine whether the user can delete the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function delete(User $user, $item = null) + { + // + return $user->hasAccess($this->columnName().'.delete'); + } + + /** + * Determine whether the user can manage the accessory. + * + * @param \App\User $user + * @return mixed + */ + public function manage(User $user, $item = null) + { + return $user->hasAccess($this->columnName().'.edit'); + } +} diff --git a/app/Policies/StatuslabelPolicy.php b/app/Policies/StatuslabelPolicy.php new file mode 100644 index 0000000000..ca9d554d8c --- /dev/null +++ b/app/Policies/StatuslabelPolicy.php @@ -0,0 +1,13 @@ +hasAccess('admin')) { - return true; - } - } - /** - * Determine whether the user can view the targetUser. - * - * @param \App\Models\User $user - * @param \App\Models\Consumable $targetUser - * @return mixed - */ - public function view(User $user, User $targetUser = null) - { - // - return $user->hasAccess('users.view'); - } - - /** - * Determine whether the user can create users. - * - * @param \App\Models\User $user - * @return mixed - */ - public function create(User $user) - { - return $user->hasAccess('users.create'); - } - - /** - * Determine whether the user can update the targetUser. - * - * @param \App\Models\User $user - * @param \App\Models\User $targetUser - * @return mixed - */ - public function update(User $user, User $targetUser = null) - { - return $user->hasAccess('users.edit'); - } - - /** - * Determine whether the user can delete the targetUser. - * - * @param \App\Models\User $user - * @param \App\Models\User $targetUser - * @return mixed - */ - public function delete(User $user, User $targetUser = null) - { - if ($targetUser) { - //We can't delete ourselves. - if ($user->id == $targetUser->id) { - return false; - } - - if ((!Auth::user()->isSuperUser()) || (config('app.lock_passwords'))) { - return false; - } - } - return $user->hasAccess('users.delete'); - } - - public function index(User $user) - { - return $user->hasAccess('users.view'); + return 'users'; } } diff --git a/app/Presenters/AssetModelPresenter.php b/app/Presenters/AssetModelPresenter.php index 7011a72039..a1cd879128 100644 --- a/app/Presenters/AssetModelPresenter.php +++ b/app/Presenters/AssetModelPresenter.php @@ -45,9 +45,14 @@ class AssetModelPresenter extends Presenter */ public function modelName() { - $name = $this->model->manufacturer->name.' '.$this->name; + $name = ''; + if ($this->model->manufacturer) { + $name .= $this->model->manufacturer->name; + } + $name .= $this->name; + if ($this->model_number) { - $name .=" / ".$this->model_number; + $name .=" (#".$this->model_number.')'; } return $name; } diff --git a/app/Presenters/AssetPresenter.php b/app/Presenters/AssetPresenter.php index 42d4e92b1d..1f71f7de33 100644 --- a/app/Presenters/AssetPresenter.php +++ b/app/Presenters/AssetPresenter.php @@ -148,6 +148,19 @@ class AssetPresenter extends Presenter "title" => trans('general.order_number'), 'formatter' => "orderNumberObjFilterFormatter" ], [ + "field" => "warranty_months", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('admin/hardware/form.warranty') + ],[ + "field" => "warranty_expires", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => 'Warranty Expires', + "formatter" => "dateDisplayFormatter" + ],[ "field" => "notes", "searchable" => true, "sortable" => true, @@ -273,14 +286,16 @@ class AssetPresenter extends Presenter **/ public function name() { - if (empty($this->name)) { - if (isset($this->model)) { - return $this->model->name.' ('.$this->asset_tag.')'; + + if (empty($this->model->name)) { + if (isset($this->model->model)) { + return $this->model->model->name.' ('.$this->model->asset_tag.')'; } - return $this->asset_tag; + return $this->model->asset_tag; } else { - return $this->name.' ('.$this->asset_tag.')'; + return $this->model->name . ' (' . $this->model->asset_tag . ')'; } + } /** @@ -289,7 +304,18 @@ class AssetPresenter extends Presenter */ public function fullName() { - return $this->name(); + $str = ''; + if ($this->model->name) { + $str .= $this->name; + } + + if ($this->asset_tag) { + $str .= ' ('.$this->model->asset_tag.')'; + } + if ($this->model->model) { + $str .= ' - '.$this->model->model->name; + } + return $str; } /** * Returns the date this item hits EOL. @@ -333,7 +359,7 @@ class AssetPresenter extends Presenter */ public function statusMeta() { - if ($this->model->assignedTo) { + if ($this->model->assigned) { return strtolower(trans('general.deployed')); } return $this->model->assetstatus->getStatuslabelType(); @@ -346,7 +372,7 @@ class AssetPresenter extends Presenter */ public function statusText() { - if ($this->model->assignedTo) { + if ($this->model->assigned) { return trans('general.deployed'); } return $this->model->assetstatus->name; diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php index 42303f8e43..db864f43e7 100644 --- a/app/Presenters/CategoryPresenter.php +++ b/app/Presenters/CategoryPresenter.php @@ -32,6 +32,13 @@ class CategoryPresenter extends Presenter "title" => trans('general.name'), "visible" => true, "formatter" => 'categoriesLinkFormatter', + ],[ + "field" => "image", + "searchable" => false, + "sortable" => true, + "title" => trans('general.image'), + "visible" => true, + "formatter" => 'imageFormatter', ],[ "field" => "type", "searchable" => true, diff --git a/app/Presenters/CompanyPresenter.php b/app/Presenters/CompanyPresenter.php index caf1690dd6..233245ff7d 100644 --- a/app/Presenters/CompanyPresenter.php +++ b/app/Presenters/CompanyPresenter.php @@ -30,6 +30,14 @@ class CompanyPresenter extends Presenter "title" => trans('admin/companies/table.name'), "visible" => true, "formatter" => 'companiesLinkFormatter', + ],[ + "field" => "image", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.image'), + "visible" => true, + "formatter" => 'imageFormatter', ],[ "field" => "users_count", "searchable" => false, diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php index 1a62db667e..6983b73d11 100644 --- a/app/Presenters/ComponentPresenter.php +++ b/app/Presenters/ComponentPresenter.php @@ -42,6 +42,14 @@ class ComponentPresenter extends Presenter "title" => trans('general.name'), "visible" => true, "formatter" => 'componentsLinkFormatter', + ], [ + "field" => "image", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.image'), + "visible" => false, + "formatter" => 'imageFormatter', ], [ "field" => "category", "searchable" => true, diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 2b542912af..2089771cc0 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -41,6 +41,15 @@ class ConsumablePresenter extends Presenter "title" => trans('general.name'), "visible" => true, "formatter" => 'consumablesLinkFormatter', + ], + [ + "field" => "image", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.image'), + "visible" => false, + "formatter" => 'imageFormatter', ], [ "field" => "category", "searchable" => true, diff --git a/app/Presenters/ManufacturerPresenter.php b/app/Presenters/ManufacturerPresenter.php index 60c94d005a..e07e9cff9c 100644 --- a/app/Presenters/ManufacturerPresenter.php +++ b/app/Presenters/ManufacturerPresenter.php @@ -35,6 +35,15 @@ class ManufacturerPresenter extends Presenter "visible" => true, "formatter" => "manufacturersLinkFormatter" ], + [ + "field" => "image", + "searchable" => false, + "sortable" => true, + "switchable" => true, + "title" => trans('general.image'), + "visible" => true, + "formatter" => "imageFormatter" + ], [ "field" => "url", "searchable" => true, @@ -44,7 +53,6 @@ class ManufacturerPresenter extends Presenter "visible" => true, "formatter" => "linkFormatter" ], - [ "field" => "support_url", "searchable" => true, diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index 53b5fcc344..1515a76f6b 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -86,6 +86,46 @@ class UserPresenter extends Presenter "title" => trans('admin/users/table.phone'), "visible" => true, ], + [ + "field" => "address", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.address'), + "visible" => false, + ], + [ + "field" => "city", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.city'), + "visible" => false, + ], + [ + "field" => "state", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.state'), + "visible" => false, + ], + [ + "field" => "country", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.country'), + "visible" => false, + ], + [ + "field" => "zip", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.zip'), + "visible" => false, + ], [ "field" => "username", "searchable" => true, diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9aea69bec7..a3184e72bc 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -94,16 +94,7 @@ class AppServiceProvider extends ServiceProvider public function register() { $monolog = Log::getMonolog(); - - if (config('app.debug')) { - $log_level = 'debug'; - } else { - if (config('app.log_level')) { - $log_level = config('app.log_level'); - } else { - $log_level = 'error'; - } - } + $log_level = config('app.log_level'); if (($this->app->environment('production')) && (config('services.rollbar.access_token'))){ $this->app->register(\Jenssegers\Rollbar\RollbarServiceProvider::class); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index ac21e4e689..264bce9707 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -3,22 +3,32 @@ namespace App\Providers; use App\Models\Accessory; -use Carbon\Carbon; use App\Models\Asset; -use App\Models\Location; -use App\Models\Component; +use App\Models\AssetModel; use App\Models\Category; +use App\Models\Component; use App\Models\Consumable; +use App\Models\CustomField; +use App\Models\Department; use App\Models\License; +use App\Models\Location; +use App\Models\Statuslabel; +use App\Models\Supplier; use App\Models\User; use App\Policies\AccessoryPolicy; +use App\Policies\AssetModelPolicy; use App\Policies\AssetPolicy; +use App\Policies\CategoryPolicy; use App\Policies\ComponentPolicy; use App\Policies\ConsumablePolicy; +use App\Policies\CustomFieldPolicy; +use App\Policies\DepartmentPolicy; use App\Policies\LicensePolicy; use App\Policies\LocationPolicy; -use App\Policies\CategoryPolicy; +use App\Policies\StatuslabelPolicy; +use App\Policies\SupplierPolicy; use App\Policies\UserPolicy; +use Carbon\Carbon; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use Laravel\Passport\Passport; @@ -31,14 +41,19 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - Asset::class => AssetPolicy::class, Accessory::class => AccessoryPolicy::class, + Asset::class => AssetPolicy::class, + AssetModel::class => AssetModelPolicy::class, + Category::class => CategoryPolicy::class, Component::class => ComponentPolicy::class, Consumable::class => ConsumablePolicy::class, + CustomField::class => CustomFieldPolicy::class, + Department::class => DepartmentPolicy::class, License::class => LicensePolicy::class, - User::class => UserPolicy::class, Location::class => LocationPolicy::class, - Category::class => CategoryPolicy::class, + Statuslabel::class => StatuslabelPolicy::class, + Supplier::class => SupplierPolicy::class, + User::class => UserPolicy::class, ]; /** @@ -54,7 +69,7 @@ class AuthServiceProvider extends ServiceProvider \Laravel\Passport\Console\ClientCommand::class, \Laravel\Passport\Console\KeysCommand::class, ]); - + $this->registerPolicies(); Passport::routes(); @@ -101,5 +116,17 @@ class AuthServiceProvider extends ServiceProvider return true; } }); + + Gate::define('backend.interact', function ($user) { + return $user->can('view', \App\Models\Statuslabel::class) + || $user->can('view', \App\Models\AssetModel::class) + || $user->can('view', \App\Models\Category::class) + || $user->can('view', \App\Models\Manufacturer::class) + || $user->can('view', \App\Models\Supplier::class) + || $user->can('view', \App\Models\Department::class) + || $user->can('view', \App\Models\Location::class) + || $user->can('view', \App\Models\Company::class) + || $user->can('view', \App\Models\Depreciation::class); + }); } } diff --git a/config/version.php b/config/version.php index 7b94081163..e5e4769c61 100644 --- a/config/version.php +++ b/config/version.php @@ -1,7 +1,7 @@ 'v4.0.15', - 'build_version' => '384', - 'hash_version' => 'g4f80eac', - 'full_hash' => 'v4.0.15-384-g4f80eac', + 'app_version' => 'v4.1.0', + 'build_version' => 'beta2', + 'hash_version' => 'g3b498ef', + 'full_hash' => 'v4.1.0-beta2-3-g3b498ef', ); diff --git a/database/factories/ActionLogFactory.php b/database/factories/ActionLogFactory.php index a49d56b852..d1a8ece7dd 100644 --- a/database/factories/ActionLogFactory.php +++ b/database/factories/ActionLogFactory.php @@ -34,7 +34,8 @@ $factory->defineAs(Actionlog::class, 'asset-checkout-user', function (Faker\Gene ->update( [ 'assigned_to' => $target->id, - 'assigned_type' => App\Models\User::class + 'assigned_type' => App\Models\User::class, + 'assigned_to' => $target->location_id, ] ); @@ -59,7 +60,8 @@ $factory->defineAs(Actionlog::class, 'asset-checkout-location', function (Faker\ ->update( [ 'assigned_to' => $target->id, - 'assigned_type' => App\Models\Location::class + 'assigned_type' => App\Models\Location::class, + 'assigned_to' => $target->id, ] ); diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index 9c4badd7ff..affb568f8a 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -16,7 +16,7 @@ use App\Models\Category; $factory->define(Asset::class, function (Faker\Generator $faker) { return [ 'name' => null, - 'rtd_location_id' => 1, + 'rtd_location_id' => rand(1,10), 'serial' => $faker->uuid, 'status_id' => 1, 'user_id' => 1, diff --git a/database/factories/AssetModelFactory.php b/database/factories/AssetModelFactory.php index a1c3d562da..d634588785 100644 --- a/database/factories/AssetModelFactory.php +++ b/database/factories/AssetModelFactory.php @@ -32,6 +32,7 @@ $factory->state(App\Models\AssetModel::class, 'mbp-13-model', function ($faker) 'manufacturer_id' => 1, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'mbp.jpg', ]; }); @@ -43,6 +44,7 @@ $factory->state(App\Models\AssetModel::class, 'mbp-air-model', function ($faker) 'manufacturer_id' => 1, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'macbookair.jpg', ]; }); @@ -54,6 +56,7 @@ $factory->state(App\Models\AssetModel::class, 'surface-model', function ($faker) 'manufacturer_id' => 2, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'surface.jpg', ]; }); @@ -65,6 +68,7 @@ $factory->state(App\Models\AssetModel::class, 'xps13-model', function ($faker) { 'manufacturer_id' => 3, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'xps.jpg', ]; }); @@ -76,6 +80,7 @@ $factory->state(App\Models\AssetModel::class, 'zenbook-model', function ($faker) 'manufacturer_id' => 4, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'zenbook.jpg', ]; }); @@ -87,6 +92,7 @@ $factory->state(App\Models\AssetModel::class, 'spectre-model', function ($faker) 'manufacturer_id' => 5, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'spectre.jpg', ]; }); @@ -98,6 +104,7 @@ $factory->state(App\Models\AssetModel::class, 'yoga-model', function ($faker) { 'manufacturer_id' => 6, 'eol' => '36', 'depreciation_id' => 1, + 'image' => 'yoga.png', ]; }); @@ -115,6 +122,7 @@ $factory->state(App\Models\AssetModel::class, 'macpro-model', function ($faker) 'manufacturer_id' => 1, 'eol' => '24', 'depreciation_id' => 1, + 'image' => 'imacpro.jpg', ]; }); @@ -125,6 +133,7 @@ $factory->state(App\Models\AssetModel::class, 'lenovo-i5-model', function ($fake 'manufacturer_id' => 6, 'eol' => '24', 'depreciation_id' => 1, + 'image' => 'lenovoi5.png', ]; }); @@ -136,6 +145,7 @@ $factory->state(App\Models\AssetModel::class, 'optiplex-model', function ($faker 'model_number' => '5040 (MRR81)', 'eol' => '24', 'depreciation_id' => 1, + 'image' => 'optiplex.jpg', ]; }); @@ -154,6 +164,7 @@ $factory->state(App\Models\AssetModel::class, 'polycom-model', function ($faker) 'manufacturer_id' => 8, 'eol' => '12', 'depreciation_id' => 1, + 'image' => 'soundstation.jpg', ]; }); @@ -164,6 +175,7 @@ $factory->state(App\Models\AssetModel::class, 'polycomcx-model', function ($fake 'manufacturer_id' => 8, 'eol' => '12', 'depreciation_id' => 1, + 'image' => 'cx3000.png', ]; }); @@ -181,6 +193,7 @@ $factory->state(App\Models\AssetModel::class, 'ipad-model', function ($faker) { 'manufacturer_id' => 1, 'eol' => '12', 'depreciation_id' => 1, + 'image' => 'ipad.jpg', ]; }); @@ -192,6 +205,7 @@ $factory->state(App\Models\AssetModel::class, 'tab3-model', function ($faker) { 'manufacturer_id' => 6, 'eol' => '12', 'depreciation_id' => 1, + 'image' => 'tab3.png', ]; }); @@ -209,6 +223,7 @@ $factory->state(App\Models\AssetModel::class, 'iphone6s-model', function ($faker 'manufacturer_id' => 1, 'eol' => '12', 'depreciation_id' => 3, + 'image' => 'iphone6.jpg', ]; }); @@ -219,6 +234,7 @@ $factory->state(App\Models\AssetModel::class, 'iphone7-model', function ($faker) 'manufacturer_id' => 1, 'eol' => '12', 'depreciation_id' => 1, + 'image' => 'iphone7.jpg', ]; }); @@ -235,6 +251,7 @@ $factory->state(App\Models\AssetModel::class, 'ultrafine', function ($faker) { 'manufacturer_id' => 7, 'eol' => '12', 'depreciation_id' => 2, + 'image' => 'ultrafine.jpg', ]; }); @@ -245,6 +262,7 @@ $factory->state(App\Models\AssetModel::class, 'ultrasharp', function ($faker) { 'manufacturer_id' => 3, 'eol' => '12', 'depreciation_id' => 2, + 'image' => 'ultrasharp.jpg', ]; }); diff --git a/database/factories/ManufacturerFactory.php b/database/factories/ManufacturerFactory.php index 55f34c40ab..ff1ab4645f 100644 --- a/database/factories/ManufacturerFactory.php +++ b/database/factories/ManufacturerFactory.php @@ -24,7 +24,8 @@ $factory->state(App\Models\Manufacturer::class, 'apple', function ($faker) { return [ 'name' => 'Apple', 'url' => 'https://apple.com', - 'support_url' => 'https://support.apple.com' + 'support_url' => 'https://support.apple.com', + 'image' => 'apple.jpg', ]; }); @@ -33,7 +34,8 @@ $factory->state(App\Models\Manufacturer::class, 'microsoft', function ($faker) { return [ 'name' => 'Microsoft', 'url' => 'https://microsoft.com', - 'support_url' => 'https://support.microsoft.com' + 'support_url' => 'https://support.microsoft.com', + 'image' => 'microsoft.png', ]; }); @@ -42,7 +44,8 @@ $factory->state(App\Models\Manufacturer::class, 'dell', function ($faker) { return [ 'name' => 'Dell', 'url' => 'https://dell.com', - 'support_url' => 'https://support.dell.com' + 'support_url' => 'https://support.dell.com', + 'image' => 'dell.png', ]; }); @@ -51,7 +54,8 @@ $factory->state(App\Models\Manufacturer::class, 'asus', function ($faker) { return [ 'name' => 'Asus', 'url' => 'https://asus.com', - 'support_url' => 'https://support.asus.com' + 'support_url' => 'https://support.asus.com', + 'image' => 'asus.png', ]; }); @@ -60,7 +64,8 @@ $factory->state(App\Models\Manufacturer::class, 'hp', function ($faker) { return [ 'name' => 'HP', 'url' => 'https://hp.com', - 'support_url' => 'https://support.hp.com' + 'support_url' => 'https://support.hp.com', + 'image' => 'hp.png', ]; }); @@ -69,7 +74,8 @@ $factory->state(App\Models\Manufacturer::class, 'lenovo', function ($faker) { return [ 'name' => 'Lenovo', 'url' => 'https://lenovo.com', - 'support_url' => 'https://support.lenovo.com' + 'support_url' => 'https://support.lenovo.com', + 'image' => 'lenovo.jpg', ]; }); @@ -78,7 +84,8 @@ $factory->state(App\Models\Manufacturer::class, 'lg', function ($faker) { return [ 'name' => 'LG', 'url' => 'https://lg.com', - 'support_url' => 'https://support.lg.com' + 'support_url' => 'https://support.lg.com', + 'image' => 'lg.jpg', ]; }); @@ -87,7 +94,8 @@ $factory->state(App\Models\Manufacturer::class, 'polycom', function ($faker) { return [ 'name' => 'Polycom', 'url' => 'https://polycom.com', - 'support_url' => 'https://support.polycom.com' + 'support_url' => 'https://support.polycom.com', + 'image' => 'polycom.png', ]; }); @@ -96,7 +104,8 @@ $factory->state(App\Models\Manufacturer::class, 'adobe', function ($faker) { return [ 'name' => 'Adobe', 'url' => 'https://adobe.com', - 'support_url' => 'https://support.adobe.com' + 'support_url' => 'https://support.adobe.com', + 'image' => 'adobe.jpg', ]; }); @@ -106,7 +115,8 @@ $factory->state(App\Models\Manufacturer::class, 'avery', function ($faker) { return [ 'name' => 'Avery', 'url' => 'https://avery.com', - 'support_url' => 'https://support.avery.com' + 'support_url' => 'https://support.avery.com', + 'image' => 'avery.png', ]; }); @@ -115,7 +125,8 @@ $factory->state(App\Models\Manufacturer::class, 'crucial', function ($faker) { return [ 'name' => 'Crucial', 'url' => 'https://crucial.com', - 'support_url' => 'https://support.crucial.com' + 'support_url' => 'https://support.crucial.com', + 'image' => 'crucial.jpg', ]; }); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index bc7b29a684..26c561caa1 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -55,7 +55,8 @@ $factory->define(App\Models\Location::class, function (Faker\Generator $faker) { 'state' => $faker->stateAbbr, 'country' => $faker->countryCode, 'currency' => $faker->currencyCode, - 'zip' => $faker->postcode + 'zip' => $faker->postcode, + 'image' => rand(1,9).'.jpg', ]; }); diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 37e37219fe..eb79b53eba 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,19 +2,17 @@ use App\Models\Company; +$password = bcrypt('password'); - -$factory->define(App\Models\User::class, function (Faker\Generator $faker) { +$factory->define(App\Models\User::class, function (Faker\Generator $faker) use ($password) { return [ 'first_name' => $faker->firstName, 'last_name' => $faker->lastName, 'username' => $faker->username, - 'password' => bcrypt('password'), + 'password' => $password, 'permissions' => '{"user":"0"}', 'email' => $faker->safeEmail, - 'company_id' => function () { - return factory(App\Models\Company::class)->create()->id; - }, + 'company_id' => rand(1,4), 'locale' => $faker->locale, 'employee_num' => $faker->numberBetween(3500, 35050), 'jobtitle' => $faker->jobTitle, diff --git a/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php b/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php new file mode 100644 index 0000000000..f6775a564a --- /dev/null +++ b/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php @@ -0,0 +1,71 @@ +string('image')->nullable()->default(null); + }); + Schema::table('companies', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + Schema::table('components', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + Schema::table('consumables', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + Schema::table('departments', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + Schema::table('locations', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + Schema::table('manufacturers', function (Blueprint $table) { + $table->string('image')->nullable()->default(null); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('categories', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('companies', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('components', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('consumables', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('departments', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('locations', function (Blueprint $table) { + $table->dropColumn('image'); + }); + Schema::table('manufacturers', function (Blueprint $table) { + $table->dropColumn('image'); + }); + + + } +} diff --git a/database/migrations/2017_10_27_180947_denorm_asset_locations.php b/database/migrations/2017_10_27_180947_denorm_asset_locations.php new file mode 100644 index 0000000000..b6ec3df8e4 --- /dev/null +++ b/database/migrations/2017_10_27_180947_denorm_asset_locations.php @@ -0,0 +1,35 @@ +integer('location_id')->nullable()->default(null); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function (Blueprint $table) { + $table->dropColumn('location_id'); + }); + } +} diff --git a/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php b/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php new file mode 100644 index 0000000000..151e84bb7b --- /dev/null +++ b/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php @@ -0,0 +1,97 @@ +with('defaultLoc')->get(); + \Log::info('Unasigned assets: '); + foreach ($rtd_assets as $rtd_asset) { + \Log::info('Setting asset '.$rtd_asset->id.' to location: '.$rtd_asset->rtd_location_id." Because asset's default location is: ".$rtd_asset->rtd_location_id); + $rtd_asset->location_id=$rtd_asset->rtd_location_id; + $rtd_asset->unsetEventDispatcher(); + $rtd_asset->save(); + } + + // Assigned to users - ::with('assignedTo') //can't eager-load polymorphic relations? + $assigned_user_assets = Asset::where('assigned_type',User::class)->whereNotNull('assigned_to')->get(); + \Log::debug('User-assigned assets:'); + foreach ($assigned_user_assets as $assigned_user_asset) { + if ($assigned_user_asset->assignedTo->userLoc) { + $new_location=$assigned_user_asset->assignedTo->userloc->id; + \Log::info(' They are in '.$assigned_user_asset->assignedTo->userloc->name.' which is id: '.$new_location); + } else { + \Log::info('They have no location! '); + $new_location=$assigned_user_asset->rtd_location_id; + } + $assigned_user_asset->location_id=$new_location; + $assigned_user_asset->unsetEventDispatcher(); + $assigned_user_asset->save(); + + } + + // Assigned to locations // with('assetloc')-> //can't eager-load polymorphic relationships + $assigned_location_assets = Asset::where('assigned_type',Location::class)->get(); + \Log::info('Location-assigned assets: '); + foreach ($assigned_location_assets as $assigned_location_asset) { + $assigned_location_asset->location_id=$assigned_location_asset->assignedTo->id; + \Log::info('(calculated to be: '.$assigned_location_asset->assetLoc()); + $assigned_location_asset->unsetEventDispatcher(); + $assigned_location_asset->save(); + } + + // Assigned to assets + $assigned_asset_assets = Asset::with('assetloc')->where('assigned_type',Asset::class)->get(); + \Log::info('Asset-assigned assets: '); + foreach ($assigned_asset_assets as $assigned_asset_asset) { + \Log::info('This asset is: '.$assigned_asset_asset->assignedTo->asset_tag); + if ($assigned_asset_asset->assignedTo->location) { + \Log::info('They are in '.$assigned_asset_asset->assignedTo->location->name); + } + \Log::info('User location is: '.$assigned_asset_asset->assetloc->name); + \Log::info('Setting asset '.$assigned_asset_asset->id.' location to '.$assigned_asset_asset->assetloc->id.' ('.$assigned_asset_asset->assetloc->name.')'); + $assigned_asset_asset->location_id=$assigned_asset_asset->assetloc->id; + + } + + $unassigned_assets=Asset::whereNull("location_id")->get(); + foreach($unassigned_assets as $unassigned_asset) { + \Log::info('Asset: '.$unassigned_asset->id.' still has no location'); + } + + $assets = Asset::get(); + + foreach ($assets as $asset) { + if (($asset) && ($asset->location_id != $asset->assetLoc()->id)) { + \Log::info('MISMATCH MISMATCH '.$asset->id. "doesn't match its location"); + } + } + + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/migrations/2017_10_30_182938_add_address_to_user.php b/database/migrations/2017_10_30_182938_add_address_to_user.php new file mode 100644 index 0000000000..91d7283dd2 --- /dev/null +++ b/database/migrations/2017_10_30_182938_add_address_to_user.php @@ -0,0 +1,39 @@ +string('address')->nullable()->default(null); + $table->string('city')->nullable()->default(null); + $table->string('state', 3)->nullable()->default(null); + $table->string('zip', 10)->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('address'); + $table->dropColumn('city'); + $table->dropColumn('state'); + $table->dropColumn('zip'); + + }); + } +} diff --git a/database/seeds/ActionlogSeeder.php b/database/seeds/ActionlogSeeder.php index 258cde3af3..e186bf6ab4 100644 --- a/database/seeds/ActionlogSeeder.php +++ b/database/seeds/ActionlogSeeder.php @@ -7,7 +7,7 @@ class ActionlogSeeder extends Seeder public function run() { Actionlog::truncate(); - factory(Actionlog::class, 'asset-checkout-user',5)->create(); - factory(Actionlog::class, 'asset-checkout-location',5)->create(); + factory(Actionlog::class, 'asset-checkout-user',300)->create(); + factory(Actionlog::class, 'asset-checkout-location',100)->create(); } } diff --git a/database/seeds/AssetModelSeeder.php b/database/seeds/AssetModelSeeder.php index dc27ddad26..fdb1adef0a 100755 --- a/database/seeds/AssetModelSeeder.php +++ b/database/seeds/AssetModelSeeder.php @@ -39,6 +39,23 @@ class AssetModelSeeder extends Seeder factory(AssetModel::class, 1)->states('ultrafine')->create(); // 17 factory(AssetModel::class, 1)->states('ultrasharp')->create(); // 18 + $src = public_path('/img/demo/models'); + $dst = public_path('/uploads/models'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + + $add_files = glob($src."/*.*"); + foreach($add_files as $add_file){ + $file_to_copy = str_replace($src,$dst,$add_file); + copy($add_file, $file_to_copy); + } + } diff --git a/database/seeds/AssetSeeder.php b/database/seeds/AssetSeeder.php index baaa65d3bf..4afd1fd3df 100644 --- a/database/seeds/AssetSeeder.php +++ b/database/seeds/AssetSeeder.php @@ -8,19 +8,19 @@ class AssetSeeder extends Seeder public function run() { Asset::truncate(); - factory(Asset::class, 10)->states('laptop-mbp')->create(); - factory(Asset::class, 5)->states('laptop-mbp-pending')->create(); - factory(Asset::class, 5)->states('laptop-mbp-archived')->create(); - factory(Asset::class, 10)->states('laptop-air')->create(); + factory(Asset::class, 1000)->states('laptop-mbp')->create(); + factory(Asset::class, 50)->states('laptop-mbp-pending')->create(); + factory(Asset::class, 50)->states('laptop-mbp-archived')->create(); + factory(Asset::class, 50)->states('laptop-air')->create(); factory(Asset::class, 5)->states('laptop-surface')->create(); factory(Asset::class, 5)->states('laptop-xps')->create(); factory(Asset::class, 5)->states('laptop-spectre')->create(); factory(Asset::class, 5)->states('laptop-zenbook')->create(); factory(Asset::class, 3)->states('laptop-yoga')->create(); - factory(Asset::class, 3)->states('desktop-macpro')->create(); - factory(Asset::class, 3)->states('desktop-lenovo-i5')->create(); - factory(Asset::class, 10)->states('desktop-optiplex')->create(); + factory(Asset::class, 30)->states('desktop-macpro')->create(); + factory(Asset::class, 30)->states('desktop-lenovo-i5')->create(); + factory(Asset::class, 30)->states('desktop-optiplex')->create(); factory(Asset::class, 5)->states('conf-polycom')->create(); factory(Asset::class, 2)->states('conf-polycomcx')->create(); @@ -35,5 +35,15 @@ class AssetSeeder extends Seeder factory(Asset::class, 10)->states('ultrasharp')->create(); + $dst = public_path('/uploads/assets'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + } } diff --git a/database/seeds/CompanySeeder.php b/database/seeds/CompanySeeder.php index ba1ac00ba9..3885b939f4 100644 --- a/database/seeds/CompanySeeder.php +++ b/database/seeds/CompanySeeder.php @@ -15,5 +15,23 @@ class CompanySeeder extends Seeder // Company::truncate(); factory(Company::class, 4)->create(); + + $src = public_path('/img/demo/companies'); + $dst = public_path('/uploads/companies'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + + $add_files = glob($src."/*.*"); + foreach($add_files as $add_file){ + $file_to_copy = str_replace($src,$dst,$add_file); + copy($add_file, $file_to_copy); + } + } } diff --git a/database/seeds/CustomFieldSeeder.php b/database/seeds/CustomFieldSeeder.php index f497b94065..f6ec934a3f 100644 --- a/database/seeds/CustomFieldSeeder.php +++ b/database/seeds/CustomFieldSeeder.php @@ -1,13 +1,27 @@ getColumnListing('assets'); + + + foreach ($columns as $column) { + if(strpos($column, '_snipeit_') !== FALSE) { + + Schema::table('assets', function (Blueprint $table) use ($column) { + $table->dropColumn($column); + }); + } + } CustomField::truncate(); + factory(CustomField::class, 4)->create(); } } diff --git a/database/seeds/LocationSeeder.php b/database/seeds/LocationSeeder.php index 3f0b811814..40d389792f 100644 --- a/database/seeds/LocationSeeder.php +++ b/database/seeds/LocationSeeder.php @@ -8,6 +8,24 @@ class LocationSeeder extends Seeder public function run() { Location::truncate(); - factory(Location::class, 5)->create(); + factory(Location::class, 10)->create(); + + $src = public_path('/img/demo/locations'); + $dst = public_path('/uploads/locations'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + + $add_files = glob($src."/*.*"); + foreach($add_files as $add_file){ + $file_to_copy = str_replace($src,$dst,$add_file); + copy($add_file, $file_to_copy); + } + } } diff --git a/database/seeds/ManufacturerSeeder.php b/database/seeds/ManufacturerSeeder.php index 262e14a0d3..f6d9a2451e 100644 --- a/database/seeds/ManufacturerSeeder.php +++ b/database/seeds/ManufacturerSeeder.php @@ -17,6 +17,27 @@ class ManufacturerSeeder extends Seeder factory(Manufacturer::class, 1)->states('polycom')->create(); // 8 factory(Manufacturer::class, 1)->states('adobe')->create(); // 9 factory(Manufacturer::class, 1)->states('avery')->create(); // 10 + factory(Manufacturer::class, 1)->states('crucial')->create(); // 10 + + $src = public_path('/img/demo/manufacturers'); + $dst = public_path('/uploads/manufacturers'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + + $add_files = glob($src."/*.*"); + foreach($add_files as $add_file){ + $file_to_copy = str_replace($src,$dst,$add_file); + copy($add_file, $file_to_copy); + } + } + + } diff --git a/database/seeds/SupplierSeeder.php b/database/seeds/SupplierSeeder.php index 95fd894c02..87ca416abd 100644 --- a/database/seeds/SupplierSeeder.php +++ b/database/seeds/SupplierSeeder.php @@ -8,5 +8,23 @@ class SupplierSeeder extends Seeder { Supplier::truncate(); factory(Supplier::class, 5)->create(); + + $src = public_path('/img/demo/suppliers'); + $dst = public_path('/uploads/suppliers'); + + $del_files = glob($dst."/*.*"); + + foreach($del_files as $del_file){ // iterate files + if(is_file($del_file)) + unlink($del_file); // delete file + } + + + $add_files = glob($src."/*.*"); + foreach($add_files as $add_file){ + $file_to_copy = str_replace($src,$dst,$add_file); + copy($add_file, $file_to_copy); + } + } } diff --git a/database/seeds/UserSeeder.php b/database/seeds/UserSeeder.php index 9e088df426..348a26a6b4 100644 --- a/database/seeds/UserSeeder.php +++ b/database/seeds/UserSeeder.php @@ -18,5 +18,6 @@ class UserSeeder extends Seeder factory(User::class, 3)->states('superuser')->create(); factory(User::class, 3)->states('admin')->create(); factory(User::class, 50)->states('view-assets')->create(); + } } diff --git a/public/img/demo/locations/1.jpg b/public/img/demo/locations/1.jpg new file mode 100644 index 0000000000..607e155021 Binary files /dev/null and b/public/img/demo/locations/1.jpg differ diff --git a/public/img/demo/locations/2.jpg b/public/img/demo/locations/2.jpg new file mode 100644 index 0000000000..5eb4f09170 Binary files /dev/null and b/public/img/demo/locations/2.jpg differ diff --git a/public/img/demo/locations/3.jpg b/public/img/demo/locations/3.jpg new file mode 100644 index 0000000000..ce6c3ef99a Binary files /dev/null and b/public/img/demo/locations/3.jpg differ diff --git a/public/img/demo/locations/4.jpg b/public/img/demo/locations/4.jpg new file mode 100644 index 0000000000..607e155021 Binary files /dev/null and b/public/img/demo/locations/4.jpg differ diff --git a/public/img/demo/locations/5.jpg b/public/img/demo/locations/5.jpg new file mode 100644 index 0000000000..f7672342f9 Binary files /dev/null and b/public/img/demo/locations/5.jpg differ diff --git a/public/img/demo/locations/6.jpg b/public/img/demo/locations/6.jpg new file mode 100644 index 0000000000..75d0321d87 Binary files /dev/null and b/public/img/demo/locations/6.jpg differ diff --git a/public/img/demo/locations/7.jpg b/public/img/demo/locations/7.jpg new file mode 100644 index 0000000000..c3444e9375 Binary files /dev/null and b/public/img/demo/locations/7.jpg differ diff --git a/public/img/demo/locations/8.jpg b/public/img/demo/locations/8.jpg new file mode 100644 index 0000000000..7a52edbf1a Binary files /dev/null and b/public/img/demo/locations/8.jpg differ diff --git a/public/img/demo/locations/9.jpg b/public/img/demo/locations/9.jpg new file mode 100644 index 0000000000..d4cc1467fc Binary files /dev/null and b/public/img/demo/locations/9.jpg differ diff --git a/public/img/demo/manufacturers/adobe.jpg b/public/img/demo/manufacturers/adobe.jpg new file mode 100644 index 0000000000..91bc923841 Binary files /dev/null and b/public/img/demo/manufacturers/adobe.jpg differ diff --git a/public/img/demo/manufacturers/apple.jpg b/public/img/demo/manufacturers/apple.jpg new file mode 100644 index 0000000000..b828f84d71 Binary files /dev/null and b/public/img/demo/manufacturers/apple.jpg differ diff --git a/public/img/demo/manufacturers/asus.png b/public/img/demo/manufacturers/asus.png new file mode 100644 index 0000000000..969b8260eb Binary files /dev/null and b/public/img/demo/manufacturers/asus.png differ diff --git a/public/img/demo/manufacturers/avery.png b/public/img/demo/manufacturers/avery.png new file mode 100644 index 0000000000..882d82cce2 Binary files /dev/null and b/public/img/demo/manufacturers/avery.png differ diff --git a/public/img/demo/manufacturers/crucial.jpg b/public/img/demo/manufacturers/crucial.jpg new file mode 100644 index 0000000000..33f38abffa Binary files /dev/null and b/public/img/demo/manufacturers/crucial.jpg differ diff --git a/public/img/demo/manufacturers/dell.png b/public/img/demo/manufacturers/dell.png new file mode 100644 index 0000000000..452d53aeb9 Binary files /dev/null and b/public/img/demo/manufacturers/dell.png differ diff --git a/public/img/demo/manufacturers/hp.png b/public/img/demo/manufacturers/hp.png new file mode 100644 index 0000000000..1bc6b32f9a Binary files /dev/null and b/public/img/demo/manufacturers/hp.png differ diff --git a/public/img/demo/manufacturers/lenovo.jpg b/public/img/demo/manufacturers/lenovo.jpg new file mode 100644 index 0000000000..cfa899a9a7 Binary files /dev/null and b/public/img/demo/manufacturers/lenovo.jpg differ diff --git a/public/img/demo/manufacturers/lg.jpg b/public/img/demo/manufacturers/lg.jpg new file mode 100644 index 0000000000..3c0a731787 Binary files /dev/null and b/public/img/demo/manufacturers/lg.jpg differ diff --git a/public/img/demo/manufacturers/microsoft.png b/public/img/demo/manufacturers/microsoft.png new file mode 100644 index 0000000000..9f7e2ca853 Binary files /dev/null and b/public/img/demo/manufacturers/microsoft.png differ diff --git a/public/img/demo/manufacturers/polycom.png b/public/img/demo/manufacturers/polycom.png new file mode 100644 index 0000000000..fa7027a396 Binary files /dev/null and b/public/img/demo/manufacturers/polycom.png differ diff --git a/public/img/demo/models/cx3000.png b/public/img/demo/models/cx3000.png new file mode 100644 index 0000000000..8cc055b36a Binary files /dev/null and b/public/img/demo/models/cx3000.png differ diff --git a/public/img/demo/models/imacpro.jpg b/public/img/demo/models/imacpro.jpg new file mode 100644 index 0000000000..24b8c85e12 Binary files /dev/null and b/public/img/demo/models/imacpro.jpg differ diff --git a/public/img/demo/models/ipad.jpg b/public/img/demo/models/ipad.jpg new file mode 100644 index 0000000000..6dbbecb8cd Binary files /dev/null and b/public/img/demo/models/ipad.jpg differ diff --git a/public/img/demo/models/iphone6.jpg b/public/img/demo/models/iphone6.jpg new file mode 100644 index 0000000000..5a0bc9ba0f Binary files /dev/null and b/public/img/demo/models/iphone6.jpg differ diff --git a/public/img/demo/models/iphone7.jpg b/public/img/demo/models/iphone7.jpg new file mode 100644 index 0000000000..4d73fb6e40 Binary files /dev/null and b/public/img/demo/models/iphone7.jpg differ diff --git a/public/img/demo/models/lenovoi5.png b/public/img/demo/models/lenovoi5.png new file mode 100644 index 0000000000..85eb798bc5 Binary files /dev/null and b/public/img/demo/models/lenovoi5.png differ diff --git a/public/img/demo/models/macbookair.jpg b/public/img/demo/models/macbookair.jpg new file mode 100644 index 0000000000..6b175dcaf9 Binary files /dev/null and b/public/img/demo/models/macbookair.jpg differ diff --git a/public/img/demo/models/mbp.jpg b/public/img/demo/models/mbp.jpg new file mode 100644 index 0000000000..1b8205d993 Binary files /dev/null and b/public/img/demo/models/mbp.jpg differ diff --git a/public/img/demo/models/optiplex.jpg b/public/img/demo/models/optiplex.jpg new file mode 100644 index 0000000000..095652e1eb Binary files /dev/null and b/public/img/demo/models/optiplex.jpg differ diff --git a/public/img/demo/models/soundstation.jpg b/public/img/demo/models/soundstation.jpg new file mode 100644 index 0000000000..1845351ea0 Binary files /dev/null and b/public/img/demo/models/soundstation.jpg differ diff --git a/public/img/demo/models/spectre.jpg b/public/img/demo/models/spectre.jpg new file mode 100644 index 0000000000..34e7031265 Binary files /dev/null and b/public/img/demo/models/spectre.jpg differ diff --git a/public/img/demo/models/surface.jpg b/public/img/demo/models/surface.jpg new file mode 100644 index 0000000000..2eb9e4e1de Binary files /dev/null and b/public/img/demo/models/surface.jpg differ diff --git a/public/img/demo/models/tab3.png b/public/img/demo/models/tab3.png new file mode 100644 index 0000000000..56b3b22012 Binary files /dev/null and b/public/img/demo/models/tab3.png differ diff --git a/public/img/demo/models/ultrafine.jpg b/public/img/demo/models/ultrafine.jpg new file mode 100644 index 0000000000..c5df4551ab Binary files /dev/null and b/public/img/demo/models/ultrafine.jpg differ diff --git a/public/img/demo/models/ultrasharp.jpg b/public/img/demo/models/ultrasharp.jpg new file mode 100644 index 0000000000..f43f947c36 Binary files /dev/null and b/public/img/demo/models/ultrasharp.jpg differ diff --git a/public/img/demo/models/xps.jpg b/public/img/demo/models/xps.jpg new file mode 100644 index 0000000000..ab22855ee5 Binary files /dev/null and b/public/img/demo/models/xps.jpg differ diff --git a/public/img/demo/models/yoga.png b/public/img/demo/models/yoga.png new file mode 100644 index 0000000000..94263b997e Binary files /dev/null and b/public/img/demo/models/yoga.png differ diff --git a/public/img/demo/models/zenbook.jpg b/public/img/demo/models/zenbook.jpg new file mode 100644 index 0000000000..e6258c72e8 Binary files /dev/null and b/public/img/demo/models/zenbook.jpg differ diff --git a/public/js/build/all.js b/public/js/build/all.js index 77b01e8123..e87707b132 100644 Binary files a/public/js/build/all.js and b/public/js/build/all.js differ diff --git a/public/js/dist/all.js b/public/js/dist/all.js index 77b01e8123..e87707b132 100644 Binary files a/public/js/dist/all.js and b/public/js/dist/all.js differ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 0d1c1b7ee3..c9ebcd0a57 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -8,7 +8,7 @@ "/css/app.css.map": "/css/app.css.map?id=bdbe05e6ecd70ccfac72", "/css/overrides.css.map": "/css/overrides.css.map?id=898c91d4a425b01b589b", "/css/dist/all.css": "/css/dist/all.css?id=7c3842d2639193ac7e88", - "/js/dist/all.js": "/js/dist/all.js?id=f14abfc2506d42ffb0f5", + "/js/dist/all.js": "/js/dist/all.js?id=45f8944e6ec45cec9861", "/css/build/all.css": "/css/build/all.css?id=7c3842d2639193ac7e88", - "/js/build/all.js": "/js/build/all.js?id=f14abfc2506d42ffb0f5" + "/js/build/all.js": "/js/build/all.js?id=45f8944e6ec45cec9861" } \ No newline at end of file diff --git a/public/uploads/categories/.gitignore b/public/uploads/categories/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/categories/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/companies/.gitignore b/public/uploads/companies/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/companies/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/components/.gitignore b/public/uploads/components/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/components/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/consumables/.gitignore b/public/uploads/consumables/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/consumables/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/departments/.gitignore b/public/uploads/departments/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/departments/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/locations/.gitignore b/public/uploads/locations/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/locations/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/public/uploads/manufacturers/.gitignore b/public/uploads/manufacturers/.gitignore new file mode 100755 index 0000000000..f935021a8f --- /dev/null +++ b/public/uploads/manufacturers/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/resources/assets/js/snipeit.js b/resources/assets/js/snipeit.js index 1d4d3d99b6..bad715b012 100755 --- a/resources/assets/js/snipeit.js +++ b/resources/assets/js/snipeit.js @@ -180,14 +180,78 @@ $(document).ready(function () { } $('.datepicker').datepicker(); - $(document).ready(function() { - $("#toggle_nav").toggle(function() { + var datepicker = $.fn.datepicker.noConflict(); // return $.fn.datepicker to previously assigned value + $.fn.bootstrapDP = datepicker; + $('.datepicker').datepicker(); + + // Crazy select2 rich dropdowns with images! + $('.js-data-ajax').each( function (i,item) { + var link = $(item); + var endpoint = link.data("endpoint"); + var select = link.data("select"); + + link.select2({ + + ajax: { + url: baseUrl + '/api/v1/' + endpoint + '/selectlist', + dataType: 'json', + delay: 250, + headers: { + "X-Requested-With": 'XMLHttpRequest', + "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') + }, + data: function (params) { + var data = { + search: params.term, + page: params.page || 1 + }; + return data; + }, + processResults: function (data, params) { + + params.page = params.page || 1; + + var answer = { + results: data.items, + pagination: { + more: "true" //(params.page < data.page_count) + } + }; + + return answer; + }, + cache: true + }, + escapeMarkup: function (markup) { return markup; }, // let our custom formatter work + templateResult: formatDatalist, + templateSelection: formatDataSelection }); + }); + function formatDatalist (datalist) { + var loading_markup = ' Loading...'; + if (datalist.loading) { + return loading_markup; + } + var markup = "
" ; + markup +="
"; + if (datalist.image) { + markup += ""; + } else { + markup += "
"; + } + markup += "
" + datalist.text + "
"; + markup += "
"; + return markup; + } + + function formatDataSelection (datalist) { + return datalist.text; + } diff --git a/resources/assets/js/snipeit_modals.js b/resources/assets/js/snipeit_modals.js index 3aefffb894..8863a45216 100644 --- a/resources/assets/js/snipeit_modals.js +++ b/resources/assets/js/snipeit_modals.js @@ -95,10 +95,14 @@ // clicked 'add' on to add a new 'thing' // this code adds the newly created object to that select var selector = document.getElementById(select); + console.warn("The selector we should've selecte dis: "+select); + console.dir(selector); if(!selector) { return false; } + console.warn("onChange Selector Thing should've activated? Here's the selector"); + console.dir(selector); selector.options[selector.length] = new Option(name, id); selector.selectedIndex = selector.length - 1; $(selector).trigger("change"); diff --git a/resources/lang/en/general.php b/resources/lang/en/general.php index b7aa8cf442..854787ed91 100644 --- a/resources/lang/en/general.php +++ b/resources/lang/en/general.php @@ -2,14 +2,14 @@ return [ 'accessories' => 'Accessories', - 'activated' => 'Activated', + 'activated' => 'Activated', 'accessory' => 'Accessory', - 'accessory_report' => 'Accessory Report', + 'accessory_report' => 'Accessory Report', 'action' => 'Action', 'activity_report' => 'Activity Report', 'address' => 'Address', 'admin' => 'Admin', - 'add_seats' => 'Added seats', + 'add_seats' => 'Added seats', 'all_assets' => 'All Assets', 'all' => 'All', 'archived' => 'Archived', @@ -40,9 +40,9 @@ 'checkout' => 'Checkout', 'city' => 'City', 'click_here' => 'Click here', - 'companies' => 'Companies', + 'companies' => 'Companies', 'company' => 'Company', - 'component' => 'Component', + 'component' => 'Component', 'components' => 'Components', 'complete' => 'Complete', 'consumable' => 'Consumable', @@ -58,10 +58,10 @@ 'custom_report' => 'Custom Asset Report', 'dashboard' => 'Dashboard', 'days' => 'days', - 'days_to_next_audit' => 'Days to Next Audit', + 'days_to_next_audit' => 'Days to Next Audit', 'date' => 'Date', 'debug_warning' => 'Warning!', - 'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the APP_DEBUG value in your .env file to false.', + 'debug_warning_text' => 'This application is running in production mode with debugging enabled. This can expose sensitive data if your application is accessible to the outside world. Disable debug mode by setting the APP_DEBUG value in your .env file to false.', 'delete' => 'Delete', 'deleted' => 'Deleted', 'delete_seats' => 'Deleted Seats', @@ -89,6 +89,7 @@ 'history' => 'History', 'history_for' => 'History for', 'id' => 'ID', + 'image' => 'Image', 'image_delete' => 'Delete Image', 'image_upload' => 'Upload Image', 'import' => 'Import', diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 1e902ebbbd..ee4ecbda4c 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -87,6 +87,7 @@ return array( 'unique' => 'The :attribute has already been taken.', 'uploaded' => 'The :attribute failed to upload.', 'url' => 'The :attribute format is invalid.', + "unique_undeleted" => "The :attribute must be unique.", /* |-------------------------------------------------------------------------- @@ -117,7 +118,6 @@ return array( "hashed_pass" => "Your current password is incorrect", 'dumbpwd' => 'That password is too common.', "statuslabel_type" => "You must select a valid status label type", - "unique_undeleted" => "The :attribute must be unique.", ], /* diff --git a/resources/views/accessories/checkout.blade.php b/resources/views/accessories/checkout.blade.php index 830e9492a8..e9230c73e8 100755 --- a/resources/views/accessories/checkout.blade.php +++ b/resources/views/accessories/checkout.blade.php @@ -51,16 +51,7 @@ -
- -
- {{ Form::select('assigned_to', $users_list , Input::old('assigned_to', $accessory->assigned_to), array('class'=>'select2', 'style'=>'min-width:350px')) }} - {!! $errors->first('assigned_to', ' :message') !!} -
-
+ @include ('partials.forms.edit.user-select', ['translated_name' => trans('general.select_user'), 'fieldname' => 'assigned_to']) @if ($accessory->category->require_acceptance=='1')
diff --git a/resources/views/accessories/edit.blade.php b/resources/views/accessories/edit.blade.php index 4c361682ad..2e9d278d80 100755 --- a/resources/views/accessories/edit.blade.php +++ b/resources/views/accessories/edit.blade.php @@ -9,12 +9,12 @@ {{-- Page content --}} @section('inputFields') -@include ('partials.forms.edit.company') +@include ('partials.forms.edit.company-select', ['translated_name' => trans('general.company'), 'fieldname' => 'company_id']) @include ('partials.forms.edit.name', ['translated_name' => trans('admin/accessories/general.accessory_name')]) -@include ('partials.forms.edit.category') -@include ('partials.forms.edit.supplier') -@include ('partials.forms.edit.manufacturer') -@include ('partials.forms.edit.location') +@include ('partials.forms.edit.category-select', ['translated_name' => trans('general.category'), 'fieldname' => 'category_id']) +@include ('partials.forms.edit.supplier-select', ['translated_name' => trans('general.supplier'), 'fieldname' => 'supplier_id']) +@include ('partials.forms.edit.manufacturer-select', ['translated_name' => trans('general.manufacturer'), 'fieldname' => 'manufacturer_id']) +@include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'location_id']) @include ('partials.forms.edit.model_number') @include ('partials.forms.edit.order_number') @include ('partials.forms.edit.purchase_date') diff --git a/resources/views/account/profile.blade.php b/resources/views/account/profile.blade.php index b1e81d717e..3b8cddba0f 100755 --- a/resources/views/account/profile.blade.php +++ b/resources/views/account/profile.blade.php @@ -19,7 +19,7 @@
-
+
{!! $errors->first('first_name', ' :message') !!}
@@ -30,24 +30,15 @@ -
+
{!! $errors->first('last_name', ' :message') !!}
+ -
- -
-
- {{ Form::select('location_id', $location_list , Input::old('location_id', $user->location_id), array('class'=>'select2', 'style'=>'width:300px')) }} - {!! $errors->first('location_id', ' :message') !!} -
-
-
+ @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'fieldname' => 'location_id'])
@@ -62,7 +53,7 @@
-
+
{!! $errors->first('website', ' :message') !!}
@@ -73,7 +64,7 @@ -
+
{!! $errors->first('gravatar', ' :message') !!}

@@ -87,7 +78,7 @@ @if ($user->avatar)

-
+
{{ Form::checkbox('avatar_delete') }} {!! $errors->first('avatar_delete', ':message') !!} @@ -97,7 +88,7 @@
-
+
{{ Form::file('avatar') }} {!! $errors->first('avatar', ':message') !!}
diff --git a/resources/views/account/requestable-assets.blade.php b/resources/views/account/requestable-assets.blade.php index e518624899..af4b71a3a6 100644 --- a/resources/views/account/requestable-assets.blade.php +++ b/resources/views/account/requestable-assets.blade.php @@ -62,8 +62,8 @@ {{ $asset->serial }} - @if ($asset->assetloc) - {!! $asset->assetloc->present()->nameUrl() !!} + @if ($asset->location) + {!! $asset->location->present()->nameUrl() !!} @endif @if ($asset->assigned_to != '' && $asset->assigned_to > 0) diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php index 6371db1950..ef995c9d0d 100755 --- a/resources/views/categories/edit.blade.php +++ b/resources/views/categories/edit.blade.php @@ -61,11 +61,33 @@ {{ trans('admin/categories/general.checkin_email') }}
+ + +@if ($item->image) +
+ +
+ {{ Form::checkbox('image_delete') }} + + {!! $errors->first('image_delete', ':message') !!} +
+
+@endif + +
+ +
+ {{ Form::file('image') }} + {!! $errors->first('image', ':message') !!} +
+
+ @stop @section('content') @parent + @if ($snipeSettings->default_eula_text!='')
@endif + + + @stop diff --git a/resources/views/companies/edit.blade.php b/resources/views/companies/edit.blade.php index daa3eba9e8..46d55f6532 100644 --- a/resources/views/companies/edit.blade.php +++ b/resources/views/companies/edit.blade.php @@ -9,4 +9,25 @@ {{-- Page content --}} @section('inputFields') @include ('partials.forms.edit.name', ['translated_name' => trans('admin/companies/table.name')]) + + +@if ($item->image) +
+ +
+ {{ Form::checkbox('image_delete') }} + + {!! $errors->first('image_delete', ':message') !!} +
+
+@endif + +
+ +
+ {{ Form::file('image') }} + {!! $errors->first('image', ':message') !!} +
+
+ @stop diff --git a/resources/views/components/checkout.blade.php b/resources/views/components/checkout.blade.php index 8796d5846a..5d26e10b59 100644 --- a/resources/views/components/checkout.blade.php +++ b/resources/views/components/checkout.blade.php @@ -36,23 +36,17 @@ @endif -
- -
- {{ Form::select('asset_id', $assets_list , Input::old('asset_id', $component->asset_id), array('class'=>'select2', 'style'=>'width:100%')) }} - {!! $errors->first('asset_id', ' :message') !!} -
-
+ @include ('partials.forms.edit.asset-select', ['translated_name' => trans('general.select_asset'), 'fieldname' => 'asset_id']) -
- -
- - {!! $errors->first('assigned_qty', '
:message') !!} +
+ +
+ + {!! $errors->first('assigned_qty', '
:message') !!} +
-
+