Merge branch 'development' into improve/installer-ui

This commit is contained in:
Jens 2023-04-05 14:33:48 +02:00 committed by GitHub
commit b20a2d24e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 290 additions and 221 deletions

View file

@ -24,7 +24,7 @@ class PterodactylClient
public PendingRequest $client; public PendingRequest $client;
public PendingRequest $client_admin; public PendingRequest $application;
public function __construct(PterodactylSettings $ptero_settings) public function __construct(PterodactylSettings $ptero_settings)
{ {
@ -32,11 +32,10 @@ class PterodactylClient
try { try {
$this->client = $this->client($ptero_settings); $this->client = $this->client($ptero_settings);
$this->client_admin = $this->clientAdmin($ptero_settings); $this->application = $this->clientAdmin($ptero_settings);
$this->per_page_limit = $ptero_settings->per_page_limit; $this->per_page_limit = $ptero_settings->per_page_limit;
$this->allocation_limit = $server_settings->allocation_limit; $this->allocation_limit = $server_settings->allocation_limit;
} } catch (Exception $exception) {
catch (Exception $exception) {
logger('Failed to construct Pterodactyl client, Settings table not available?', ['exception' => $exception]); logger('Failed to construct Pterodactyl client, Settings table not available?', ['exception' => $exception]);
} }
} }
@ -94,7 +93,7 @@ class PterodactylClient
public function getEggs(Nest $nest) public function getEggs(Nest $nest)
{ {
try { try {
$response = $this->client_admin->get("application/nests/{$nest->id}/eggs?include=nest,variables&per_page=" . $this->per_page_limit); $response = $this->application->get("application/nests/{$nest->id}/eggs?include=nest,variables&per_page=" . $this->per_page_limit);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -113,7 +112,7 @@ class PterodactylClient
public function getNodes() public function getNodes()
{ {
try { try {
$response = $this->client_admin->get('application/nodes?per_page=' . $this->per_page_limit); $response = $this->application->get('application/nodes?per_page=' . $this->per_page_limit);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -133,7 +132,7 @@ class PterodactylClient
public function getNode($id) public function getNode($id)
{ {
try { try {
$response = $this->client_admin->get('application/nodes/' . $id); $response = $this->application->get('application/nodes/' . $id);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -147,7 +146,7 @@ class PterodactylClient
public function getServers() public function getServers()
{ {
try { try {
$response = $this->client_admin->get('application/servers?per_page=' . $this->per_page_limit); $response = $this->application->get('application/servers?per_page=' . $this->per_page_limit);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -166,7 +165,7 @@ class PterodactylClient
public function getNests() public function getNests()
{ {
try { try {
$response = $this->client_admin->get('application/nests?per_page=' . $this->per_page_limit); $response = $this->application->get('application/nests?per_page=' . $this->per_page_limit);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -185,7 +184,7 @@ class PterodactylClient
public function getLocations() public function getLocations()
{ {
try { try {
$response = $this->client_admin->get('application/locations?per_page=' . $this->per_page_limit); $response = $this->application->get('application/locations?per_page=' . $this->per_page_limit);
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -240,7 +239,7 @@ class PterodactylClient
public function getAllocations(Node $node) public function getAllocations(Node $node)
{ {
try { try {
$response = $this->client_admin->get("application/nodes/{$node->id}/allocations?per_page={$this->allocation_limit}"); $response = $this->application->get("application/nodes/{$node->id}/allocations?per_page={$this->allocation_limit}");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -259,7 +258,7 @@ class PterodactylClient
*/ */
public function createServer(Server $server, Egg $egg, int $allocationId) public function createServer(Server $server, Egg $egg, int $allocationId)
{ {
return $this->client_admin->post('application/servers', [ return $this->application->post('application/servers', [
'name' => $server->name, 'name' => $server->name,
'external_id' => $server->id, 'external_id' => $server->id,
'user' => $server->user->pterodactyl_id, 'user' => $server->user->pterodactyl_id,
@ -288,7 +287,7 @@ class PterodactylClient
public function suspendServer(Server $server) public function suspendServer(Server $server)
{ {
try { try {
$response = $this->client_admin->post("application/servers/$server->pterodactyl_id/suspend"); $response = $this->application->post("application/servers/$server->pterodactyl_id/suspend");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -302,7 +301,7 @@ class PterodactylClient
public function unSuspendServer(Server $server) public function unSuspendServer(Server $server)
{ {
try { try {
$response = $this->client_admin->post("application/servers/$server->pterodactyl_id/unsuspend"); $response = $this->application->post("application/servers/$server->pterodactyl_id/unsuspend");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -322,7 +321,7 @@ class PterodactylClient
public function getUser(int $pterodactylId) public function getUser(int $pterodactylId)
{ {
try { try {
$response = $this->client_admin->get("application/users/{$pterodactylId}"); $response = $this->application->get("application/users/{$pterodactylId}");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -342,7 +341,7 @@ class PterodactylClient
public function getServerAttributes(int $pterodactylId, bool $deleteOn404 = false) public function getServerAttributes(int $pterodactylId, bool $deleteOn404 = false)
{ {
try { try {
$response = $this->client_admin->get("application/servers/{$pterodactylId}?include=egg,node,nest,location"); $response = $this->application->get("application/servers/{$pterodactylId}?include=egg,node,nest,location");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }
@ -371,7 +370,7 @@ class PterodactylClient
*/ */
public function updateServer(Server $server, Product $product) public function updateServer(Server $server, Product $product)
{ {
return $this->client_admin->patch("application/servers/{$server->pterodactyl_id}/build", [ return $this->application->patch("application/servers/{$server->pterodactyl_id}/build", [
'allocation' => $server->allocation, 'allocation' => $server->allocation,
'memory' => $product->memory, 'memory' => $product->memory,
'swap' => $product->swap, 'swap' => $product->swap,
@ -396,7 +395,7 @@ class PterodactylClient
*/ */
public function updateServerOwner(Server $server, int $userId) public function updateServerOwner(Server $server, int $userId)
{ {
return $this->client_admin->patch("application/servers/{$server->pterodactyl_id}/details", [ return $this->application->patch("application/servers/{$server->pterodactyl_id}/details", [
'name' => $server->name, 'name' => $server->name,
'user' => $userId, 'user' => $userId,
]); ]);
@ -435,7 +434,7 @@ class PterodactylClient
public function checkNodeResources(Node $node, int $requireMemory, int $requireDisk) public function checkNodeResources(Node $node, int $requireMemory, int $requireDisk)
{ {
try { try {
$response = $this->client_admin->get("application/nodes/{$node->id}"); $response = $this->application->get("application/nodes/{$node->id}");
} catch (Exception $e) { } catch (Exception $e) {
throw self::getException($e->getMessage()); throw self::getException($e->getMessage());
} }

View file

@ -109,26 +109,18 @@ class SettingsController extends Controller
$settingsClass = new $settings_class(); $settingsClass = new $settings_class();
foreach ($settingsClass->toArray() as $key => $value) { foreach ($settingsClass->toArray() as $key => $value) {
switch (gettype($request->input($key))) { // Get the type of the settingsclass property
case 'boolean': $rp = new \ReflectionProperty($settingsClass, $key);
$rpType = $rp->getType();
if ($rpType == 'bool') {
$settingsClass->$key = $request->has($key); $settingsClass->$key = $request->has($key);
break; continue;
case 'string':
$settingsClass->$key = $request->input($key) ?? '';
break;
case 'integer':
$settingsClass->$key = $request->input($key) ?? 0;
break;
case 'array':
$settingsClass->$key = $request->input($key) ?? [];
break;
case 'double':
$settingsClass->$key = $request->input($key) ?? 0.0;
break;
case 'NULL':
$settingsClass->$key = null;
break;
} }
$nullable = $rpType->allowsNull();
if ($nullable) $settingsClass->$key = $request->input($key) ?? null;
else $settingsClass->$key = $request->input($key);
} }
$settingsClass->save(); $settingsClass->save();

View file

@ -166,6 +166,10 @@ class UserController extends Controller
*/ */
public function destroy(User $user) public function destroy(User $user)
{ {
if ($user->role === 'admin' && User::query()->where('role', 'admin')->count() === 1) {
return redirect()->back()->with('error', __('You can not delete the last admin!'));
}
$user->delete(); $user->delete();
return redirect()->back()->with('success', __('user has been removed!')); return redirect()->back()->with('success', __('user has been removed!'));
@ -258,8 +262,7 @@ class UserController extends Controller
$users = $all ? User::all() : User::whereIn('id', $data['users'])->get(); $users = $all ? User::all() : User::whereIn('id', $data['users'])->get();
try { try {
Notification::send($users, new DynamicNotification($data['via'], $database, $mail)); Notification::send($users, new DynamicNotification($data['via'], $database, $mail));
} } catch (Exception $e) {
catch (Exception $e) {
return redirect()->route('admin.users.notifications')->with('error', __('The attempt to send the email failed with the error: ' . $e->getMessage())); return redirect()->route('admin.users.notifications')->with('error', __('The attempt to send the email failed with the error: ' . $e->getMessage()));
} }

View file

@ -105,7 +105,7 @@ class UserController extends Controller
//Update Users Password on Pterodactyl //Update Users Password on Pterodactyl
//Username,Mail,First and Lastname are required aswell //Username,Mail,First and Lastname are required aswell
$response = $this->pterodactyl->client_admin->patch('/application/users/' . $user->pterodactyl_id, [ $response = $this->pterodactyl->application->patch('/application/users/' . $user->pterodactyl_id, [
'username' => $request->name, 'username' => $request->name,
'first_name' => $request->name, 'first_name' => $request->name,
'last_name' => $request->name, 'last_name' => $request->name,
@ -280,7 +280,7 @@ class UserController extends Controller
'referral_code' => $this->createReferralCode(), 'referral_code' => $this->createReferralCode(),
]); ]);
$response = $this->pterodactyl->client_admin->post('/application/users', [ $response = $this->pterodactyl->application->post('/application/users', [
'external_id' => App::environment('local') ? Str::random(16) : (string) $user->id, 'external_id' => App::environment('local') ? Str::random(16) : (string) $user->id,
'username' => $user->name, 'username' => $user->name,
'email' => $user->email, 'email' => $user->email,

View file

@ -135,11 +135,12 @@ class RegisterController extends Controller
'server_limit' => $this->initial_server_limit, 'server_limit' => $this->initial_server_limit,
'password' => Hash::make($data['password']), 'password' => Hash::make($data['password']),
'referral_code' => $this->createReferralCode(), 'referral_code' => $this->createReferralCode(),
'pterodactyl_id' => Str::uuid(),
]); ]);
$response = $this->pterodactyl->client_admin->post('/application/users', [ $response = $this->pterodactyl->application->post('/application/users', [
'external_id' => App::environment('local') ? Str::random(16) : (string) $user->id, 'external_id' => $user->pterodactyl_id,
'username' => $user->name, 'username' => $user->name,
'email' => $user->email, 'email' => $user->email,
'first_name' => $user->name, 'first_name' => $user->name,
@ -157,9 +158,8 @@ class RegisterController extends Controller
]); ]);
} }
$user->update([ // delete activity log for user creation where description = 'created' or 'deleted' and subject_id = user_id
'pterodactyl_id' => $response->json()['attributes']['id'], DB::table('activity_log')->where('description', 'created')->orWhere('description', 'deleted')->where('subject_id', $user->id)->delete();
]);
//INCREMENT REFERRAL-USER CREDITS //INCREMENT REFERRAL-USER CREDITS
if (!empty($data['referral_code'])) { if (!empty($data['referral_code'])) {

View file

@ -96,7 +96,7 @@ class ProfileController extends Controller
//Update Users Password on Pterodactyl //Update Users Password on Pterodactyl
//Username,Mail,First and Lastname are required aswell //Username,Mail,First and Lastname are required aswell
$response = $this->pterodactyl->client_admin->patch('/application/users/' . $user->pterodactyl_id, [ $response = $this->pterodactyl->application->patch('/application/users/' . $user->pterodactyl_id, [
'password' => $request->input('new_password'), 'password' => $request->input('new_password'),
'username' => $request->input('name'), 'username' => $request->input('name'),
'first_name' => $request->input('name'), 'first_name' => $request->input('name'),
@ -140,7 +140,7 @@ class ProfileController extends Controller
} }
//update name and email on Pterodactyl //update name and email on Pterodactyl
$response = $this->pterodactyl->client_admin->patch('/application/users/' . $user->pterodactyl_id, [ $response = $this->pterodactyl->application->patch('/application/users/' . $user->pterodactyl_id, [
'username' => $request->input('name'), 'username' => $request->input('name'),
'first_name' => $request->input('name'), 'first_name' => $request->input('name'),
'last_name' => $request->input('name'), 'last_name' => $request->input('name'),

View file

@ -84,7 +84,7 @@ class Server extends Model
}); });
static::deleting(function (Server $server) { static::deleting(function (Server $server) {
$response = $server->pterodactyl->client_admin->delete("/application/servers/{$server->pterodactyl_id}"); $response = $server->pterodactyl->application->delete("/application/servers/{$server->pterodactyl_id}");
if ($response->failed() && !is_null($server->pterodactyl_id)) { if ($response->failed() && !is_null($server->pterodactyl_id)) {
//only return error when it's not a 404 error //only return error when it's not a 404 error
if ($response['errors'][0]['status'] != '404') { if ($response['errors'][0]['status'] != '404') {
@ -107,7 +107,7 @@ class Server extends Model
*/ */
public function getPterodactylServer() public function getPterodactylServer()
{ {
return $this->pterodactyl->client_admin->get("/application/servers/{$this->pterodactyl_id}"); return $this->pterodactyl->application->get("/application/servers/{$this->pterodactyl_id}");
} }
/** /**

View file

@ -122,7 +122,7 @@ class User extends Authenticatable implements MustVerifyEmail
$user->discordUser()->delete(); $user->discordUser()->delete();
$user->pterodactyl->client_admin->delete("/application/users/{$user->pterodactyl_id}"); $user->pterodactyl->application->delete("/application/users/{$user->pterodactyl_id}");
}); });
} }
@ -195,9 +195,6 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->suspended; return $this->suspended;
} }
/**
* @throws Exception
*/
public function suspend() public function suspend()
{ {
foreach ($this->servers as $server) { foreach ($this->servers as $server) {
@ -211,9 +208,6 @@ class User extends Authenticatable implements MustVerifyEmail
return $this; return $this;
} }
/**
* @throws Exception
*/
public function unSuspend() public function unSuspend()
{ {
foreach ($this->getServersWithProduct() as $server) { foreach ($this->getServersWithProduct() as $server) {
@ -241,23 +235,9 @@ class User extends Authenticatable implements MustVerifyEmail
*/ */
public function getAvatar() public function getAvatar()
{ {
//TODO loading the images to confirm they exist is causing to much load time. alternative has to be found :) maybe onerror tag on the <img tags>
// if ($this->discordUser()->exists()) {
// if(@getimagesize($this->discordUser->getAvatar())) {
// $avatar = $this->discordUser->getAvatar();
// } else {
// $avatar = "https://www.gravatar.com/avatar/" . md5(strtolower(trim($this->email)));
// }
// } else {
// $avatar = "https://www.gravatar.com/avatar/" . md5(strtolower(trim($this->email)));
// }
return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->email))); return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->email)));
} }
/**
* @return string
*/
public function creditUsage() public function creditUsage()
{ {
$usage = 0; $usage = 0;

View file

@ -9,6 +9,7 @@ use Exception;
use Illuminate\Pagination\Paginator; use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@ -54,6 +55,14 @@ class AppServiceProvider extends ServiceProvider
return $ok; return $ok;
}); });
// Force HTTPS if APP_URL is set to https
if (config('app.url') && parse_url(config('app.url'), PHP_URL_SCHEME) === 'https') {
URL::forceScheme('https');
}
// Do not run this code if no APP_KEY is set
if (config('app.key') == null) return;
try { try {
if (Schema::hasColumn('useful_links', 'position')) { if (Schema::hasColumn('useful_links', 'position')) {
$useful_links = UsefulLink::where("position", "like", "%topbar%")->get()->sortby("id"); $useful_links = UsefulLink::where("position", "like", "%topbar%")->get()->sortby("id");
@ -63,6 +72,7 @@ class AppServiceProvider extends ServiceProvider
Log::error("Couldnt find useful_links. Probably the installation is not completet. " . $e); Log::error("Couldnt find useful_links. Probably the installation is not completet. " . $e);
} }
$settings = $this->app->make(MailSettings::class); $settings = $this->app->make(MailSettings::class);
$settings->setConfig(); $settings->setConfig();
} }

View file

@ -25,11 +25,11 @@ class ReferralSettings extends Settings
public static function getValidations() public static function getValidations()
{ {
return [ return [
'allowed' => 'required|in:everyone,clients', 'allowed' => 'required|in:Everyone,Clients',
'always_give_commission' => 'nullable|boolean', 'always_give_commission' => 'nullable|boolean',
'enabled' => 'nullable|boolean', 'enabled' => 'nullable|boolean',
'reward' => 'nullable|numeric', 'reward' => 'nullable|numeric',
'mode' => 'required|in:commission,percentage,both', 'mode' => 'required|in:Commission,Sign-Up,Both',
'percentage' => 'nullable|numeric', 'percentage' => 'nullable|numeric',
]; ];
} }

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('pterodactyl_id')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->integer('pterodactyl_id')->nullable->change();
});
}
};

View file

@ -9,6 +9,10 @@ use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler; use Monolog\Handler\StreamHandler;
use Monolog\Logger; use Monolog\Logger;
if (!file_exists('../../.env')) {
echo run_console('cp .env.example .env');
}
(new DotEnv(dirname(__FILE__, 3) . '/.env'))->load(); (new DotEnv(dirname(__FILE__, 3) . '/.env'))->load();
$required_extensions = ['openssl', 'gd', 'mysql', 'PDO', 'mbstring', 'tokenizer', 'bcmath', 'xml', 'curl', 'zip', 'intl']; $required_extensions = ['openssl', 'gd', 'mysql', 'PDO', 'mbstring', 'tokenizer', 'bcmath', 'xml', 'curl', 'zip', 'intl'];

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.servers.index')}}">{{__('Servers')}}</a></li> <li class="breadcrumb-item"><a class="text-muted"
href="{{ route('admin.servers.index') }}">{{ __('Servers') }}</a></li>
</ol> </ol>
</div> </div>
</div> </div>
@ -41,7 +42,7 @@
<th>{{ __('Name') }}</th> <th>{{ __('Name') }}</th>
<th>{{ __('User') }}</th> <th>{{ __('User') }}</th>
<th>{{ __('Server id') }}</th> <th>{{ __('Server id') }}</th>
<th>{{__('Config')}}</th> <th>{{ __('Product') }}</th>
<th>{{ __('Suspended at') }}</th> <th>{{ __('Suspended at') }}</th>
<th>{{ __('Created at') }}</th> <th>{{ __('Created at') }}</th>
<th>{{ __('Actions') }}</th> <th>{{ __('Actions') }}</th>
@ -73,16 +74,37 @@
serverSide: true, serverSide: true,
stateSave: true, stateSave: true,
ajax: "{{ route('admin.servers.datatable') }}{{ $filter ?? '' }}", ajax: "{{ route('admin.servers.datatable') }}{{ $filter ?? '' }}",
order: [[ 5, "desc" ]], order: [
columns: [ [5, "desc"]
{data: 'status' , name : 'servers.suspended'}, ],
{data: 'name'}, columns: [{
{data: 'user' , name : 'user.name'}, data: 'status',
{data: 'identifier'}, name: 'servers.suspended'
{data: 'resources' , name : 'product.name'}, },
{data: 'suspended'}, {
{data: 'created_at'}, data: 'name'
{data: 'actions' , sortable : false}, },
{
data: 'user',
name: 'user.name'
},
{
data: 'identifier'
},
{
data: 'product.name',
sortable: false
},
{
data: 'suspended'
},
{
data: 'created_at'
},
{
data: 'actions',
sortable: false
},
], ],
fnDrawCallback: function(oSettings) { fnDrawCallback: function(oSettings) {
$('[data-toggle="popover"]').popover(); $('[data-toggle="popover"]').popover();

View file

@ -75,7 +75,15 @@
</div> </div>
<div class="col-lg-8"> <div class="col-lg-8">
<span style="max-width: 250px;" <span style="max-width: 250px;"
class="d-inline-block text-truncate badge {{$user->role == 'admin' || $user->role == 'mod' ? 'badge-info' : 'badge-secondary'}}"> class="d-inline-block text-truncate badge
@if ($user->role == 'admin') badge-danger
@elseif ($user->role == 'moderator')
badge-info
@elseif ($user->role == 'client')
badge-success
@else
badge-secondary @endif
">
{{ $user->role }} {{ $user->role }}
</span> </span>
</div> </div>
@ -227,8 +235,7 @@
@if ($user->last_seen) @if ($user->last_seen)
{{ $user->last_seen->diffForHumans() }} {{ $user->last_seen->diffForHumans() }}
@else @else
<small <small class="text-muted">Null</small>
class="text-muted">Null</small>
@endif @endif
</span> </span>
</div> </div>
@ -268,7 +275,7 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h5 class="card-title"><i class="fas fa-user-check mr-2"></i>{{ __('Referals') }} <h5 class="card-title"><i class="fas fa-user-check mr-2"></i>{{ __('Referals') }}
({{__("referral-code")}}: {{$user->referral_code}})</h5> ({{ __('referral-code') }}: {{ $user->referral_code }})</h5>
</div> </div>
<div class="card-body table-responsive"> <div class="card-body table-responsive">
@ -282,7 +289,7 @@
<div class="col-lg-4"> <div class="col-lg-4">
<span style="max-width: 250px;" class="d-inline-block text-truncate"> <span style="max-width: 250px;" class="d-inline-block text-truncate">
<i class="fas fa-user-check mr-2"></i><a <i class="fas fa-user-check mr-2"></i><a
href="{{route("admin.users.show",$referral->id)}}">{{$referral->name}}</a> href="{{ route('admin.users.show', $referral->id) }}">{{ $referral->name }}</a>
</span> </span>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
@ -302,7 +309,6 @@
</div> </div>
</section> </section>
<!-- END CONTENT --> <!-- END CONTENT -->
@endsection @endsection
<script> <script>
@ -315,16 +321,37 @@
serverSide: true, serverSide: true,
stateSave: true, stateSave: true,
ajax: "{{ route('admin.servers.datatable') }}?user={{ $user->id }}", ajax: "{{ route('admin.servers.datatable') }}?user={{ $user->id }}",
order: [[ 5, "desc" ]], order: [
columns: [ [5, "desc"]
{data: 'status' , name : 'servers.suspended'}, ],
{data: 'name'}, columns: [{
{data: 'user' , name : 'user.name'}, data: 'status',
{data: 'identifier'}, name: 'servers.suspended'
{data: 'resources' , name : 'product.name'}, },
{data: 'suspended'}, {
{data: 'created_at'}, data: 'name'
{data: 'actions' , sortable : false}, },
{
data: 'user',
name: 'user.name'
},
{
data: 'identifier'
},
{
data: 'resources',
name: 'product.name'
},
{
data: 'suspended'
},
{
data: 'created_at'
},
{
data: 'actions',
sortable: false
},
], ],
fnDrawCallback: function(oSettings) { fnDrawCallback: function(oSettings) {
$('[data-toggle="popover"]').popover(); $('[data-toggle="popover"]').popover();