diff --git a/app/Filament/Pages/Settings.php b/app/Filament/Pages/Settings.php index 4c766a53e..12d6f46af 100644 --- a/app/Filament/Pages/Settings.php +++ b/app/Filament/Pages/Settings.php @@ -522,6 +522,25 @@ class Settings extends Page implements HasForms ->suffix('Requests Per Minute') ->default(env('APP_API_APPLICATION_RATELIMIT', config('http.rate_limit.application'))), ]), + Section::make('Server') + ->description('Settings for Servers.') + ->columns() + ->collapsible() + ->collapsed() + ->schema([ + Toggle::make('PANEL_EDITABLE_SERVER_DESCRIPTIONS') + ->label('Allow Users to edit Server Descriptions?') + ->onIcon('tabler-check') + ->offIcon('tabler-x') + ->onColor('success') + ->offColor('danger') + ->live() + ->columnSpanFull() + ->formatStateUsing(fn ($state): bool => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_EDITABLE_SERVER_DESCRIPTIONS', (bool) $state)) + ->default(env('PANEL_EDITABLE_SERVER_DESCRIPTIONS', config('panel.editable_server_descriptions'))), + ]), + ]; } diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index 8264eb9f5..acdbcab4d 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -297,7 +297,7 @@ class CreateServer extends CreateRecord 'md' => 6, 'lg' => 6, ]) - ->label('Notes'), + ->label('Description'), ]), Wizard\Step::make('Egg Configuration') diff --git a/app/Http/Controllers/Api/Client/Servers/SettingsController.php b/app/Http/Controllers/Api/Client/Servers/SettingsController.php index eb3b95bc8..af82794fd 100644 --- a/app/Http/Controllers/Api/Client/Servers/SettingsController.php +++ b/app/Http/Controllers/Api/Client/Servers/SettingsController.php @@ -2,16 +2,16 @@ namespace App\Http\Controllers\Api\Client\Servers; -use Illuminate\Http\Response; -use App\Models\Server; -use Illuminate\Http\JsonResponse; use App\Facades\Activity; -use App\Services\Servers\ReinstallServerService; use App\Http\Controllers\Api\Client\ClientApiController; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use App\Http\Requests\Api\Client\Servers\Settings\ReinstallServerRequest; use App\Http\Requests\Api\Client\Servers\Settings\RenameServerRequest; use App\Http\Requests\Api\Client\Servers\Settings\SetDockerImageRequest; -use App\Http\Requests\Api\Client\Servers\Settings\ReinstallServerRequest; +use App\Models\Server; +use App\Services\Servers\ReinstallServerService; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class SettingsController extends ClientApiController { @@ -33,7 +33,11 @@ class SettingsController extends ClientApiController $description = $request->has('description') ? (string) $request->input('description') : $server->description; $server->name = $name; - $server->description = $description; + + if (config('panel.editable_server_descriptions')) { + $server->description = $description; + } + $server->save(); if ($server->name !== $name) { diff --git a/app/Http/ViewComposers/AssetComposer.php b/app/Http/ViewComposers/AssetComposer.php index 2a47096fb..6908f4139 100644 --- a/app/Http/ViewComposers/AssetComposer.php +++ b/app/Http/ViewComposers/AssetComposer.php @@ -2,8 +2,8 @@ namespace App\Http\ViewComposers; -use Illuminate\View\View; use App\Services\Helpers\AssetHashService; +use Illuminate\View\View; class AssetComposer { @@ -28,6 +28,7 @@ class AssetComposer 'siteKey' => config('recaptcha.website_key') ?? '', ], 'usesSyncDriver' => config('queue.default') === 'sync', + 'serverDescriptionsEditable' => config('panel.editable_server_descriptions'), ]); } } diff --git a/app/Transformers/Api/Client/ServerTransformer.php b/app/Transformers/Api/Client/ServerTransformer.php index 07cd64dbd..df8a36bb9 100644 --- a/app/Transformers/Api/Client/ServerTransformer.php +++ b/app/Transformers/Api/Client/ServerTransformer.php @@ -2,17 +2,17 @@ namespace App\Transformers\Api\Client; +use App\Models\Allocation; use App\Models\Egg; +use App\Models\EggVariable; +use App\Models\Permission; use App\Models\Server; use App\Models\Subuser; -use League\Fractal\Resource\Item; -use App\Models\Allocation; -use App\Models\Permission; -use Illuminate\Container\Container; -use App\Models\EggVariable; -use League\Fractal\Resource\Collection; -use League\Fractal\Resource\NullResource; use App\Services\Servers\StartupCommandService; +use Illuminate\Container\Container; +use League\Fractal\Resource\Collection; +use League\Fractal\Resource\Item; +use League\Fractal\Resource\NullResource; class ServerTransformer extends BaseClientTransformer { @@ -36,7 +36,7 @@ class ServerTransformer extends BaseClientTransformer $user = $this->request->user(); - return [ + $data = [ 'server_owner' => $user->id === $server->owner_id, 'identifier' => $server->uuid_short, 'internal_id' => $server->id, @@ -76,6 +76,12 @@ class ServerTransformer extends BaseClientTransformer 'is_installing' => !$server->isInstalled(), 'is_transferring' => !is_null($server->transfer), ]; + + if (!config('panel.editable_server_descriptions')) { + unset($data['description']); + } + + return $data; } /** diff --git a/config/panel.php b/config/panel.php index 868cb51fc..5d45fc543 100644 --- a/config/panel.php +++ b/config/panel.php @@ -169,4 +169,6 @@ return [ ], 'use_binary_prefix' => env('PANEL_USE_BINARY_PREFIX', true), + + 'editable_server_descriptions' => env('PANEL_EDITABLE_SERVER_DESCRIPTIONS', true), ]; diff --git a/resources/scripts/components/server/settings/RenameServerBox.tsx b/resources/scripts/components/server/settings/RenameServerBox.tsx index 9cb290a1a..ce00f6bc0 100644 --- a/resources/scripts/components/server/settings/RenameServerBox.tsx +++ b/resources/scripts/components/server/settings/RenameServerBox.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { ServerContext } from '@/state/server'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; import { Field as FormikField, Form, Formik, FormikHelpers, useFormikContext } from 'formik'; -import { Actions, useStoreActions } from 'easy-peasy'; +import { Actions, useStoreActions, useStoreState } from 'easy-peasy'; import renameServer from '@/api/server/renameServer'; import Field from '@/components/elements/Field'; import { object, string } from 'yup'; @@ -23,17 +23,21 @@ interface Values { const RenameServerBox = () => { const { isSubmitting } = useFormikContext(); + const serverDescriptionsEditable = useStoreState((state) => state.settings.data!.serverDescriptionsEditable); + return (
-
- - - - -
+ {serverDescriptionsEditable && ( +
+ + + + +
+ )}
diff --git a/resources/scripts/state/settings.ts b/resources/scripts/state/settings.ts index 06f82a02e..7b5c048c3 100644 --- a/resources/scripts/state/settings.ts +++ b/resources/scripts/state/settings.ts @@ -8,6 +8,7 @@ export interface SiteSettings { siteKey: string; }; usesSyncDriver: boolean; + serverDescriptionsEditable: boolean; } export interface SettingsStore {