fix: 🐛 Sorting on admin/users datatable

This commit is contained in:
IceToast 2023-02-15 00:25:59 +01:00 committed by IceToast
parent b25ce96efb
commit a0268f1c47
2 changed files with 124 additions and 73 deletions

View file

@ -7,6 +7,7 @@ use App\Events\UserUpdateCreditsEvent;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User; use App\Models\User;
use App\Notifications\DynamicNotification; use App\Notifications\DynamicNotification;
use App\Traits\DatatablesSortable;
use Exception; use Exception;
use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
@ -26,6 +27,8 @@ use Spatie\QueryBuilder\QueryBuilder;
class UserController extends Controller class UserController extends Controller
{ {
use DatatablesSortable;
private Pterodactyl $pterodactyl; private Pterodactyl $pterodactyl;
public function __construct(Pterodactyl $pterodactyl) public function __construct(Pterodactyl $pterodactyl)
@ -270,9 +273,17 @@ class UserController extends Controller
/** /**
* @throws Exception * @throws Exception
*/ */
public function dataTable() public function dataTable(Request $request)
{ {
$query = User::with(['discordUser', 'servers'])->select('users.*'); $query = User::withCount(['servers'])->with('discordUser');
// manually count referrals in user_referrals table
$query->addSelect(DB::raw('(SELECT COUNT(*) FROM user_referrals WHERE user_referrals.referral_id = users.id) as referrals_count'));
if ($request->has('order')) {
$query = $this->sortByColumn($request->input('order'), $request->input('columns'), $query);
}
return datatables($query) return datatables($query)
->addColumn('avatar', function (User $user) { ->addColumn('avatar', function (User $user) {
@ -284,18 +295,20 @@ class UserController extends Controller
->addColumn('verified', function (User $user) { ->addColumn('verified', function (User $user) {
return $user->getVerifiedStatus(); return $user->getVerifiedStatus();
}) })
->addColumn('servers', function (User $user) { ->addColumn('servers_count', function (User $user) {
return $user->servers->count(); return $user->servers_count;
}) })
->addColumn('referrals', function (User $user) { ->addColumn('referrals_count', function (User $user) {
return DB::table('user_referrals')->where('referral_id', '=', $user->id)->count(); return $user->referrals_count;
}) })
->addColumn('discordId', function (User $user) { ->addColumn('discordId', function (User $user) {
return $user->discordUser ? $user->discordUser->id : ''; return $user->discordUser ? $user->discordUser->id : '';
}) })
->addColumn('last_seen', function (User $user) { ->addColumn('last_seen', function (User $user) {
return ['display' => $user->last_seen ? $user->last_seen->diffForHumans() : '', return [
'raw' => $user->last_seen ? strtotime($user->last_seen) : '', ]; 'display' => $user->last_seen ? $user->last_seen->diffForHumans() : __('Never'),
'raw' => $user->last_seen ? strtotime($user->last_seen) : '',
];
}) })
->addColumn('actions', function (User $user) { ->addColumn('actions', function (User $user) {
$suspendColor = $user->isSuspended() ? 'btn-success' : 'btn-warning'; $suspendColor = $user->isSuspended() ? 'btn-success' : 'btn-warning';
@ -339,9 +352,9 @@ class UserController extends Controller
->editColumn('name', function (User $user) { ->editColumn('name', function (User $user) {
return '<a class="text-info" target="_blank" href="' . config('SETTINGS::SYSTEM:PTERODACTYL:URL') . '/admin/users/view/' . $user->pterodactyl_id . '">' . strip_tags($user->name) . '</a>'; return '<a class="text-info" target="_blank" href="' . config('SETTINGS::SYSTEM:PTERODACTYL:URL') . '/admin/users/view/' . $user->pterodactyl_id . '">' . strip_tags($user->name) . '</a>';
}) })
/*->orderColumn('last_seen', function ($query) { ->orderColumn('last_seen', function ($query) {
$query->orderBy('last_seen', "desc"); $query->orderBy('last_seen', "desc");
})*/ })
->rawColumns(['avatar', 'name', 'credits', 'role', 'usage', 'referrals', 'actions', 'last_seen']) ->rawColumns(['avatar', 'name', 'credits', 'role', 'usage', 'referrals', 'actions', 'last_seen'])
->make(true); ->make(true);
} }

View file

@ -11,7 +11,8 @@
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{ route('home') }}">{{ __('Dashboard') }}</a></li> <li class="breadcrumb-item"><a href="{{ route('home') }}">{{ __('Dashboard') }}</a></li>
<li class="breadcrumb-item"><a class="text-muted" href="{{route('admin.users.index')}}">{{__('Users')}}</a></li> <li class="breadcrumb-item"><a class="text-muted"
href="{{ route('admin.users.index') }}">{{ __('Users') }}</a></li>
</ol> </ol>
</div> </div>
</div> </div>
@ -47,7 +48,7 @@
<th>{{ __('Email') }}</th> <th>{{ __('Email') }}</th>
<th>{{ CREDITS_DISPLAY_NAME }}</th> <th>{{ CREDITS_DISPLAY_NAME }}</th>
<th>{{ __('Servers') }}</th> <th>{{ __('Servers') }}</th>
<th>{{__("Referrals")}}</th> <th>{{ __('Referrals') }}</th>
<th>{{ __('Verified') }}</th> <th>{{ __('Verified') }}</th>
<th>{{ __('Last seen') }}</th> <th>{{ __('Last seen') }}</th>
<th></th> <th></th>
@ -74,27 +75,67 @@
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
$('#datatable').DataTable({ $('#datatable').DataTable({
language: { language: {
url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{ config('SETTINGS::LOCALE:DATATABLES') }}.json'
}, },
processing: true, processing: true,
serverSide: true, //why was this set to false before? increased loadingtimes by 10 seconds serverSide: true, //why was this set to false before? increased loadingtimes by 10 seconds
stateSave: true, stateSave: true,
ajax: "{{ route('admin.users.datatable') }}", ajax: "{{ route('admin.users.datatable') }}",
order: [[ 11, "asc" ]],
columns: [ columns: [{
{data: 'discordId', visible: false, name: 'discordUser.id'}, data: 'discordId',
{data: 'pterodactyl_id', visible: false}, visible: false,
{data: 'ip', visible: false}, name: 'discordUser.id'
{data: 'avatar' , sortable : false}, },
{data: 'name'}, {
{data: 'role'}, data: 'pterodactyl_id',
{data: 'email', name: 'users.email'}, visible: false
{data: 'credits' , name : 'users.credits'}, },
{data: 'servers'}, {
{data: 'referrals'}, data: 'ip',
{data: 'verified' , sortable : false}, visible: false
{data: 'last_seen', type: 'num', render: {_: 'display', sort: 'raw'}}, },
{data: 'actions' , sortable : false}, {
data: 'avatar',
sortable: false
},
{
data: 'name'
},
{
data: 'role'
},
{
data: 'email',
name: 'users.email'
},
{
data: 'credits',
name: 'users.credits'
},
{
data: 'servers_count'
},
{
data: 'referrals_count',
sortable: false
},
{
data: 'verified',
sortable: false
},
{
data: 'last_seen',
type: 'num',
render: {
_: 'display',
sort: 'raw'
}
},
{
data: 'actions',
sortable: false
},
], ],
fnDrawCallback: function(oSettings) { fnDrawCallback: function(oSettings) {
$('[data-toggle="popover"]').popover(); $('[data-toggle="popover"]').popover();
@ -102,7 +143,4 @@
}); });
}); });
</script> </script>
@endsection @endsection