From 94cf1f8741d8bd3dba998d33b438224ea82f098e Mon Sep 17 00:00:00 2001 From: vcordes79 Date: Wed, 17 Jan 2018 14:31:57 +0100 Subject: [PATCH 1/6] Fixes #4829 - add fields api (#4840) * add fields api * change route names --- .../Api/CustomFieldsController.php | 80 ++++++++++++++++++- .../Transformers/CustomFieldsTransformer.php | 1 + app/Models/CustomField.php | 39 ++++++++- routes/api.php | 19 +++-- 4 files changed, 128 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php index 43100f8fa..fb0493046 100644 --- a/app/Http/Controllers/Api/CustomFieldsController.php +++ b/app/Http/Controllers/Api/CustomFieldsController.php @@ -2,11 +2,14 @@ namespace App\Http\Controllers\Api; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Transformers\CustomFieldsTransformer; use App\Models\CustomField; use App\Models\CustomFieldset; use Illuminate\Http\Request; +use Validator; +use Illuminate\Validation\Rule; class CustomFieldsController extends Controller { @@ -27,6 +30,81 @@ class CustomFieldsController extends Controller $total = count($fields); return (new CustomFieldsTransformer)->transformCustomFields($fields, $total); } + + /** + * Shows the given field + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return View + */ + public function show($id) + { + $this->authorize('show', CustomField::class); + if ($field = CustomField::find($id)) { + return (new CustomFieldsTransformer)->transformCustomField($field); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/custom_fields/message.field.invalid')), 200); + } + + /** + * Update the specified field + * + * @author [V. Cordes] [] + * @since [v4.1.10] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', CustomField::class); + $field = CustomField::findOrFail($id); + $data = $request->all(); + + $validator = Validator::make($data, $field->validationRules()); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors())); + } + + $field->fill($data); + + if ($field->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $field, trans('admin/custom_fields/message.field.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); + } + + + /** + * Store a newly created field. + * + * @author [V. Cordes] [] + * @since [v4.1.10] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', CustomField::class); + $field = new CustomField; + + $data = $request->all(); + $validator = Validator::make($data, $field->validationRules()); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors())); + } + $field->fill($data); + + if ($field->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $field, trans('admin/custom_fields/message.field.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); + + } + public function postReorder(Request $request, $id) { $fieldset = CustomFieldset::find($id); @@ -62,7 +140,7 @@ class CustomFieldsController extends Controller if ($field->fieldset->count() >0) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Field is in use.')); } - + $field->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php index 4d41ce232..6e6a50a7e 100644 --- a/app/Http/Transformers/CustomFieldsTransformer.php +++ b/app/Http/Transformers/CustomFieldsTransformer.php @@ -22,6 +22,7 @@ class CustomFieldsTransformer { $array = [ + 'id' => $field->id, 'name' => e($field->name), 'db_column_name' => e($field->db_column_name()), 'format' => e($field->format), diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php index 5906fed92..c744705f1 100644 --- a/app/Models/CustomField.php +++ b/app/Models/CustomField.php @@ -8,6 +8,7 @@ use App\Http\Traits\UniqueUndeletedTrait; use ForceUTF8\Encoding; use EasySlugger\Utf8Slugger; use Patchwork\Utf8; +use Illuminate\Validation\Rule; class CustomField extends Model { @@ -29,8 +30,18 @@ class CustomField extends Model "BOOLEAN" => "boolean", ]; - public $rules = [ - "name" => "required|unique:custom_fields" + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'element', + 'format', + 'field_values', + 'field_encrypted', + 'help_text' ]; // This is confusing, since it's actually the custom fields table that @@ -160,7 +171,7 @@ class CustomField extends Model public function getFormatAttribute($value) { foreach (self::$PredefinedFormats as $name => $pattern) { - if ($pattern === $value) { + if ($pattern === $value || $name === $value) { return $name; } } @@ -248,4 +259,26 @@ class CustomField extends Model return substr($long_slug, 0, 50) . '_' . $id; } + + /** + * Get validation rules for custom fields to use with Validator + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return Array + */ + public function validationRules() + { + return [ + "name" => "required|unique:custom_fields", + "element" => [ + "required", + Rule::in(['text', 'listbox']) + ], + 'format' => [ + Rule::in(array_merge(array_keys(CustomField::$PredefinedFormats), CustomField::$PredefinedFormats)) + ], + 'field_encrypted' => "nullable|boolean" + ]; + } } diff --git a/routes/api.php b/routes/api.php index c70014265..36646956c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -200,6 +200,18 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () { /*--- Fields API ---*/ + Route::resource('fields', 'CustomFieldsController', [ + 'names' => [ + 'index' => 'api.customfields.index', + 'show' => 'api.customfields.show', + 'store' => 'api.customfields.store', + 'update' => 'api.customfields.update', + 'destroy' => 'api.customfields.destroy' + ], + 'except' => [ 'create', 'edit' ], + 'parameters' => [ 'field' => 'field_id' ] + ]); + Route::group(['prefix' => 'fields'], function () { Route::post('fieldsets/{id}/order', [ @@ -207,13 +219,6 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () { 'uses' => 'CustomFieldsController@postReorder' ] ); - - Route::get('/', - [ - 'as' => 'api.customfields.index', - 'uses' => 'CustomFieldsController@index' - ] - ); }); // Fields group From 52a99faf68270defd1a648a31e9f6a0894a76e75 Mon Sep 17 00:00:00 2001 From: vcordes79 Date: Wed, 17 Jan 2018 14:33:55 +0100 Subject: [PATCH 2/6] fix phone number update in api (#4842) --- app/Models/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/User.php b/app/Models/User.php index a2ef5163f..da47cd51f 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -36,7 +36,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo 'jobtitle', 'location_id', 'password', - 'phone_number', + 'phone', 'username', 'first_name', 'address', From 9ab05e70376e70319b9ea06e7d685ecdd31f41b6 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Jan 2018 05:36:01 -0800 Subject: [PATCH 3/6] Add @vcordes79 as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 37d93b9ed..08f923c0d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -838,6 +838,15 @@ "contributions": [ "doc" ] + }, + { + "login": "vcordes79", + "name": "vcordes79", + "avatar_url": "https://avatars1.githubusercontent.com/u/10672546?v=4", + "profile": "https://github.com/vcordes79", + "contributions": [ + "code" + ] } ] } diff --git a/README.md b/README.md index dff4a3481..94ea0af56 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-90-orange.svg?style=flat-square)](#contributors) +[![All Contributors](https://img.shields.io/badge/all_contributors-91-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") | [
Danielle](https://github.com/techincolor)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | [
Lawrence](https://github.com/TheVakman)
[⚠️](https://github.com/snipe/snipe-it/commits?author=TheVakman "Tests") [πŸ›](https://github.com/snipe/snipe-it/issues?q=author%3ATheVakman "Bug reports") | [
uknzaeinozpas](https://github.com/uknzaeinozpas)
[⚠️](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Tests") [πŸ’»](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Code") | [
Ryan](https://github.com/Gelob)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=Gelob "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") | [
Danielle](https://github.com/techincolor)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=techincolor "Documentation") | [
Lawrence](https://github.com/TheVakman)
[⚠️](https://github.com/snipe/snipe-it/commits?author=TheVakman "Tests") [πŸ›](https://github.com/snipe/snipe-it/issues?q=author%3ATheVakman "Bug reports") | [
uknzaeinozpas](https://github.com/uknzaeinozpas)
[⚠️](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Tests") [πŸ’»](https://github.com/snipe/snipe-it/commits?author=uknzaeinozpas "Code") | [
Ryan](https://github.com/Gelob)
[πŸ“–](https://github.com/snipe/snipe-it/commits?author=Gelob "Documentation") | [
vcordes79](https://github.com/vcordes79)
[πŸ’»](https://github.com/snipe/snipe-it/commits?author=vcordes79 "Code") | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! From 96a469db3605d8ad182cfae0f5d00b408200be8e Mon Sep 17 00:00:00 2001 From: vcordes79 Date: Wed, 17 Jan 2018 14:38:10 +0100 Subject: [PATCH 4/6] allow changing user activated field via api (#4843) --- app/Models/User.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Models/User.php b/app/Models/User.php index da47cd51f..bb85516e1 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -44,6 +44,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo 'state', 'country', 'zip', + 'activated', ]; protected $casts = [ From 91bca5fcbaa2265c0bca76b7d7acdb8c58180743 Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Jan 2018 06:15:52 -0800 Subject: [PATCH 5/6] Fixed #4844 - use input value for ids in user bulk edit --- app/Http/Controllers/UsersController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 489f9829f..2303da761 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -431,7 +431,7 @@ class UsersController extends Controller public function postBulkEdit(Request $request) { $this->authorize('update', User::class); - if ((!Input::has('ids')) || (count(Input::has('ids')) == 0)) { + if ((!Input::has('ids')) || (count(Input::input('ids')) == 0)) { return redirect()->back()->with('error', 'No users selected'); } else { From 24b356dba4d39cab59a4fd8744d791d240a0bc0c Mon Sep 17 00:00:00 2001 From: snipe Date: Wed, 17 Jan 2018 06:27:23 -0800 Subject: [PATCH 6/6] Fixed typos in default blade that cause components to not show up for non-superadmins --- resources/views/layouts/default.blade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 59d7e08ad..ab99bba21 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -479,15 +479,15 @@ @endcan - @can('view', \App\Models\Component::class) - + @can('view', \App\Models\Consumable::class) + {{ trans('general.consumables') }} @endcan - @can('view', \App\Models\Components::class) + @can('view', \App\Models\Component::class)