feat: ✨ Add InputData to all settings & Render correct inputs
This commit is contained in:
parent
1011e2dcc4
commit
ac5fa6c25c
|
@ -29,17 +29,25 @@ class SettingsController extends Controller
|
||||||
$className = 'App\\Settings\\' . str_replace('.php', '', $file);
|
$className = 'App\\Settings\\' . str_replace('.php', '', $file);
|
||||||
$options = (new $className())->toArray();
|
$options = (new $className())->toArray();
|
||||||
|
|
||||||
|
if (method_exists($className, 'getOptionInputData')) {
|
||||||
|
$optionInputData = $className::getOptionInputData();
|
||||||
|
} else {
|
||||||
|
$optionInputData = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$optionsData = [];
|
||||||
|
|
||||||
foreach ($options as $key => $value) {
|
foreach ($options as $key => $value) {
|
||||||
$options[$key] = [
|
$optionsData[$key] = [
|
||||||
'value' => $value,
|
'value' => $value,
|
||||||
'label' => ucwords(str_replace('_', ' ', $key))
|
'label' => $optionInputData[$key]['label'] ?? ucwords(str_replace('_', ' ', $key)),
|
||||||
|
'type' => $optionInputData[$key]['type'] ?? 'string',
|
||||||
|
'description' => $optionInputData[$key]['description'] ?? '',
|
||||||
|
'options' => $optionInputData[$key]['options'] ?? [],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$settings[str_replace('Settings.php', '', $file)] = $optionsData;
|
||||||
|
|
||||||
$settings[str_replace('Settings.php', '', $file)] = $options;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$settings->sort();
|
$settings->sort();
|
||||||
|
|
|
@ -15,7 +15,7 @@ class DiscordSettings extends Settings
|
||||||
public ?string $guild_id;
|
public ?string $guild_id;
|
||||||
|
|
||||||
public ?string $invite_url;
|
public ?string $invite_url;
|
||||||
|
|
||||||
public ?string $role_id;
|
public ?string $role_id;
|
||||||
|
|
||||||
public static function group(): string
|
public static function group(): string
|
||||||
|
@ -31,4 +31,45 @@ class DiscordSettings extends Settings
|
||||||
'client_secret'
|
'client_secret'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'bot_token' => [
|
||||||
|
'label' => 'Bot Token',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The bot token for your Discord bot.',
|
||||||
|
],
|
||||||
|
'client_id' => [
|
||||||
|
'label' => 'Client ID',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The client ID for your Discord bot.',
|
||||||
|
],
|
||||||
|
'client_secret' => [
|
||||||
|
'label' => 'Client Secret',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The client secret for your Discord bot.',
|
||||||
|
],
|
||||||
|
'guild_id' => [
|
||||||
|
'label' => 'Guild ID',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The guild ID for your Discord server.',
|
||||||
|
],
|
||||||
|
'invite_url' => [
|
||||||
|
'label' => 'Invite URL',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The invite URL for your Discord server.',
|
||||||
|
],
|
||||||
|
'role_id' => [
|
||||||
|
'label' => 'Role ID',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The role ID for your Discord server.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,29 +6,17 @@ use Spatie\LaravelSettings\Settings;
|
||||||
|
|
||||||
class GeneralSettings extends Settings
|
class GeneralSettings extends Settings
|
||||||
{
|
{
|
||||||
|
|
||||||
public string $main_site;
|
public string $main_site;
|
||||||
|
|
||||||
public string $credits_display_name;
|
public string $credits_display_name;
|
||||||
|
|
||||||
public float $initial_user_credits;
|
public float $initial_user_credits;
|
||||||
|
|
||||||
public int $initial_server_limit;
|
public int $initial_server_limit;
|
||||||
|
|
||||||
public string $recaptcha_site_key;
|
|
||||||
|
|
||||||
public string $recaptcha_secret_key;
|
|
||||||
|
|
||||||
public bool $recaptcha_enabled;
|
public bool $recaptcha_enabled;
|
||||||
|
public string $recaptcha_site_key;
|
||||||
|
public string $recaptcha_secret_key;
|
||||||
public string $phpmyadmin_url;
|
public string $phpmyadmin_url;
|
||||||
|
|
||||||
public bool $alert_enabled;
|
public bool $alert_enabled;
|
||||||
|
|
||||||
public string $alert_type;
|
public string $alert_type;
|
||||||
|
|
||||||
public string $alert_message;
|
public string $alert_message;
|
||||||
|
|
||||||
public string $theme;
|
public string $theme;
|
||||||
|
|
||||||
//public int $initial_user_role; wait for Roles & Permissions PR.
|
//public int $initial_user_role; wait for Roles & Permissions PR.
|
||||||
|
@ -56,4 +44,87 @@ class GeneralSettings extends Settings
|
||||||
'initial_server_limit' => 'required|numeric',
|
'initial_server_limit' => 'required|numeric',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'main_site' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'Main Site URL',
|
||||||
|
'description' => 'The URL of your main site.'
|
||||||
|
],
|
||||||
|
'credits_display_name' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'Credits Display Name',
|
||||||
|
'description' => 'The name of the currency used.'
|
||||||
|
],
|
||||||
|
'initial_user_credits' => [
|
||||||
|
'type' => 'number',
|
||||||
|
'label' => 'Initial User Credits',
|
||||||
|
'description' => 'The amount of credits a user gets when they register.'
|
||||||
|
],
|
||||||
|
'initial_server_limit' => [
|
||||||
|
'type' => 'number',
|
||||||
|
'label' => 'Initial Server Limit',
|
||||||
|
'description' => 'The amount of servers a user can create when they register.'
|
||||||
|
],
|
||||||
|
'recaptcha_enabled' => [
|
||||||
|
'type' => 'boolean',
|
||||||
|
'label' => 'Enable reCAPTCHA',
|
||||||
|
'description' => 'Enable reCAPTCHA on the login page.'
|
||||||
|
],
|
||||||
|
'recaptcha_site_key' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'reCAPTCHA Site Key',
|
||||||
|
'description' => 'The site key for reCAPTCHA.'
|
||||||
|
],
|
||||||
|
'recaptcha_secret_key' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'reCAPTCHA Secret Key',
|
||||||
|
'description' => 'The secret key for reCAPTCHA.'
|
||||||
|
],
|
||||||
|
'phpmyadmin_url' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'phpMyAdmin URL',
|
||||||
|
'description' => 'The URL of your phpMyAdmin installation.'
|
||||||
|
],
|
||||||
|
'alert_enabled' => [
|
||||||
|
'type' => 'boolean',
|
||||||
|
'label' => 'Enable Alert',
|
||||||
|
'description' => 'Enable an alert to be displayed on the home page.'
|
||||||
|
],
|
||||||
|
'alert_type' => [
|
||||||
|
'type' => 'select',
|
||||||
|
'label' => 'Alert Type',
|
||||||
|
'options' => [
|
||||||
|
'primary' => 'Blue',
|
||||||
|
'secondary' => 'Grey',
|
||||||
|
'success' => 'Green',
|
||||||
|
'danger' => 'Red',
|
||||||
|
'warning' => 'Orange',
|
||||||
|
'info' => 'Cyan',
|
||||||
|
],
|
||||||
|
'description' => 'The type of alert to display.'
|
||||||
|
],
|
||||||
|
'alert_message' => [
|
||||||
|
'type' => 'string',
|
||||||
|
'label' => 'Alert Message',
|
||||||
|
'description' => 'The message to display in the alert.'
|
||||||
|
],
|
||||||
|
'theme' => [
|
||||||
|
'type' => 'select',
|
||||||
|
'label' => 'Theme',
|
||||||
|
'options' => [
|
||||||
|
'default' => 'Default',
|
||||||
|
'BlueInfinity' => 'Blue Infinity',
|
||||||
|
],
|
||||||
|
'description' => 'The theme to use for the site.'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,4 +26,55 @@ class InvoiceSettings extends Settings
|
||||||
{
|
{
|
||||||
return 'invoice';
|
return 'invoice';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'company_address' => [
|
||||||
|
'label' => 'Company Address',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The address of your company.',
|
||||||
|
],
|
||||||
|
'company_mail' => [
|
||||||
|
'label' => 'Company Mail',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The mail of your company.',
|
||||||
|
],
|
||||||
|
'company_name' => [
|
||||||
|
'label' => 'Company Name',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The name of your company.',
|
||||||
|
],
|
||||||
|
'company_phone' => [
|
||||||
|
'label' => 'Company Phone',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The phone of your company.',
|
||||||
|
],
|
||||||
|
'company_vat' => [
|
||||||
|
'label' => 'Company VAT',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The VAT of your company.',
|
||||||
|
],
|
||||||
|
'company_website' => [
|
||||||
|
'label' => 'Company Website',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The website of your company.',
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'label' => 'Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable or disable invoices.',
|
||||||
|
],
|
||||||
|
'prefix' => [
|
||||||
|
'label' => 'Prefix',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The prefix of your invoices.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,9 +15,47 @@ class LocaleSettings extends Settings
|
||||||
public string $default;
|
public string $default;
|
||||||
|
|
||||||
public bool $dynamic;
|
public bool $dynamic;
|
||||||
|
|
||||||
public static function group(): string
|
public static function group(): string
|
||||||
{
|
{
|
||||||
return 'locale';
|
return 'locale';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'available' => [
|
||||||
|
'label' => 'Available Locales',
|
||||||
|
'type' => 'multiselect',
|
||||||
|
'description' => 'The locales that are available for the user to choose from.',
|
||||||
|
'options' => config('app.available_locales'),
|
||||||
|
],
|
||||||
|
'clients_can_change' => [
|
||||||
|
'label' => 'Clients Can Change',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether clients can change their locale.',
|
||||||
|
],
|
||||||
|
'datatables' => [
|
||||||
|
'label' => 'Datatables Locale',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: <a href="https://datatables.net/plug-ins/i18n/">https://datatables.net/plug-ins/i18n/</a>',
|
||||||
|
],
|
||||||
|
'default' => [
|
||||||
|
'label' => 'Default Locale',
|
||||||
|
'type' => 'select',
|
||||||
|
'description' => 'The default locale to use.',
|
||||||
|
'options' => config('app.available_locales'),
|
||||||
|
],
|
||||||
|
'dynamic' => [
|
||||||
|
'label' => 'Dynamic Locale',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether to use the dynamic locale.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ class MailSettings extends Settings
|
||||||
public ?string $mail_mailer;
|
public ?string $mail_mailer;
|
||||||
|
|
||||||
public ?bool $mail_enabled;
|
public ?bool $mail_enabled;
|
||||||
|
|
||||||
public static function group(): string
|
public static function group(): string
|
||||||
{
|
{
|
||||||
return 'mail';
|
return 'mail';
|
||||||
|
@ -47,7 +47,61 @@ class MailSettings extends Settings
|
||||||
config()->set('mail.from.address', $this->mail_from_address);
|
config()->set('mail.from.address', $this->mail_from_address);
|
||||||
config()->set('mail.from.name', $this->mail_from_name);
|
config()->set('mail.from.name', $this->mail_from_name);
|
||||||
} catch (\Exception) {
|
} catch (\Exception) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'mail_host' => [
|
||||||
|
'label' => 'Mail Host',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The host of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_port' => [
|
||||||
|
'label' => 'Mail Port',
|
||||||
|
'type' => 'int',
|
||||||
|
'description' => 'The port of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_username' => [
|
||||||
|
'label' => 'Mail Username',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The username of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_password' => [
|
||||||
|
'label' => 'Mail Password',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The password of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_encryption' => [
|
||||||
|
'label' => 'Mail Encryption',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The encryption of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_from_address' => [
|
||||||
|
'label' => 'Mail From Address',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The from address of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_from_name' => [
|
||||||
|
'label' => 'Mail From Name',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The from name of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_mailer' => [
|
||||||
|
'label' => 'Mail Mailer',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The mailer of your mail server.',
|
||||||
|
],
|
||||||
|
'mail_enabled' => [
|
||||||
|
'label' => 'Mail Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -36,4 +36,35 @@ class PterodactylSettings extends Settings
|
||||||
{
|
{
|
||||||
return str_ends_with($this->panel_url, '/') ? $this->panel_url : $this->panel_url . '/';
|
return str_ends_with($this->panel_url, '/') ? $this->panel_url : $this->panel_url . '/';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'panel_url' => [
|
||||||
|
'label' => 'Panel URL',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The URL to your Pterodactyl panel.',
|
||||||
|
],
|
||||||
|
'admin_token' => [
|
||||||
|
'label' => 'Admin Token',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The admin user token for your Pterodactyl panel.',
|
||||||
|
],
|
||||||
|
'user_token' => [
|
||||||
|
'label' => 'User Token',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The user token for your Pterodactyl panel.',
|
||||||
|
],
|
||||||
|
'per_page_limit' => [
|
||||||
|
'label' => 'Per Page Limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The number of servers to show per page.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -22,4 +22,54 @@ class ReferralSettings extends Settings
|
||||||
{
|
{
|
||||||
return 'referral';
|
return 'referral';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'allowed' => [
|
||||||
|
'label' => 'Allowed',
|
||||||
|
'type' => 'select',
|
||||||
|
'description' => 'Who is allowed to see their referral-URL',
|
||||||
|
'options' => [
|
||||||
|
'everyone' => 'Everyone',
|
||||||
|
'clients' => 'Clients',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'always_give_commission' => [
|
||||||
|
'label' => 'Always Give Commission',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Always give commission to the referrer.',
|
||||||
|
],
|
||||||
|
'enabled' => [
|
||||||
|
'label' => 'Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable referral system.',
|
||||||
|
],
|
||||||
|
'reward' => [
|
||||||
|
'label' => 'Reward',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'Reward for the referrer.',
|
||||||
|
],
|
||||||
|
'mode' => [
|
||||||
|
'label' => 'Mode',
|
||||||
|
'type' => 'select',
|
||||||
|
'description' => 'Referral mode.',
|
||||||
|
'options' => [
|
||||||
|
'comission' => 'Comission',
|
||||||
|
'sign-up' => 'Sign-Up',
|
||||||
|
'both' => 'Both',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'percentage' => [
|
||||||
|
'label' => 'Percentage',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'If a referred user buys credits, the referral-user will get x% of the Credits the referred user bought.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -18,4 +18,35 @@ class ServerSettings extends Settings
|
||||||
{
|
{
|
||||||
return 'server';
|
return 'server';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'allocation_limit' => [
|
||||||
|
'label' => 'Allocation Limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The maximum amount of allocations to pull per node for automatic deployment, if more allocations are being used than this limit is set to, no new servers can be created.',
|
||||||
|
],
|
||||||
|
'creation_enabled' => [
|
||||||
|
'label' => 'Creation Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether or not users can create servers.',
|
||||||
|
],
|
||||||
|
'enable_upgrade' => [
|
||||||
|
'label' => 'Enable Upgrade',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether or not users can upgrade their servers.',
|
||||||
|
],
|
||||||
|
'charge_first_hour' => [
|
||||||
|
'label' => 'Charge First Hour',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether or not the first hour of a server is charged.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,11 +7,38 @@ use Spatie\LaravelSettings\Settings;
|
||||||
class TicketSettings extends Settings
|
class TicketSettings extends Settings
|
||||||
{
|
{
|
||||||
public bool $enabled;
|
public bool $enabled;
|
||||||
|
|
||||||
public string $notify;
|
public string $notify;
|
||||||
|
|
||||||
public static function group(): string
|
public static function group(): string
|
||||||
{
|
{
|
||||||
return 'ticket';
|
return 'ticket';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|bool|float|int|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'enabled' => [
|
||||||
|
'label' => 'Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable or disable the ticket system.',
|
||||||
|
],
|
||||||
|
'notify' => [
|
||||||
|
'label' => 'Notify',
|
||||||
|
'type' => 'select',
|
||||||
|
'description' => 'Who will receive an E-Mail when a new Ticket is created.',
|
||||||
|
'options' => [
|
||||||
|
'admin' => 'Admins',
|
||||||
|
'moderator' => 'Moderators',
|
||||||
|
'all' => 'Admins and Moderators',
|
||||||
|
'none' => 'Nobody',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -34,4 +34,75 @@ class UserSettings extends Settings
|
||||||
{
|
{
|
||||||
return 'user';
|
return 'user';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|boolean|number|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'credits_reward_after_verify_discord' => [
|
||||||
|
'label' => 'Credits Reward After Verify Discord',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of credits a user gets after verifying their discord account.',
|
||||||
|
],
|
||||||
|
'credits_reward_after_verify_email' => [
|
||||||
|
'label' => 'Credits Reward After Verify Email',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of credits a user gets after verifying their email.',
|
||||||
|
],
|
||||||
|
'force_discord_verification' => [
|
||||||
|
'label' => 'Force Discord Verification',
|
||||||
|
'type' => 'bool',
|
||||||
|
'description' => 'Force users to verify their discord account.',
|
||||||
|
],
|
||||||
|
'force_email_verification' => [
|
||||||
|
'label' => 'Force Email Verification',
|
||||||
|
'type' => 'bool',
|
||||||
|
'description' => 'Force users to verify their email.',
|
||||||
|
],
|
||||||
|
'initial_credits' => [
|
||||||
|
'label' => 'Initial Credits',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of credits a user gets when they register.',
|
||||||
|
],
|
||||||
|
'initial_server_limit' => [
|
||||||
|
'label' => 'Initial Server Limit',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of servers a user can create when they register.',
|
||||||
|
],
|
||||||
|
'min_credits_to_make_server' => [
|
||||||
|
'label' => 'Min Credits To Make Server',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The minimum amount of credits a user needs to create a server.',
|
||||||
|
],
|
||||||
|
'server_limit_after_irl_purchase' => [
|
||||||
|
'label' => 'Server Limit After IRL Purchase',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of servers a user can create after they purchase a server.',
|
||||||
|
],
|
||||||
|
'server_limit_after_verify_discord' => [
|
||||||
|
'label' => 'Server Limit After Verify Discord',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of servers a user can create after they verify their discord account.',
|
||||||
|
],
|
||||||
|
'server_limit_after_verify_email' => [
|
||||||
|
'label' => 'Server Limit After Verify Email',
|
||||||
|
'type' => 'number',
|
||||||
|
'description' => 'The amount of servers a user can create after they verify their email.',
|
||||||
|
],
|
||||||
|
'register_ip_check' => [
|
||||||
|
'label' => 'Register IP Check',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Check if the IP a user is registering from is already in use.',
|
||||||
|
],
|
||||||
|
'creation_enabled' => [
|
||||||
|
'label' => 'Creation Enabled',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Whether or not users can create servers.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,9 +6,7 @@ use Spatie\LaravelSettings\Settings;
|
||||||
|
|
||||||
class WebsiteSettings extends Settings
|
class WebsiteSettings extends Settings
|
||||||
{
|
{
|
||||||
public bool $motd_enabled;
|
|
||||||
|
|
||||||
public string $motd_message;
|
|
||||||
|
|
||||||
public bool $show_imprint;
|
public bool $show_imprint;
|
||||||
|
|
||||||
|
@ -17,15 +15,73 @@ class WebsiteSettings extends Settings
|
||||||
public bool $show_tos;
|
public bool $show_tos;
|
||||||
|
|
||||||
public bool $useful_links_enabled;
|
public bool $useful_links_enabled;
|
||||||
|
public bool $enable_login_logo;
|
||||||
public string $seo_title;
|
public string $seo_title;
|
||||||
|
|
||||||
public string $seo_description;
|
public string $seo_description;
|
||||||
|
public bool $motd_enabled;
|
||||||
|
|
||||||
public bool $enable_login_logo;
|
public string $motd_message;
|
||||||
|
|
||||||
public static function group(): string
|
public static function group(): string
|
||||||
{
|
{
|
||||||
return 'website';
|
return 'website';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summary of optionTypes
|
||||||
|
* Only used for the settings page
|
||||||
|
* @return array<array<'type'|'label'|'description'|'options', string|array<string, string>>>
|
||||||
|
*/
|
||||||
|
public static function getOptionInputData()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'motd_enabled' => [
|
||||||
|
'label' => 'Enable MOTD',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable the MOTD (Message of the day) on the dashboard.',
|
||||||
|
],
|
||||||
|
'motd_message' => [
|
||||||
|
'label' => 'MOTD Message',
|
||||||
|
'type' => 'textarea',
|
||||||
|
'description' => 'The message of the day.',
|
||||||
|
],
|
||||||
|
'show_imprint' => [
|
||||||
|
'label' => 'Show Imprint',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Show the imprint on the website.',
|
||||||
|
],
|
||||||
|
'show_privacy' => [
|
||||||
|
'label' => 'Show Privacy',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Show the privacy on the website.',
|
||||||
|
],
|
||||||
|
'show_tos' => [
|
||||||
|
'label' => 'Show TOS',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Show the TOS on the website.',
|
||||||
|
],
|
||||||
|
'useful_links_enabled' => [
|
||||||
|
'label' => 'Enable Useful Links',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable the useful links on the dashboard.',
|
||||||
|
],
|
||||||
|
'seo_title' => [
|
||||||
|
'label' => 'SEO Title',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The title of the website.',
|
||||||
|
],
|
||||||
|
'seo_description' => [
|
||||||
|
'label' => 'SEO Description',
|
||||||
|
'type' => 'string',
|
||||||
|
'description' => 'The description of the website.',
|
||||||
|
],
|
||||||
|
'enable_login_logo' => [
|
||||||
|
'label' => 'Enable Login Logo',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'description' => 'Enable the logo on the login page.',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -40,56 +40,89 @@
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<!-- Sidebar Menu -->
|
<!-- Sidebar Menu -->
|
||||||
<div class="d-flex w-100">
|
<div class="d-flex w-100">
|
||||||
<nav class="mt-1">
|
<div class="col-2 p-0">
|
||||||
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="tablist"
|
<nav class="mt-1">
|
||||||
data-accordion="false">
|
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="tablist"
|
||||||
@foreach ($settings as $category => $options)
|
data-accordion="false">
|
||||||
<li class="nav-item border-bottom-0">
|
@foreach ($settings as $category => $options)
|
||||||
<a href="#{{ $category }}" class="nav-link {{ $loop->first ? 'active' : '' }}"
|
<li class="nav-item border-bottom-0">
|
||||||
data-toggle="pill" role="tab">
|
<a href="#{{ $category }}"
|
||||||
<i class="nav-icon fas fa-cog"></i>
|
class="nav-link {{ $loop->first ? 'active' : '' }}" data-toggle="pill"
|
||||||
<p>
|
role="tab">
|
||||||
{{ $category }}
|
<i class="nav-icon fas fa-cog"></i>
|
||||||
</p>
|
<p>
|
||||||
</a>
|
{{ $category }}
|
||||||
</li>
|
</p>
|
||||||
@endforeach
|
</a>
|
||||||
</ul>
|
</li>
|
||||||
</nav>
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
<!-- /.sidebar-menu -->
|
<!-- /.sidebar-menu -->
|
||||||
<!-- Content in $settings -->
|
<!-- Content in $settings -->
|
||||||
<div class="tab-content ml-3" style="width: 100%;">
|
<div class="col-10 p-0">
|
||||||
@foreach ($settings as $category => $options)
|
|
||||||
<div container class="tab-pane fade container {{ $loop->first ? 'active show' : '' }}"
|
<div class="tab-content ml-3" style="width: 100%;">
|
||||||
id="{{ $category }}" role="tabpanel">
|
@foreach ($settings as $category => $options)
|
||||||
@foreach ($options as $key => $value)
|
<div container class="tab-pane fade container {{ $loop->first ? 'active show' : '' }}"
|
||||||
<div class="row">
|
id="{{ $category }}" role="tabpanel">
|
||||||
<div class="col">
|
@foreach ($options as $key => $value)
|
||||||
{{ $value['label'] }}
|
<div class="row">
|
||||||
|
<div class="col-4 d-flex align-items-center">
|
||||||
|
<label for="{{ $key }}">{{ $value['label'] }}</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-8">
|
||||||
|
<div class="custom-control mb-3 d-flex align-items-center">
|
||||||
|
@if ($value['description'])
|
||||||
|
<i class="fas fa-info-circle mr-4" data-toggle="popover"
|
||||||
|
data-trigger="hover" data-placement="top" data-html="true"
|
||||||
|
data-content="{{ $value['description'] }}"></i>
|
||||||
|
@else
|
||||||
|
<i class="fas fa-info-circle mr-4 invisible"></i>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($value['type'] == 'string')
|
||||||
|
<input type="text" class="form-control"
|
||||||
|
name="{{ $key }}" value="{{ $value['value'] }}">
|
||||||
|
@elseif ($value['type'] == 'boolean')
|
||||||
|
<input type="checkbox" name="{{ $key }}"
|
||||||
|
value="{{ $value['value'] }}">
|
||||||
|
@elseif ($value['type'] == 'number')
|
||||||
|
<input type="number" class="form-control"
|
||||||
|
name="{{ $key }}" value="{{ $value['value'] }}">
|
||||||
|
@elseif ($value['type'] == 'select')
|
||||||
|
<select id="{{ $key }}" class="custom-select w-100"
|
||||||
|
name="{{ $key }}">
|
||||||
|
@foreach ($value['options'] as $option)
|
||||||
|
<option value="{{ $option }}"
|
||||||
|
{{ $value['value'] == $option ? 'selected' : '' }}>
|
||||||
|
{{ __($option) }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@elseif($value['type'] == 'multiselect')
|
||||||
|
<select class="custom-select w-100" name="{{ $key }}"
|
||||||
|
multiple>
|
||||||
|
@foreach ($value['options'] as $option)
|
||||||
|
<option value="{{ $option }}"
|
||||||
|
{{ $value['value'] == $option ? 'selected' : '' }}>
|
||||||
|
{{ __($option) }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@elseif($value['type'] == 'textarea')
|
||||||
|
<textarea class="form-control w-100" name="{{ $key }}" rows="3">{{ $value['value'] }}</textarea>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
@endforeach
|
||||||
@if (gettype($value['value']) == 'string')
|
</div>
|
||||||
<input type="text" class="form-control" name="{{ $key }}"
|
@endforeach
|
||||||
value="{{ $value['value'] }}">
|
</div>
|
||||||
@elseif (gettype($value['value']) == 'boolean')
|
|
||||||
<input type="checkbox" class="form-control" name="{{ $key }}"
|
|
||||||
value="{{ $value['value'] }}">
|
|
||||||
@elseif (gettype($value['value']) == 'integer' || gettype($value['value']) == 'double')
|
|
||||||
<input type="number" class="form-control" name="{{ $key }}"
|
|
||||||
value="{{ $value['value'] }}">
|
|
||||||
@elseif (gettype($value['value']) == 'array')
|
|
||||||
<select class="form-control" name="{{ $key }}">
|
|
||||||
@foreach ($value['value'] as $option)
|
|
||||||
<option value="{{ $option }}">{{ $option }}
|
|
||||||
</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -97,6 +130,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- END CUSTOM CONTENT -->
|
<!-- END CUSTOM CONTENT -->
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
@ -114,5 +148,20 @@
|
||||||
window.location.hash = this.hash;
|
window.location.hash = this.hash;
|
||||||
$('html,body').scrollTop(scrollmem);
|
$('html,body').scrollTop(scrollmem);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', (event) => {
|
||||||
|
$('.custom-select').select2();
|
||||||
|
})
|
||||||
|
|
||||||
|
tinymce.init({
|
||||||
|
selector: 'textarea',
|
||||||
|
promotion: false,
|
||||||
|
skin: "oxide-dark",
|
||||||
|
content_css: "dark",
|
||||||
|
branding: false,
|
||||||
|
height: 500,
|
||||||
|
width: '100%',
|
||||||
|
plugins: ['image', 'link'],
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
Loading…
Reference in a new issue