diff --git a/.env.example b/.env.example index 2a34e9ae2..51f9e3e5b 100644 --- a/.env.example +++ b/.env.example @@ -97,7 +97,8 @@ LOGIN_LOCKOUT_DURATION=60 # -------------------------------------------- # OPTIONAL: MISC # -------------------------------------------- -APP_LOG=single +APP_LOG=daily +APP_LOG_MAX_FILES=10 APP_LOCKED=false FILESYSTEM_DISK=local APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1 diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 8db3bea15..acc3eb022 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -146,39 +146,40 @@ class AssetsController extends Controller $assets->withTrashed()->Deleted(); break; case 'Pending': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',0) - ->where('status_labels.pending','=',1) - ->where('status_labels.archived', '=', 0); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',0) + ->where('status_alias.pending','=',1) + ->where('status_alias.archived', '=', 0); }); break; case 'RTD': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',1) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 0); + $assets->whereNull('assets.assigned_to') + ->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',1) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 0); }); break; case 'Undeployable': $assets->Undeployable(); break; case 'Archived': - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',0) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 1); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',0) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 1); }); break; case 'Requestable': $assets->where('assets.requestable', '=', 1) - ->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.deployable','=',1) - ->where('status_labels.pending','=',0) - ->where('status_labels.archived', '=', 0); + ->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.deployable','=',1) + ->where('status_alias.pending','=',0) + ->where('status_alias.archived', '=', 0); }); break; @@ -188,9 +189,9 @@ class AssetsController extends Controller break; default: // terrible workaround for complex-query Laravel bug in fulltext - $assets->join('status_labels',function ($join) { - $join->on('status_labels.id', "=", "assets.status_id") - ->where('status_labels.archived', '=', 0); + $assets->join('status_labels AS status_alias',function ($join) { + $join->on('status_alias.id', "=", "assets.status_id") + ->where('status_alias.archived', '=', 0); }); } diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 65338723c..f3be10cf7 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -57,7 +57,6 @@ class UsersController extends Controller $users = $users->GetDeleted(); } - if ($request->has('company_id')) { $users = $users->where('company_id', '=', $request->input('company_id')); } @@ -65,6 +64,10 @@ class UsersController extends Controller if ($request->has('location_id')) { $users = $users->where('location_id', '=', $request->input('location_id')); } + + if ($request->has('group_id')) { + $users = $users->ByGroup($request->has('group_id')); + } if ($request->has('department_id')) { $users = $users->where('department_id','=',$request->input('department_id')); diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php index c2519fcc6..fabccf190 100755 --- a/app/Http/Controllers/GroupsController.php +++ b/app/Http/Controllers/GroupsController.php @@ -87,10 +87,15 @@ class GroupsController extends Controller public function edit($id = null) { $group = Group::find($id); - $permissions = config('permissions'); - $groupPermissions = $group->decodePermissions(); - $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); - return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); + + if ($group) { + $permissions = config('permissions'); + $groupPermissions = $group->decodePermissions(); + $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); + return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); + } + + return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } /** @@ -142,4 +147,24 @@ class GroupsController extends Controller return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } + /** + * Returns a view that invokes the ajax tables which actually contains + * the content for the group detail page. + * + * @author [A. Gianotto] [] + * @param int $locationId + * @since [v4.0.11] + * @return \Illuminate\Contracts\View\View + */ + public function show($id) + { + $group = Group::find($id); + + if ($group) { + return view('groups/view', compact('group')); + } + + return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); + } + } diff --git a/app/Models/Asset.php b/app/Models/Asset.php index d8df3f788..889396928 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -781,14 +781,11 @@ class Asset extends Depreciable $query->where('locations.name', 'LIKE', '%'.$search.'%'); }); })->orWhere(function ($query) use ($search) { - - $query->whereHas('assignedTo', function ($query) use ($search) { $query->where('users.first_name', 'LIKE', '%'.$search.'%') ->orWhere('users.last_name', 'LIKE', '%'.$search.'%') ->orWhere('users.username', 'LIKE', '%'.$search.'%') ->orWhere('locations.name', 'LIKE', '%'.$search.'%') ->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%'); - }); })->orWhere('assets.name', 'LIKE', '%'.$search.'%') ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') ->orWhere('assets.serial', 'LIKE', '%'.$search.'%') diff --git a/app/Models/User.php b/app/Models/User.php index cbe0a2b60..0639865a8 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -378,6 +378,14 @@ class User extends SnipeModel implements AuthenticatableContract, CanResetPasswo return json_decode($this->permissions, true); } + + public function scopeByGroup($query, $id) { + return $query->whereHas('groups', function ($query) use ($id) { + $query->where('id', '=', $id); + }); + } + + /** * Query builder scope to search on text * diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0e885f104..9aea69bec 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -98,8 +98,8 @@ class AppServiceProvider extends ServiceProvider if (config('app.debug')) { $log_level = 'debug'; } else { - if (config('log-level')) { - $log_level = config('log-level'); + if (config('app.log_level')) { + $log_level = config('app.log_level'); } else { $log_level = 'error'; } diff --git a/config/app.php b/config/app.php index 6c9c471a5..08befc236 100755 --- a/config/app.php +++ b/config/app.php @@ -121,8 +121,41 @@ return [ | */ - 'log' => env('APP_LOG', 'single'), - 'log-level' => env('APP_LOG_LEVEL', 'error'), + 'log' => env('APP_LOG', 'daily'), + + /* + |-------------------------------------------------------------------------- + | Logging Max Files + |-------------------------------------------------------------------------- + | + | When using the daily log mode, Laravel will only retain 5 + | days of log files by default. + | + | To change this, set the APP_LOG_MAX_FILES option in your .env. + | + */ + + 'log_max_files' => env('APP_LOG_MAX_FILES', 5), + + /* + |-------------------------------------------------------------------------- + | Logging Detail + |-------------------------------------------------------------------------- + | + | By default, Laravel writes all log levels to storage. However, in your + | production environment, you may wish to configure the minimum severity that + | should be logged by editing your APP_LOG_LEVEL env config. + | + | Laravel will log all levels greater than or equal to the specified severity. + | For example, a default log_level of error will log error, critical, alert, + | and emergency messages. + | + | APP_LOG_LEVEL options are: + | "debug", "info", "notice", "warning", "error", "critical", "alert", "emergency" + | + */ + + 'log_level' => env('APP_LOG_LEVEL', 'error'), /* diff --git a/config/version.php b/config/version.php index beabd58f8..fb7ce45b1 100644 --- a/config/version.php +++ b/config/version.php @@ -1,7 +1,7 @@ 'v4.0.11', - 'build_version' => '264', - 'hash_version' => 'gc776fa4', - 'full_hash' => 'v4.0.11-264-gc776fa4', + 'app_version' => 'v4.0.12', + 'build_version' => '272', + 'hash_version' => 'gea63ced', + 'full_hash' => 'v4.0.12-272-gea63ced', ); diff --git a/resources/views/account/requestable-assets.blade.php b/resources/views/account/requestable-assets.blade.php index 6d492fad8..430570dd5 100644 --- a/resources/views/account/requestable-assets.blade.php +++ b/resources/views/account/requestable-assets.blade.php @@ -60,7 +60,9 @@ {{ $asset->serial }} - {!! $asset->assetLoc->present()->nameUrl() !!} + @if ($asset->assetloc) + {!! $asset->assetloc->present()->nameUrl() !!} + @endif @if ($asset->assigned_to != '' && $asset->assigned_to > 0) Checked out diff --git a/resources/views/account/view-assets.blade.php b/resources/views/account/view-assets.blade.php index a6eb89245..0ba077919 100755 --- a/resources/views/account/view-assets.blade.php +++ b/resources/views/account/view-assets.blade.php @@ -230,7 +230,7 @@ View Assets for {{ $user->present()->fullName() }} id="table" data-cookie="false" data-cookie-id-table="userHistoryTable-{{ config('version.hash_version') }}" - data-url="{{route('api.activity.index', ['user_id' => $user->id, 'order' => 'desc']) }}"> + data-url="{{route('api.activity.index', ['target_id' => $user->id, 'target_type' => 'User', 'order' => 'desc']) }}"> diff --git a/resources/views/groups/index.blade.php b/resources/views/groups/index.blade.php index dc665ea71..140307a9a 100755 --- a/resources/views/groups/index.blade.php +++ b/resources/views/groups/index.blade.php @@ -31,7 +31,7 @@ {{ trans('general.id') }} - {{ trans('admin/groups/table.name') }} + {{ trans('admin/groups/table.name') }} {{ trans('admin/groups/table.users') }} {{ trans('general.created_at') }} {{ trans('table.actions') }} diff --git a/resources/views/groups/view.blade.php b/resources/views/groups/view.blade.php index 875d818ae..a4ce704c0 100644 --- a/resources/views/groups/view.blade.php +++ b/resources/views/groups/view.blade.php @@ -2,56 +2,63 @@ {{-- Page title --}} @section('title') -{{ trans('admin/groups/table.view') }} - -{{ $group->name }} -@parent + {{ $group->name }} + @parent @stop +@section('header_right') + {{ trans('admin/groups/titles.update') }} + {{ trans('general.back') }} +@stop + + + {{-- Page content --}} @section('content') -
-
- - {{ trans('admin/groups/table.update') }} - - - {{ trans('general.back') }} - -

{{ trans('admin/groups/titles.group_management') }} - {{ $group->name }}

-
-
+
+
+
+
+
+
+
+ + -
- - - - - - - @foreach ($users as $user) - - - - @endforeach - -
{{ trans('admin/groups/table.name') }}
- {{ $user->first_name }} {{ $user->last_name }} -
- - @else -
-
- - {{ trans('general.no_results') }} + +
+
+
- @endif
-
-
+
+ +
    + @foreach ($group->decodePermissions() as $permission_name => $permission) +
  • {!! ($permission == '1') ? '' : '' !!} {{ e(str_replace('.', ': ', ucwords($permission_name))) }}
  • + @endforeach + +
+ +
+
+ +@stop + +@section('moar_scripts') + @include ('partials.bootstrap-table', [ + 'exportFile' => 'groups-export', + 'search' => true, + 'columns' => \App\Presenters\UserPresenter::dataTableLayout() + ]) + @stop diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php index e640d277a..896cb97ca 100644 --- a/resources/views/partials/bootstrap-table.blade.php +++ b/resources/views/partials/bootstrap-table.blade.php @@ -332,6 +332,21 @@ $('.snipe-table').bootstrapTable({ } } + function groupsFormatter(value) { + + if (value) { + var groups = ''; + for (var index in value.rows) { + groups += ' ' + value.rows[index].name + ' '; + } + return groups; + } + } + + function groupsAdminLinkFormatter(value, row) { + return ' ' + value + ''; + } + function trueFalseFormatter(value, row) { if ((value) && ((value == 'true') || (value == '1'))) { return ''; diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 29a7d6bf0..1fcd3a10b 100755 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -86,20 +86,5 @@ 'columns' => \App\Presenters\UserPresenter::dataTableLayout() ]) - @stop diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php index 340d5e288..05389e4c3 100755 --- a/resources/views/users/view.blade.php +++ b/resources/views/users/view.blade.php @@ -536,7 +536,6 @@ $(function () { $('.progress-checkmark').fadeIn('fast').html(''); $.each(data.result.file, function (index, file) { $('' + file.notes + '<' + file.name + 'Just now' + file.filesize + ' Process').prependTo("#upload-table > tbody"); - //$('').text(file.name).appendTo(document.body); }); } $('#progress').removeClass('active'); diff --git a/routes/web.php b/routes/web.php index 31bda2239..bb78fa8a8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -190,7 +190,10 @@ Route::group([ 'prefix' => 'admin','middleware' => ['authorize:superuser']], fun Route::get('requests', [ 'as' => 'requests', 'middleware' => 'authorize:admin', 'uses' => 'ViewAssetsController@getRequestedIndex']); - + Route::resource('groups', 'GroupsController', [ + 'middleware' => ['auth'], + 'parameters' => ['group' => 'group_id'] + ]); Route::get('/', ['as' => 'settings.index', 'uses' => 'SettingsController@index' ]); @@ -198,10 +201,7 @@ Route::group([ 'prefix' => 'admin','middleware' => ['authorize:superuser']], fun }); -Route::resource('groups', 'GroupsController', [ - 'middleware' => ['auth'], - 'parameters' => ['group' => 'group_id'] -]); + /* |--------------------------------------------------------------------------