Merge branch 'main' into billing_system

This commit is contained in:
IceToast 2022-08-21 19:56:25 +02:00
commit 7d363246b0
28 changed files with 145 additions and 43 deletions

View file

@ -19,7 +19,8 @@
![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png) ![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png)
[//]: ![](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fmarket.controlpanel.gg%2Fcallhome.php%3Fgetinstalls) ![](https://img.shields.io/endpoint?label=v0.8%20Installations&url=https%3A%2F%2Fmarket.controlpanel.gg%2Fcallhome.php%3Fgetinstalls)
![](https://img.shields.io/badge/Overall%20Installations-2500%2B-green)
![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) [![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) ![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) [![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826)
## About ## About

View file

@ -312,7 +312,7 @@ class Pterodactyl
* Update Server Resources * Update Server Resources
* @param Server $server * @param Server $server
* @param Product $product * @param Product $product
* @return boolean * @return Response
*/ */
public static function updateServer(Server $server, Product $product) public static function updateServer(Server $server, Product $product)
{ {
@ -335,7 +335,7 @@ class Pterodactyl
* Power Action Specific Server * Power Action Specific Server
* @param Server $server * @param Server $server
* @param string $action * @param string $action
* @return boolean * @return Response
*/ */
public static function powerAction(Server $server, $action) public static function powerAction(Server $server, $action)
{ {

View file

@ -43,8 +43,17 @@ public function checkPteroClientkey(){
"pterodactyl-api-key" => "required|string", "pterodactyl-api-key" => "required|string",
"pterodactyl-url" => "required|string", "pterodactyl-url" => "required|string",
"pterodactyl-admin-api-key" => "required|string", "pterodactyl-admin-api-key" => "required|string",
"enable-upgrades" => "string",
]); ]);
$validator->after(function ($validator) use ($request) {
// if enable-recaptcha is true then recaptcha-site-key and recaptcha-secret-key must be set
if ($request->get('enable-upgrades') == 'true' && (!$request->get('pterodactyl-admin-api-key'))) {
$validator->errors()->add('pterodactyl-admin-api-key', 'The admin api key is required when upgrades are enabled.');
}
});
if ($validator->fails()) { if ($validator->fails()) {
return redirect(route('admin.settings.index') . '#system')->with('error', __('System settings have not been updated!'))->withErrors($validator) return redirect(route('admin.settings.index') . '#system')->with('error', __('System settings have not been updated!'))->withErrors($validator)
->withInput(); ->withInput();
@ -73,6 +82,7 @@ public function checkPteroClientkey(){
"SETTINGS::SYSTEM:PTERODACTYL:TOKEN" => "pterodactyl-api-key", "SETTINGS::SYSTEM:PTERODACTYL:TOKEN" => "pterodactyl-api-key",
"SETTINGS::SYSTEM:ENABLE_LOGIN_LOGO" => "enable-login-logo", "SETTINGS::SYSTEM:ENABLE_LOGIN_LOGO" => "enable-login-logo",
"SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN" => "pterodactyl-admin-api-key", "SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN" => "pterodactyl-admin-api-key",
"SETTINGS::SYSTEM:ENABLE_UPGRADE" => "enable-upgrade",
]; ];

View file

@ -3,9 +3,12 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider; use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class LoginController extends Controller class LoginController extends Controller
{ {
@ -66,6 +69,9 @@ class LoginController extends Controller
} }
if ($this->attemptLogin($request)) { if ($this->attemptLogin($request)) {
$user = Auth::user();
$user->last_seen = now();
$user->save();
return $this->sendLoginResponse($request); return $this->sendLoginResponse($request);
} }

View file

@ -278,12 +278,25 @@ class ServerController extends Controller
$oldProduct = Product::where('id', $server->product->id)->first(); $oldProduct = Product::where('id', $server->product->id)->first();
$newProduct = Product::where('id', $request->product_upgrade)->first(); $newProduct = Product::where('id', $request->product_upgrade)->first();
$serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id); $serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id);
$serverRelationships = $serverAttributes['relationships'];
// Get node resource allocation info
$nodeId = $serverRelationships['node']['attributes']['id'];
$node = Node::where('id', $nodeId)->firstOrFail();
$nodeName = $node->name;
// Check if node has enough memory and disk space
$requireMemory = $newProduct->memory - $oldProduct->memory;
$requiredisk = $newProduct->disk - $oldProduct->disk;
$checkResponse = Pterodactyl::checkNodeResources($node, $requireMemory, $requiredisk);
if ($checkResponse == False) return redirect()->route('servers.index')->with('error', __("The node '" . $nodeName . "' doesn't have the required memory or disk left to upgrade the server."));
$priceupgrade = $newProduct->getHourlyPrice(); $priceupgrade = $newProduct->getHourlyPrice();
if ($priceupgrade < $oldProduct->getHourlyPrice()) { if ($priceupgrade < $oldProduct->getHourlyPrice()) {
$priceupgrade = 0; $priceupgrade = 0;
} }
if ($user->credits >= $priceupgrade) if ($user->credits >= $priceupgrade && $user->credits >= $newProduct->minimum_credits)
{ {
$server->product_id = $request->product_upgrade; $server->product_id = $request->product_upgrade;
@ -295,7 +308,7 @@ class ServerController extends Controller
$user->decrement('credits', $priceupgrade); $user->decrement('credits', $priceupgrade);
//restart the server //restart the server
$response = Pterodactyl::powerAction($server, "restart"); $response = Pterodactyl::powerAction($server, "restart");
if ($response->failed()) return $this->serverCreationFailed($response, $server); if ($response->failed()) return redirect()->route('servers.index')->with('error', $response->json()['errors'][0]['detail']);
return redirect()->route('servers.show', ['server' => $server->id])->with('success', __('Server Successfully Upgraded')); return redirect()->route('servers.show', ['server' => $server->id])->with('success', __('Server Successfully Upgraded'));
} }
else else

View file

@ -107,12 +107,30 @@ class AppServiceProvider extends ServiceProvider
Artisan::call('cache:clear'); Artisan::call('cache:clear');
} }
try {
$stringfromfile = file(base_path().'/.git/HEAD');
$firstLine = $stringfromfile[0]; //get the string from the array
$explodedstring = explode("/", $firstLine, 3); //seperate out by the "/" in the string
$branchname = $explodedstring[2]; //get the one that is always the branch name
} catch (Exception $e) {
$branchname = "unknown";
Log::error($e);
}
config(['BRANCHNAME' => $branchname]);
// Set Discord-API Config // Set Discord-API Config
config(['services.discord.client_id' => config('SETTINGS::DISCORD:CLIENT_ID')]); config(['services.discord.client_id' => config('SETTINGS::DISCORD:CLIENT_ID')]);
config(['services.discord.client_secret' => config('SETTINGS::DISCORD:CLIENT_SECRET')]); config(['services.discord.client_secret' => config('SETTINGS::DISCORD:CLIENT_SECRET')]);
} catch (Exception $e) { } catch (Exception $e) {
error_log("Settings Error: Could not load settings from database"); error_log("Settings Error: Could not load settings from database. The Installation probably is not done yet.");
Log::error("Settings Error: Could not load settings from database"); error_log($e);
Log::error("Settings Error: Could not load settings from database. The Installation probably is not done yet.");
Log::error($e);
} }
} }
} }

View file

@ -61,7 +61,7 @@ class RouteServiceProvider extends ServiceProvider
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
}); });
RateLimiter::for('web', function (Request $request) { RateLimiter::for('web', function (Request $request) {
return Limit::perMinute(15)->by(optional($request->user())->id ?: $request->ip()); return Limit::perMinute(40)->by(optional($request->user())->id ?: $request->ip());
}); });
} }
} }

View file

@ -4,7 +4,7 @@ use App\Models\Settings;
return [ return [
'version' => '0.8', 'version' => '0.8.2',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

View file

@ -508,5 +508,12 @@ class SettingsSeeder extends Seeder
'type' => 'string', 'type' => 'string',
'description' => 'The Client API Key of an Pterodactyl Admin Account' 'description' => 'The Client API Key of an Pterodactyl Admin Account'
]); ]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:ENABLE_UPGRADE',
], [
'value' =>"",
'type' => 'string',
'description' => 'Enables the updgrade/downgrade feature for servers'
]);
} }
} }

View file

@ -65,7 +65,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -75,7 +75,7 @@ THIS FILE IS DEPRECATED
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -75,7 +75,7 @@ THIS FILE IS DEPRECATED
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -143,6 +143,22 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div class="d-flex justify-content-between">
<div class="card-title ">
<span><i class="fas fa-server mr-2"></i>{{__('Controlpanel.gg')}}</span>
</div>
</div>
<div class="card-body py-1">
</div>
<div class="card-footer">
<span><i class="fas fa-info mr-2"></i>{{__("Version")}} {{config("app.version")}} - {{config("BRANCHNAME")}}</span>
</div>
</div>
</div>
</div> </div>
</div> </div>

View file

@ -66,7 +66,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -79,7 +79,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -23,7 +23,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -75,6 +75,11 @@
<input x-model="pterodactyl-admin-api-key" id="pterodactyl-admin-api-key" name="pterodactyl-admin-api-key" <input x-model="pterodactyl-admin-api-key" id="pterodactyl-admin-api-key" name="pterodactyl-admin-api-key"
type="text" value="{{ config('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') }}" type="text" value="{{ config('SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN') }}"
class="form-control @error('pterodactyl-admin-api-key') is-invalid @enderror" required> class="form-control @error('pterodactyl-admin-api-key') is-invalid @enderror" required>
@error('pterodactyl-admin-api-key')
<div class="text-danger">
{{$message}}
</div>
@enderror
</div> </div>
<a href="{{route('admin.settings.checkPteroClientkey')}}"> <button type="button" class="btn btn-secondary">{{__("Test API")}}</button></a> <a href="{{route('admin.settings.checkPteroClientkey')}}"> <button type="button" class="btn btn-secondary">{{__("Test API")}}</button></a>
</div> </div>
@ -162,6 +167,21 @@
<h1>{{ __('Server') }}</h1> <h1>{{ __('Server') }}</h1>
</div> </div>
</div> </div>
<div class="form-group">
<div class="custom-control mb-1 p-0">
<div class="col m-0 p-0 d-flex justify-content-between align-items-center">
<div>
<input value="true" id="enable-upgrade" name="enable-upgrade"
{{ config('SETTINGS::SYSTEM:ENABLE_UPGRADE') == 'true' ? 'checked' : '' }}
type="checkbox">
<label for="enable-upgrade">{{ __('Enable upgrade/downgrade of servers') }} </label>
</div>
<i data-toggle="popover" data-trigger="hover" data-html="true"
data-content="{{ __('Allow upgrade/downgrade to a new product for the given server') }}"
class="fas fa-info-circle"></i>
</div>
</div>
</div>
<div class="form-group"> <div class="form-group">
<div class="custom-control mb-3 p-0"> <div class="custom-control mb-3 p-0">
<div class="col m-0 p-0 d-flex justify-content-between align-items-center"> <div class="col m-0 p-0 d-flex justify-content-between align-items-center">
@ -175,6 +195,8 @@
class="form-control @error('allocation-limit') is-invalid @enderror" required> class="form-control @error('allocation-limit') is-invalid @enderror" required>
</div> </div>
</div> </div>
</div> </div>
{{-- Design --}} {{-- Design --}}

View file

@ -67,7 +67,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -74,7 +74,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: false, //increases loading times too much? change back to "true" if it does serverSide: false, //increases loading times too much? change back to "true" if it does

View file

@ -70,7 +70,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -63,7 +63,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -403,8 +403,10 @@
<strong>Copyright &copy; 2021-{{ date('Y') }} <a <strong>Copyright &copy; 2021-{{ date('Y') }} <a
href="{{ url('/') }}">{{ env('APP_NAME', 'Laravel') }}</a>.</strong> href="{{ url('/') }}">{{ env('APP_NAME', 'Laravel') }}</a>.</strong>
All rights All rights
reserved. Powered by <a href="https://controlpanel.gg">ControlPanel</a>. Version reserved. Powered by <a href="https://controlpanel.gg">ControlPanel</a>.
<b>{{ config('app')['version'] }}</b> @if(!str_contains(config("BRANCHNAME"),"main"))
Version <b>{{ config('app')['version'] }} - {{config("BRANCHNAME")}}</b>
@endif
</footer> </footer>
<!-- Control Sidebar --> <!-- Control Sidebar -->

View file

@ -90,7 +90,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -63,7 +63,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -51,6 +51,11 @@
@endif @endif
</p> </p>
<p><b>Created on:</b> {{ $ticket->created_at->diffForHumans() }}</p> <p><b>Created on:</b> {{ $ticket->created_at->diffForHumans() }}</p>
<form class="d-inline" method="post" action="{{route('moderator.ticket.close', ['ticket_id' => $ticket->ticket_id ])}}">
{{csrf_field()}}
{{method_field("POST") }}
<button data-content="{{__("Close")}}" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-times"></i>{{__("Close")}}</button>
</form>
</div> </div>
</div> </div>
</div> </div>

View file

@ -221,18 +221,16 @@
<div class="card-footer"> <div class="card-footer">
<div class="col-md-12 text-center"> <div class="col-md-12 text-center">
<!-- Upgrade Button trigger modal --> <!-- Upgrade Button trigger modal -->
@if(!config("SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN") and Auth::user()->role=="admin") @if(config("SETTINGS::SYSTEM:ENABLE_UPGRADE"))
<i data-toggle="popover" data-trigger="hover" <button type="button" data-toggle="modal" data-target="#UpgradeModal{{ $server->id }}" target="__blank"
data-content="{{ __('To enable the upgrade/downgrade system, please set your Ptero Admin-User API Key in the Settings!') }}"
class="fas fa-info-circle"></i>
@endif
<button type="button" data-toggle="modal" @if(!config("SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN")) disabled @endif data-target="#UpgradeModal{{ $server->id }}" target="__blank"
class="btn btn-info btn-md"> class="btn btn-info btn-md">
<i class="fas fa-upload mr-2"></i> <i class="fas fa-upload mr-2"></i>
<span>{{ __('Upgrade / Downgrade') }}</span> <span>{{ __('Upgrade / Downgrade') }}</span>
</button> </button>
<!-- Upgrade Modal --> <!-- Upgrade Modal -->
<div style="width: 100%; margin-block-start: 100px;" class="modal fade" id="UpgradeModal{{ $server->id }}" tabindex="-1"> <div style="width: 100%; margin-block-start: 100px;" class="modal fade" id="UpgradeModal{{ $server->id }}" tabindex="-1">
<div class="modal-dialog"> <div class="modal-dialog">
@ -256,8 +254,9 @@
<select name="product_upgrade" id="product_upgrade" class="form-input2 form-control"> <select name="product_upgrade" id="product_upgrade" class="form-input2 form-control">
<option value="">{{__("Select the product")}}</option> <option value="">{{__("Select the product")}}</option>
@foreach($products as $product) @foreach($products as $product)
@if(in_array($server->egg, $product->eggs) && $product->id != $server->product->id) @if(in_array($server->egg, $product->eggs) && $product->id != $server->product->id && $product->disabled == false)
<option value="{{ $product->id }}">{{ $product->name }} [ {{ CREDITS_DISPLAY_NAME }} {{ $product->price }} ]</option> <option value="{{ $product->id }}">{{ $product->name }} [ {{ CREDITS_DISPLAY_NAME }} {{ $product->price }} @if($product->minimum_credits!=-1) /
{{__("Required")}}: {{$product->minimum_credits}} {{ CREDITS_DISPLAY_NAME }}@endif ]</option>
@endif @endif
@endforeach @endforeach
</select> </select>
@ -271,6 +270,7 @@
</div> </div>
</div> </div>
</div> </div>
@endif
<!-- Delete Button trigger modal --> <!-- Delete Button trigger modal -->
<button type="button" data-toggle="modal" data-target="#DeleteModal" target="__blank" <button type="button" data-toggle="modal" data-target="#DeleteModal" target="__blank"
class="btn btn-danger btn-md"> class="btn btn-danger btn-md">

View file

@ -75,7 +75,7 @@
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("app.datatable_locale")}}.json' url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("SETTINGS::LOCALE:DATATABLES")}}.json'
}, },
processing: true, processing: true,
serverSide: true, serverSide: true,

View file

@ -65,7 +65,9 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
Route::resource('notifications', NotificationController::class); Route::resource('notifications', NotificationController::class);
Route::patch('/servers/cancel/{server}', [ServerController::class, 'cancel'])->name('servers.cancel'); Route::patch('/servers/cancel/{server}', [ServerController::class, 'cancel'])->name('servers.cancel');
Route::resource('servers', ServerController::class); Route::resource('servers', ServerController::class);
if(config('SETTINGS::SYSTEM:ENABLE_UPGRADE')){
Route::post('servers/{server}/upgrade', [ServerController::class,'upgrade'])->name('servers.upgrade'); Route::post('servers/{server}/upgrade', [ServerController::class,'upgrade'])->name('servers.upgrade');
}
Route::resource('profile', ProfileController::class); Route::resource('profile', ProfileController::class);
Route::resource('store', StoreController::class); Route::resource('store', StoreController::class);