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