mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 08:46:51 +01:00 
			
		
		
		
	 d5d50d4150
			
		
	
	
		d5d50d4150
		
			
		
	
	
	
	
		
			
			Co-authored-by: RMartinOscar <40749467+RMartinOscar@users.noreply.github.com> Co-authored-by: notCharles <charles@pelican.dev>
		
			
				
	
	
		
			235 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Filament\Components\Forms\Fields;
 | |
| 
 | |
| use App\Enums\StartupVariableType;
 | |
| use App\Models\ServerVariable;
 | |
| use Closure;
 | |
| use Filament\Forms\Components\Concerns\HasAffixes;
 | |
| use Filament\Forms\Components\Concerns\HasExtraInputAttributes;
 | |
| use Filament\Forms\Components\Concerns\HasPlaceholder;
 | |
| use Filament\Forms\Components\Field;
 | |
| use Filament\Schemas\Components\StateCasts\BooleanStateCast;
 | |
| use Filament\Schemas\Components\StateCasts\Contracts\StateCast;
 | |
| use Filament\Schemas\Components\StateCasts\NumberStateCast;
 | |
| use Filament\Schemas\Components\Utilities\Get;
 | |
| use Filament\Support\Concerns\HasExtraAlpineAttributes;
 | |
| use Illuminate\Support\Arr;
 | |
| use Illuminate\Support\Str;
 | |
| 
 | |
| class StartupVariable extends Field
 | |
| {
 | |
|     use HasAffixes;
 | |
|     use HasExtraAlpineAttributes;
 | |
|     use HasExtraInputAttributes;
 | |
|     use HasPlaceholder;
 | |
| 
 | |
|     /** @var view-string */
 | |
|     protected string $view = 'filament.components.startup-variable';
 | |
| 
 | |
|     protected string|Closure|null $variableName = null;
 | |
| 
 | |
|     protected string|Closure|null $variableDesc = null;
 | |
| 
 | |
|     protected string|Closure|null $variableEnv = null;
 | |
| 
 | |
|     protected string|Closure|null $variableDefault = null;
 | |
| 
 | |
|     /** @var string[]|Closure|null */
 | |
|     protected array|Closure|null $variableRules = [];
 | |
| 
 | |
|     protected function setUp(): void
 | |
|     {
 | |
|         parent::setUp();
 | |
| 
 | |
|         $this->label(fn (StartupVariable $component) => $component->getVariableName());
 | |
| 
 | |
|         $this->prefix(fn (StartupVariable $component) => '{{' . $component->getVariableEnv() . '}}');
 | |
| 
 | |
|         $this->hintIcon('tabler-code', fn (StartupVariable $component) => implode('|', $component->getVariableRules()));
 | |
| 
 | |
|         $this->helperText(fn (StartupVariable $component) => !$component->getVariableDesc() ? '—' : $component->getVariableDesc());
 | |
| 
 | |
|         $this->rules(fn (StartupVariable $component) => $component->getVariableRules());
 | |
| 
 | |
|         $this->placeholder(fn (StartupVariable $component) => $component->getVariableDefault());
 | |
| 
 | |
|         $this->live(onBlur: true);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return StateCast[]
 | |
|      */
 | |
|     public function getDefaultStateCasts(): array
 | |
|     {
 | |
|         return match ($this->getType()) {
 | |
|             StartupVariableType::Number => [
 | |
|                 ...parent::getDefaultStateCasts(),
 | |
|                 new NumberStateCast(false),
 | |
|             ],
 | |
|             StartupVariableType::Toggle => [
 | |
|                 ...parent::getDefaultStateCasts(),
 | |
|                 new BooleanStateCast(false),
 | |
|             ],
 | |
|             default => parent::getDefaultStateCasts()
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     public function fromForm(): static
 | |
|     {
 | |
|         $this->variableName(fn (Get $get) => $get('name'));
 | |
|         $this->variableDesc(fn (Get $get) => $get('description'));
 | |
|         $this->variableEnv(fn (Get $get) => $get('env_variable'));
 | |
|         $this->variableDefault(fn (Get $get) => $get('default_value'));
 | |
|         $this->variableRules(fn (Get $get) => $get('rules'));
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function fromRecord(): static
 | |
|     {
 | |
|         $this->variableName(fn (?ServerVariable $record) => $record?->variable->name);
 | |
|         $this->variableDesc(fn (?ServerVariable $record) => $record?->variable->description);
 | |
|         $this->variableEnv(fn (?ServerVariable $record) => $record?->variable->env_variable);
 | |
|         $this->variableDefault(fn (?ServerVariable $record) => $record?->variable->default_value);
 | |
|         $this->variableRules(fn (?ServerVariable $record) => $record?->variable->rules);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function variableName(string|Closure|null $name): static
 | |
|     {
 | |
|         $this->variableName = $name;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function variableDesc(string|Closure|null $desc): static
 | |
|     {
 | |
|         $this->variableDesc = $desc;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function variableEnv(string|Closure|null $envVariable): static
 | |
|     {
 | |
|         $this->variableEnv = $envVariable;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function variableDefault(string|Closure|null $default): static
 | |
|     {
 | |
|         $this->variableDefault = $default;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /** @param string[]|Closure|null $rules */
 | |
|     public function variableRules(array|Closure|null $rules): static
 | |
|     {
 | |
|         $this->variableRules = $rules;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function getVariableName(): ?string
 | |
|     {
 | |
|         return $this->evaluate($this->variableName);
 | |
|     }
 | |
| 
 | |
|     public function getVariableDesc(): ?string
 | |
|     {
 | |
|         return $this->evaluate($this->variableDesc);
 | |
|     }
 | |
| 
 | |
|     public function getVariableEnv(): ?string
 | |
|     {
 | |
|         return $this->evaluate($this->variableEnv);
 | |
|     }
 | |
| 
 | |
|     public function getVariableDefault(): ?string
 | |
|     {
 | |
|         return $this->evaluate($this->variableDefault);
 | |
|     }
 | |
| 
 | |
|     /** @return string[] */
 | |
|     public function getVariableRules(): array
 | |
|     {
 | |
|         return (array) ($this->evaluate($this->variableRules) ?? []);
 | |
|     }
 | |
| 
 | |
|     public function isRequired(): bool
 | |
|     {
 | |
|         $rules = $this->getVariableRules();
 | |
| 
 | |
|         return in_array('required', $rules);
 | |
|     }
 | |
| 
 | |
|     public function getMinValue(): ?int
 | |
|     {
 | |
|         $rules = $this->getVariableRules();
 | |
| 
 | |
|         $minRule = Arr::first($rules, fn ($value) => str($value)->startsWith('min:'));
 | |
|         if ($minRule) {
 | |
|             return str($minRule)
 | |
|                 ->after('min:')
 | |
|                 ->trim()
 | |
|                 ->toInteger();
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     public function getMaxValue(): ?int
 | |
|     {
 | |
|         $rules = $this->getVariableRules();
 | |
| 
 | |
|         $maxRule = Arr::first($rules, fn ($value) => str($value)->startsWith('max:'));
 | |
|         if ($maxRule) {
 | |
|             return str($maxRule)
 | |
|                 ->after('max:')
 | |
|                 ->trim()
 | |
|                 ->toInteger();
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     public function getType(): StartupVariableType
 | |
|     {
 | |
|         $rules = $this->getVariableRules();
 | |
| 
 | |
|         if (Arr::first($rules, fn ($value) => str($value)->startsWith('in:'), false)) {
 | |
|             return StartupVariableType::Select;
 | |
|         }
 | |
| 
 | |
|         if (in_array('boolean', $rules)) {
 | |
|             return StartupVariableType::Toggle;
 | |
|         }
 | |
| 
 | |
|         if (in_array('numeric', $rules) || in_array('integer', $rules)) {
 | |
|             return StartupVariableType::Number;
 | |
|         }
 | |
| 
 | |
|         return StartupVariableType::Text;
 | |
|     }
 | |
| 
 | |
|     /** @return string[] */
 | |
|     public function getSelectOptions(): array
 | |
|     {
 | |
|         $rules = $this->getVariableRules();
 | |
| 
 | |
|         $inRule = Arr::first($rules, fn ($value) => str($value)->startsWith('in:'));
 | |
|         if ($inRule) {
 | |
|             return str($inRule)
 | |
|                 ->after('in:')
 | |
|                 ->explode(',')
 | |
|                 ->each(fn ($value) => Str::trim($value))
 | |
|                 ->all();
 | |
|         }
 | |
| 
 | |
|         return [];
 | |
|     }
 | |
| }
 |