diff --git a/.all-contributorsrc b/.all-contributorsrc index 37d93b9edb..08f923c0d1 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 dff4a34818..94ea0af56a 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! diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php index 43100f8faa..fb0493046f 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/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 489f9829fa..2303da761a 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 { diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php index 4d41ce2323..6e6a50a7ef 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 5906fed929..c744705f1c 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/app/Models/User.php b/app/Models/User.php index a2ef5163ff..bb85516e16 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', @@ -44,6 +44,7 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo 'state', 'country', 'zip', + 'activated', ]; protected $casts = [ diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 59d7e08ad7..ab99bba216 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) diff --git a/routes/api.php b/routes/api.php index c700142652..36646956c3 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