Merge branch 'main' of https://github.com/1day2die/dashboard into development

This commit is contained in:
1day2die 2023-02-05 18:35:09 +01:00
commit 704548343b
23 changed files with 205 additions and 189 deletions

31
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,31 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
# Enable version updates for npm
- package-ecosystem: "npm"
# Look for `package.json` and `lock` files in the `root` directory
directory: "/"
target-branch: "development"
# Check the npm registry for updates every day (weekdays)
schedule:
interval: "daily"
# Enable version updates for Docker
- package-ecosystem: "docker"
# Look for a `Dockerfile` in the `root` directory
directory: "/"
target-branch: "development"
# Check for updates once a week
schedule:
interval: "weekly"
# Maintain dependencies for Composer
- package-ecosystem: "composer"
directory: "/"
target-branch: "development"
schedule:
interval: "daily"

72
.github/workflows/codeql-analysis.yml vendored Normal file
View file

@ -0,0 +1,72 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ "main" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "main" ]
schedule:
- cron: '25 10 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View file

@ -3,7 +3,6 @@
- PayPal Integration
- Stripe Integration
- Referral System
- Partner System
- Ticket System
- Upgrade/Downgrade Server Resources
- Store (credit system with hourly billing and invoices)
@ -13,29 +12,27 @@
- User/Server Management
- Customisable server plans
- Vouchers
- Alert System
- Theme Support
- and so much more!
# ControlPanel-gg
![controlpanel](https://user-images.githubusercontent.com/67899387/214684708-739c1d21-06e8-4dec-a4f1-81533a46cc7e.png)
![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png)
![](https://img.shields.io/endpoint?label=v0.9%20Installations&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-3500%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)
## About
ControlPanel's Dashboard is a dashboard application designed to offer clients a management tool to manage their pterodactyl servers. This dashboard comes with a credit-based billing solution that credits users hourly for each server they have and suspends them if they run out of credits.
This dashboard offers an easy to use and free billing solution for all starting and experienced hosting providers. This dashboard has many customisation options and added discord Oauth verification to offer a solid link between your discord server and your dashboard. You can check our [Demo here](https://demo.controlpanel.gg "Demo").
This dashboard offers an easy to use and free billing solution for all starting and experienced hosting providers. This dashboard has many customization options and added discord 0auth verification to offer a solid link between your discord server and your dashboard. You can check our Demo here ([Demo](https://demo.controlpanel.gg "Demo"))
### [Installation](https://controlpanel.gg/docs/intro "Installation")
### [Updating](https://controlpanel.gg/docs/Installation/updating "Updating")
### [Discord](https://discord.gg/4Y6HjD2uyU "Discord")
### [Discord](https://discord.gg/4Y6HjD2uyU "discord")
### [Contributing](https://controlpanel.gg/docs/Contributing/contributing "Contributing")
@ -46,22 +43,15 @@ This dashboard offers an easy to use and free billing solution for all starting
# Preview
### Server Creation
![image](https://user-images.githubusercontent.com/67899387/214687234-d1ae58c0-5667-4e99-ac39-adeaabfcc7f2.png)
![image](https://user-images.githubusercontent.com/8725848/171575021-bc248f12-2aba-44e8-82aa-bdc907b1d3fc.png)
### Overview
![image](https://user-images.githubusercontent.com/67899387/214685859-03c8d9e1-c685-4a07-979f-df2e88ec3931.png)
![image](https://user-images.githubusercontent.com/8725848/171575809-7620ed4f-5715-420f-8c25-8bfa1c4342f7.png)
### Example server products
![image](https://user-images.githubusercontent.com/67899387/214686950-218e1ede-6a1f-4e53-b3f4-fe1abc371a9c.png)
![image](https://user-images.githubusercontent.com/8725848/171575987-c1398ff6-83fa-4cb8-bd1f-986cee4da565.png)
### Ticket System
![image](https://user-images.githubusercontent.com/67899387/214687123-0a3d0f8f-b53c-4b0d-869a-4d5df45f5184.png)
### Voucher System
![image](https://user-images.githubusercontent.com/67899387/214686578-ec9f0b0f-6047-4665-835f-70594b56dfd5.png)
### Partner System
![image](https://user-images.githubusercontent.com/67899387/214686321-36ba97a3-4181-4e60-9ba3-c9b318fe66a8.png)
![image](https://user-images.githubusercontent.com/8725848/184131270-9d997ebf-8965-4910-90d2-b410ae37f201.png)

View file

@ -50,7 +50,6 @@ class System
'pterodactyl-admin-api-key' => 'required|string',
'enable-upgrades' => 'string',
'enable-disable-servers' => 'string',
'enable-disable-new-users' => 'string',
'show-imprint' => 'string',
'show-privacy' => 'string',
'show-tos' => 'string',

View file

@ -1,19 +0,0 @@
<?php
namespace App\Enums;
enum UsefulLinkLocation:String
{
/**
* Top bar
* Only visible in the dashboard view
*/
case topbar = "topbar";
/**
* Dashboard
* Only visible in the dashboard view
*/
case dashboard = "dashboard";
}

View file

@ -10,6 +10,5 @@ function getConfig()
"RoutesIgnoreCsrf" => [
"payment/StripeWebhooks",
],
"enabled" => config('SETTINGS::PAYMENTS:STRIPE:SECRET') && config('SETTINGS::PAYMENTS:STRIPE:CLIENT_ID'),
];
}

View file

@ -43,6 +43,7 @@ class PaymentController extends Controller
$price = $shopProduct->price - ($shopProduct->price * $discount / 100);
$paymentGateways = [];
if ($price > 0) {
$extensions = ExtensionHelper::getAllExtensionsByNamespace('PaymentGateways');
@ -58,11 +59,6 @@ class PaymentController extends Controller
}
}
return view('store.checkout')->with([
'product' => $shopProduct,
'discountpercent' => $discount,

View file

@ -22,13 +22,7 @@ class SettingsController extends Controller
//Get all tabs as laravel view paths
$tabs = [];
if(file_exists(Theme::getViewPaths()[0] . '/admin/settings/tabs/')){
$tabspath = glob(Theme::getViewPaths()[0] . '/admin/settings/tabs/*.blade.php');
}else{
$tabspath = glob(Theme::path($path = 'views', $themeName = 'default').'/admin/settings/tabs/*.blade.php');
}
foreach ($tabspath as $filename) {
foreach (glob(Theme::getViewPaths()[0] . '/admin/settings/tabs/*.blade.php') as $filename) {
$tabs[] = 'admin.settings.tabs.'.basename($filename, '.blade.php');
}

View file

@ -2,7 +2,6 @@
namespace App\Http\Controllers\Admin;
use App\Enums\UsefulLinkLocation;
use App\Http\Controllers\Controller;
use App\Models\UsefulLink;
use Illuminate\Contracts\Foundation\Application;
@ -31,8 +30,7 @@ class UsefulLinkController extends Controller
*/
public function create()
{
$positions = UsefulLinkLocation::cases();
return view('admin.usefullinks.create')->with('positions', $positions);
return view('admin.usefullinks.create');
}
/**
@ -50,14 +48,7 @@ class UsefulLinkController extends Controller
'description' => 'required|string|max:2000',
]);
UsefulLink::create([
'icon' => $request->icon,
'title' => $request->title,
'link' => $request->link,
'description' => $request->description,
'position' => implode(",",$request->position),
]);
UsefulLink::create($request->all());
return redirect()->route('admin.usefullinks.index')->with('success', __('link has been created!'));
}
@ -81,10 +72,8 @@ class UsefulLinkController extends Controller
*/
public function edit(UsefulLink $usefullink)
{
$positions = UsefulLinkLocation::cases();
return view('admin.usefullinks.edit', [
'link' => $usefullink,
'positions' => $positions,
]);
}
@ -104,13 +93,7 @@ class UsefulLinkController extends Controller
'description' => 'required|string|max:2000',
]);
$usefullink->update([
'icon' => $request->icon,
'title' => $request->title,
'link' => $request->link,
'description' => $request->description,
'position' => implode(",",$request->position),
]);
$usefullink->update($request->all());
return redirect()->route('admin.usefullinks.index')->with('success', __('link has been updated!'));
}

View file

@ -13,7 +13,6 @@ use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
@ -119,7 +118,6 @@ class RegisterController extends Controller
if ($response->failed()) {
$user->delete();
Log::error('Pterodactyl Registration Error: ' . $response->json()['errors'][0]['detail']);
throw ValidationException::withMessages([
'ptero_registration_error' => [__('Account already exists on Pterodactyl. Please contact the Support!')],
]);
@ -130,7 +128,7 @@ class RegisterController extends Controller
]);
//INCREMENT REFERRAL-USER CREDITS
if (!empty($data['referral_code'])) {
if (! empty($data['referral_code'])) {
$ref_code = $data['referral_code'];
$new_user = $user->id;
if ($ref_user = User::query()->where('referral_code', '=', $ref_code)->first()) {
@ -142,7 +140,7 @@ class RegisterController extends Controller
activity()
->performedOn($user)
->causedBy($ref_user)
->log('gained ' . config('SETTINGS::REFERRAL::REWARD') . ' ' . config('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME') . ' for sign-up-referral of ' . $user->name . ' (ID:' . $user->id . ')');
->log('gained '.config('SETTINGS::REFERRAL::REWARD').' '.config('SETTINGS::SYSTEM:CREDITS_DISPLAY_NAME').' for sign-up-referral of '.$user->name.' (ID:'.$user->id.')');
}
//INSERT INTO USER_REFERRALS TABLE
DB::table('user_referrals')->insert([

View file

@ -16,6 +16,5 @@ class UsefulLink extends Model
'title',
'link',
'description',
'position',
];
}

View file

@ -3,7 +3,6 @@
namespace App\Providers;
use App\Models\Settings;
use App\Models\UsefulLink;
use Exception;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Artisan;

View file

@ -1,32 +0,0 @@
<?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('useful_links', function (Blueprint $table) {
$table->string('position')->after("description")->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('useful_links', function (Blueprint $table) {
$table->dropColumn('position');
});
}
};

View file

@ -131,7 +131,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'Credits',
'type' => 'string',
'description' => 'The display name of your currency.',
'description' => 'Set the display name of your currency :)',
]);
//credits display name
@ -148,7 +148,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '0',
'type' => 'integer',
'description' => 'The %-value of tax that will be added to the product price on checkout.',
'description' => 'The %-value of tax that will be added to the product price on checkout',
]);
//Invoices enabled
Settings::firstOrCreate([
@ -156,7 +156,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'false',
'type' => 'boolean',
'description' => 'Enables or disables the invoice feature for payments.',
'description' => 'Enables or disables the invoice feature for payments',
]);
//Invoice company name
Settings::firstOrCreate([
@ -164,7 +164,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The name of the Company on the Invoices.',
'description' => 'The name of the Company on the Invoices',
]);
//Invoice company address
Settings::firstOrCreate([
@ -172,7 +172,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The address of the Company on the Invoices.',
'description' => 'The address of the Company on the Invoices',
]);
//Invoice company phone
Settings::firstOrCreate([
@ -180,7 +180,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The phone number of the Company on the Invoices.',
'description' => 'The phone number of the Company on the Invoices',
]);
//Invoice company mail
@ -189,7 +189,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The email address of the Company on the Invoices.',
'description' => 'The email address of the Company on the Invoices',
]);
//Invoice VAT
@ -198,7 +198,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The VAT-Number of the Company on the Invoices.',
'description' => 'The VAT-Number of the Company on the Invoices',
]);
//Invoice Website
@ -207,7 +207,7 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'string',
'description' => 'The Website of the Company on the Invoices.',
'description' => 'The Website of the Company on the Invoices',
]);
//Invoice Website
@ -216,7 +216,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'INV',
'type' => 'string',
'description' => 'The invoice prefix.',
'description' => 'The invoice prefix',
]);
//Locale
@ -225,7 +225,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'en',
'type' => 'string',
'description' => 'The default dashboard language.',
'description' => 'The default Language the dashboard will be shown in',
]);
//Dynamic locale
Settings::firstOrCreate([
@ -247,9 +247,9 @@ class SettingsSeeder extends Seeder
Settings::firstOrCreate([
'key' => 'SETTINGS::LOCALE:AVAILABLE',
], [
'value' => 'en',
'value' => '',
'type' => 'string',
'description' => 'The available languages.',
'description' => 'The available languages',
]);
//Locale
Settings::firstOrCreate([
@ -265,63 +265,63 @@ class SettingsSeeder extends Seeder
], [
'value' => env('PAYPAL_SECRET', ''),
'type' => 'string',
'description' => 'Your PayPal Secret-Key (https://developer.paypal.com/docs/integration/direct/rest/).',
'description' => 'Your PayPal Secret-Key ( https://developer.paypal.com/docs/integration/direct/rest/)',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:PAYPAL:CLIENT_ID',
], [
'value' => env('PAYPAL_CLIENT_ID', ''),
'type' => 'string',
'description' => 'Your PayPal Client_ID.',
'description' => 'Your PayPal Client_ID',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:PAYPAL:SANDBOX_SECRET',
], [
'value' => env('PAYPAL_SANDBOX_SECRET', ''),
'type' => 'string',
'description' => 'Your PayPal SANDBOX Secret-Key used for testing.',
'description' => 'Your PayPal SANDBOX Secret-Key used for testing ',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:PAYPAL:SANDBOX_CLIENT_ID',
], [
'value' => env('PAYPAL_SANDBOX_CLIENT_ID', ''),
'type' => 'string',
'description' => 'Your PayPal SANDBOX Client-ID used for testing.',
'description' => 'Your PayPal SANDBOX Client-ID used for testing ',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:STRIPE:SECRET',
], [
'value' => env('STRIPE_SECRET', ''),
'type' => 'string',
'description' => 'Your Stripe Secret-Key (https://dashboard.stripe.com/account/apikeys).',
'description' => 'Your Stripe Secret-Key ( https://dashboard.stripe.com/account/apikeys )',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:STRIPE:ENDPOINT_SECRET',
], [
'value' => env('STRIPE_ENDPOINT_SECRET', ''),
'type' => 'string',
'description' => 'Your Stripe endpoint secret-key.',
'description' => 'Your Stripe endpoint secret-key',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:STRIPE:TEST_SECRET',
], [
'value' => env('STRIPE_TEST_SECRET', ''),
'type' => 'string',
'description' => 'Your Stripe test secret-key.',
'description' => 'Your Stripe test secret-key',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:STRIPE:ENDPOINT_TEST_SECRET',
], [
'value' => env('STRIPE_ENDPOINT_TEST_SECRET', ''),
'type' => 'string',
'description' => 'Your Stripe endpoint test secret-key.',
'description' => 'Your Stripe endpoint test secret-key',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::PAYMENTS:STRIPE:METHODS',
], [
'value' => env('STRIPE_METHODS', 'card,sepa_debit'),
'type' => 'string',
'description' => 'Comma seperated list of payment methods that are enabled (https://stripe.com/docs/payments/payment-methods/integration-options).',
'description' => 'Comma seperated list of payment methods that are enabled (https://stripe.com/docs/payments/payment-methods/integration-options)',
]);
Settings::firstOrCreate([
@ -329,7 +329,7 @@ class SettingsSeeder extends Seeder
], [
'value' => env('DISCORD_CLIENT_ID', ''),
'type' => 'string',
'description' => 'Discord API Credentials (https://discordapp.com/developers/applications/).',
'description' => 'Discord API Credentials - https://discordapp.com/developers/applications/',
]);
Settings::firstOrCreate([
@ -337,14 +337,14 @@ class SettingsSeeder extends Seeder
], [
'value' => env('DISCORD_CLIENT_SECRET', ''),
'type' => 'string',
'description' => 'Discord API Credentials (https://discordapp.com/developers/applications/).',
'description' => 'Discord API Credentials - https://discordapp.com/developers/applications/',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::DISCORD:BOT_TOKEN',
], [
'value' => env('DISCORD_BOT_TOKEN', ''),
'type' => 'string',
'description' => 'Discord API Credentials (https://discordapp.com/developers/applications/).',
'description' => 'Discord API Credentials - https://discordapp.com/developers/applications/',
]);
Settings::firstOrCreate([
@ -352,7 +352,7 @@ class SettingsSeeder extends Seeder
], [
'value' => env('DISCORD_GUILD_ID', ''),
'type' => 'string',
'description' => 'Discord API Credentials (https://discordapp.com/developers/applications/).',
'description' => 'Discord API Credentials - https://discordapp.com/developers/applications/',
]);
Settings::firstOrCreate([
@ -360,14 +360,14 @@ class SettingsSeeder extends Seeder
], [
'value' => env('DISCORD_ROLE_ID', ''),
'type' => 'string',
'description' => 'Discord role that will be assigned to users when they register.',
'description' => 'Discord role that will be assigned to users when they register',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::DISCORD:INVITE_URL',
], [
'value' => env('DISCORD_INVITE_URL', ''),
'type' => 'string',
'description' => 'The invite URL to your Discord Server.',
'description' => 'The invite URL to your Discord Server',
]);
Settings::firstOrCreate([
@ -404,7 +404,7 @@ class SettingsSeeder extends Seeder
], [
'value' => env('RECAPTCHA_SITE_KEY', '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI'),
'type' => 'string',
'description' => 'Google Recaptcha API Credentials (https://www.google.com/recaptcha/admin) - reCaptcha V2 (not v3)',
'description' => 'Google Recaptcha API Credentials - https://www.google.com/recaptcha/admin - reCaptcha V2 (not v3)',
]);
Settings::firstOrCreate([
@ -412,14 +412,14 @@ class SettingsSeeder extends Seeder
], [
'value' => env('RECAPTCHA_SECRET_KEY', '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe'),
'type' => 'string',
'description' => 'Google Recaptcha API Credentials (https://www.google.com/recaptcha/admin) - reCaptcha V2 (not v3)',
'description' => 'Google Recaptcha API Credentials - https://www.google.com/recaptcha/admin - reCaptcha V2 (not v3)',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::RECAPTCHA:ENABLED',
], [
'value' => 'true',
'type' => 'boolean',
'description' => 'Enables or disables the ReCaptcha feature on the registration/login page.',
'description' => 'Enables or disables the ReCaptcha feature on the registration/login page',
]);
Settings::firstOrCreate([
@ -427,63 +427,63 @@ class SettingsSeeder extends Seeder
], [
'value' => env('MAIL_MAILER', 'smtp'),
'type' => 'string',
'description' => 'Selected Mailer (smtp, mailgun, sendgrid, mailtrap).',
'description' => 'Selected Mailer (smtp, mailgun, sendgrid, mailtrap)',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:HOST',
], [
'value' => env('MAIL_HOST', 'localhost'),
'type' => 'string',
'description' => 'Mailer Host Address.',
'description' => 'Mailer Host Address',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:PORT',
], [
'value' => env('MAIL_PORT', '25'),
'type' => 'string',
'description' => 'Mailer Server Port.',
'description' => 'Mailer Server Port',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:USERNAME',
], [
'value' => env('MAIL_USERNAME', ''),
'type' => 'string',
'description' => 'Mailer Username.',
'description' => 'Mailer Username',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:PASSWORD',
], [
'value' => env('MAIL_PASSWORD', ''),
'type' => 'string',
'description' => 'Mailer Password.',
'description' => 'Mailer Password',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:ENCRYPTION',
], [
'value' => env('MAIL_ENCRYPTION', 'tls'),
'type' => 'string',
'description' => 'Mailer Encryption (tls, ssl).',
'description' => 'Mailer Encryption (tls, ssl)',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:FROM_ADDRESS',
], [
'value' => env('MAIL_FROM_ADDRESS', ''),
'type' => 'string',
'description' => 'Mailer From Address.',
'description' => 'Mailer From Address',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::MAIL:FROM_NAME',
], [
'value' => env('APP_NAME', 'Controlpanel'),
'type' => 'string',
'description' => 'Mailer From Name.',
'description' => 'Mailer From Name',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::REFERRAL::ENABLED',
], [
'value' => 'false',
'type' => 'string',
'description' => 'Enable or disable the referral system.',
'description' => 'Enable or disable the referral system',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::REFERRAL::ALWAYS_GIVE_COMMISSION',
@ -518,7 +518,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 100,
'type' => 'integer',
'description' => 'The Percentage value a referred user gets.',
'description' => 'The Percentage Value a referred user gets',
]);
Settings::firstOrCreate([
@ -526,28 +526,28 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'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' => 'false',
'type' => 'boolean',
'description' => 'Enables the updgrade/downgrade feature for servers.',
'description' => 'Enables the updgrade/downgrade feature for servers',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS',
], [
'value' => 'true',
'type' => 'boolean',
'description' => 'Enable creation of new servers',
'description' => 'Enable/disable the creation of new servers',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:CREATION_OF_NEW_USERS',
], [
'value' => 'true',
'value' => 'false',
'type' => 'boolean',
'description' => 'Enable creation of new users',
'description' => 'Enable/disable the creation of new users',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:SHOW_IMPRINT',
@ -555,7 +555,7 @@ class SettingsSeeder extends Seeder
'value' => "false",
'type' => 'boolean',
'description' => 'Enable imprint in footer.'
'description' => 'Enable/disable imprint in footer'
]);
Settings::firstOrCreate([
@ -564,7 +564,7 @@ class SettingsSeeder extends Seeder
'value' => "false",
'type' => 'boolean',
'description' => 'Enable privacy policy in footer.'
'description' => 'Enable/disable privacy policy in footer'
]);
Settings::firstOrCreate([
@ -572,7 +572,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'false',
'type' => 'boolean',
'description' => 'Enable Terms of Service in footer.',
'description' => 'Enable/disable Terms of Service in footer',
]);
Settings::firstOrCreate([
@ -580,14 +580,14 @@ class SettingsSeeder extends Seeder
], [
'value' => 'false',
'type' => 'boolean',
'description' => 'Enable Alerts on Homepage.',
'description' => 'Enable/disable Alerts on Homepage',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:ALERT_TYPE',
], [
'value' => 'dark',
'type' => 'text',
'description' => 'Changes the Color of the Alert.',
'description' => 'Changes the Color of the Alert',
]);
Settings::firstOrCreate([
@ -595,14 +595,14 @@ class SettingsSeeder extends Seeder
], [
'value' => '',
'type' => 'text',
'description' => 'Changes the Content the Alert.',
'description' => 'Changes the Content the Alert',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:THEME',
], [
'value' => 'default',
'type' => 'text',
'description' => 'Current active theme.',
'description' => 'Current active theme',
]);
Settings::firstOrCreate([
@ -610,7 +610,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'true',
'type' => 'boolean',
'description' => 'Enable Useful Links on Homepage.',
'description' => 'Enable/disable Useful Links on Homepage',
]);
Settings::firstOrCreate([
@ -618,7 +618,7 @@ class SettingsSeeder extends Seeder
], [
'value' => 'true',
'type' => 'boolean',
'description' => 'Enable MOTD on Homepage.',
'description' => 'Enable/disable MOTD on Homepage',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:MOTD_MESSAGE',
@ -628,14 +628,14 @@ class SettingsSeeder extends Seeder
<p><span style="font-size: 18pt;">If you have any questions, make sure to join our <a href="https://discord.com/invite/4Y6HjD2uyU" target="_blank" rel="noopener">Discord</a></span></p>
<p><span style="font-size: 10pt;">(you can change this message in the <a href="admin/settings#system">Settings</a> )</span></p>',
'type' => 'text',
'description' => 'MOTD Message.',
'description' => 'MOTD Message',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::SYSTEM:SEO_TITLE',
], [
'value' => 'Controlpanel.gg',
'type' => 'text',
'description' => 'The SEO Title.',
'description' => 'The SEO Title',
]);
Settings::firstOrCreate([
@ -643,14 +643,14 @@ class SettingsSeeder extends Seeder
], [
'value' => 'Billing software for Pterodactyl Dashboard!',
'type' => 'text',
'description' => 'SEO Description.',
'description' => 'SEO Description',
]);
Settings::firstOrCreate([
'key' => 'SETTINGS::TICKET:NOTIFY',
], [
'value' => 'all',
'type' => 'text',
'description' => 'Who will get a Email Notifcation on new Tickets.',
'description' => 'Who will get a Email Notifcation on new Tickets',
]);
}
}

View file

@ -20,4 +20,4 @@
"vite": "^4.0.4",
"laravel-vite-plugin": "^0.7.3"
}
}
}

View file

@ -178,7 +178,7 @@
type="checkbox">
<label for="enable-disable-new-users">{{ __('Creation of new users') }} </label>
<i data-toggle="popover" data-trigger="hover" data-html="true" class="fas fa-info-circle"
data-content="{{ __('Enable the registration of new users on the system.') }}">
data-content="{{ __('If unchecked, it will disable the registration of new users in the system, and this will also apply to the API.') }}">
</i>
</div>
@ -265,7 +265,7 @@
<label for="enable-disable-servers">{{ __('Creation of new servers') }} </label>
</div>
<i data-toggle="popover" data-trigger="hover" data-html="true"
data-content="{{ __('Enables the creation of new servers for regular users.') }}"
data-content="{{ __('If unchecked, it will disable the creation of new servers for regular users and system moderators, this has no effect for administrators.') }}"
class="fas fa-info-circle"></i>
</div>
</div>
@ -475,7 +475,7 @@
</div>
</form>
</div>
<script>tinymce.init({selector:'textarea',promotion: false,skin: "oxide-dark",
<script>tinymce.init({selector:'textarea',skin: "oxide-dark",
content_css: "dark",branding: false, height: 500,
plugins: ['image','link'],});
</script>

View file

@ -128,7 +128,6 @@
<!-- END CONTENT -->
<script>
document.addEventListener('DOMContentLoaded', (event) => {
$('.custom-select').select2();
// Summernote
$('#description').summernote({
height: 100,
@ -145,8 +144,6 @@
]
})
})
</script>
@endsection

View file

@ -112,7 +112,6 @@
@enderror
</div>
<div class="form-group text-right">
<button type="submit" class="btn btn-primary">
{{__('Submit')}}
@ -130,7 +129,6 @@
<script>
document.addEventListener('DOMContentLoaded', (event) => {
$('.custom-select').select2();
// Summernote
$('#description').summernote({
height: 100,

View file

@ -41,7 +41,6 @@
<th width="50">{{__('Icon')}}</th>
<th>{{__('Title')}}</th>
<th>{{__('Link')}}</th>
<th>{{__('Position')}}</th>
<th>{{__('Created at')}}</th>
<th></th>
</tr>
@ -80,7 +79,6 @@
{data: 'icon'},
{data: 'title'},
{data: 'link'},
{data: 'position'},
{data: 'created_at'},
{data: 'actions', sortable: false},
],

View file

@ -16,21 +16,24 @@
href="{{ \Illuminate\Support\Facades\Storage::disk('public')->exists('favicon.ico') ? \Illuminate\Support\Facades\Storage::disk('public')->url('favicon.ico') : asset('favicon.ico') }}"
type="image/x-icon">
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="preload" href="{{ asset('plugins/fontawesome-free/css/all.min.css') }}" as="style"
onload="this.onload=null;this.rel='stylesheet'">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<noscript>
<link rel="stylesheet" href="{{ asset('plugins/fontawesome-free/css/all.min.css') }}">
</noscript>
@if (config('SETTINGS::RECAPTCHA:ENABLED') == 'true')
{!! htmlScriptTagJsApi() !!}
@endif
@vite('themes/default/sass/app.scss')
</head>
@yield('content')

View file

@ -22,6 +22,8 @@
{{-- summernote --}}
<link rel="stylesheet" href="{{ asset('plugins/summernote/summernote-bs4.min.css') }}">
{{-- datetimepicker --}}
<link rel="stylesheet"
href="{{ asset('plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css') }}">
@ -29,6 +31,7 @@
{{-- select2 --}}
<link rel="stylesheet" href="{{ asset('plugins/select2/css/select2.min.css') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link rel="preload" href="{{ asset('plugins/fontawesome-free/css/all.min.css') }}" as="style"
onload="this.onload=null;this.rel='stylesheet'">
<noscript>
@ -37,7 +40,6 @@
<script src="{{ asset('js/app.js') }}"></script>
<!-- tinymce -->
<script src={{ asset('plugins/tinymce/js/tinymce/tinymce.min.js') }}></script>
@vite('themes/default/sass/app.scss')
</head>
<body class="sidebar-mini layout-fixed dark-mode" style="height: auto;">
@ -60,7 +62,6 @@
class="fab fa-discord mr-2"></i>{{ __('Discord') }}</a>
</li>
@endif
<!-- Language Selection -->
@if (config('SETTINGS::LOCALE:CLIENTS_CAN_CHANGE') == 'true')
<li class="nav-item dropdown">
@ -85,12 +86,6 @@
</li>
<!-- End Language Selection -->
@endif
@foreach($useful_links as $link)
<li class="nav-item d-none d-sm-inline-block">
<a href="{{ $link->link }}" class="nav-link" target="__blank"><i
class="{{$link->icon}}"></i> {{ $link->title }}</a>
</li>
@endforeach
</ul>
<!-- Right navbar links -->

View file

@ -212,7 +212,7 @@
{{ __('Required') }} {{ CREDITS_DISPLAY_NAME }}
{{ __('to create this server') }}</span>
<span class="d-inline-block"
x-text="product.minimum_credits == -1 ? {{ config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') }} : product.minimum_credits"></span>
x-text="product.minimum_credits === -1 ? {{ config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') }} : product.minimum_credit"></span>
</li>
</ul>
</div>

16
webpack.mix.js vendored Normal file
View file

@ -0,0 +1,16 @@
const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.sourceMaps();