mirror of
https://github.com/coollabsio/coolify.git
synced 2026-03-11 08:55:47 +00:00
Fix component registration on SPA navigation and remove unnecessary structuredValue binding. Use modern Alpine pattern with local state and explicit commits.
87 lines
2.8 KiB
PHP
87 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\View\Components\Forms;
|
|
|
|
use Closure;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\View\Component;
|
|
use Visus\Cuid2\Cuid2;
|
|
|
|
class InputWithSelect extends Component
|
|
{
|
|
public ?string $modelBinding = null;
|
|
|
|
public ?string $htmlId = null;
|
|
|
|
public ?string $combinedBinding = null;
|
|
|
|
public function __construct(
|
|
public ?string $id = null,
|
|
public ?string $name = null,
|
|
public ?string $type = 'text',
|
|
public ?string $value = null,
|
|
public ?string $label = null,
|
|
public array $options = [],
|
|
public ?string $defaultOption = null,
|
|
public bool $required = false,
|
|
public bool $disabled = false,
|
|
public bool $readonly = false,
|
|
public ?string $helper = null,
|
|
public ?string $placeholder = null,
|
|
public string $defaultClass = 'input',
|
|
public string $autocomplete = 'off',
|
|
public ?int $minlength = null,
|
|
public ?int $maxlength = null,
|
|
public ?float $min = null,
|
|
public ?float $max = null,
|
|
public bool $autofocus = false,
|
|
public ?string $canGate = null,
|
|
public mixed $canResource = null,
|
|
public bool $autoDisable = true,
|
|
) {
|
|
// Handle authorization-based disabling
|
|
if ($this->canGate && $this->canResource && $this->autoDisable) {
|
|
$hasPermission = Gate::allows($this->canGate, $this->canResource);
|
|
|
|
if (!$hasPermission) {
|
|
$this->disabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public function render(): View|Closure|string
|
|
{
|
|
// Store original ID for wire:model binding (property name)
|
|
$this->modelBinding = $this->id;
|
|
|
|
if (is_null($this->id)) {
|
|
$this->id = new Cuid2;
|
|
// Don't create wire:model binding for auto-generated IDs
|
|
$this->modelBinding = 'null';
|
|
}
|
|
// Generate unique HTML ID by adding random suffix
|
|
// This prevents duplicate IDs when multiple forms are on the same page
|
|
if ($this->modelBinding && $this->modelBinding !== 'null') {
|
|
// Use original ID with random suffix for uniqueness
|
|
$uniqueSuffix = new Cuid2;
|
|
$this->htmlId = $this->modelBinding . '-' . $uniqueSuffix;
|
|
} else {
|
|
$this->htmlId = (string) $this->id;
|
|
}
|
|
|
|
if (is_null($this->name)) {
|
|
$this->name = $this->modelBinding !== 'null' ? $this->modelBinding : (string) $this->id;
|
|
}
|
|
|
|
if ($this->modelBinding && $this->modelBinding !== 'null') {
|
|
$this->combinedBinding = $this->modelBinding;
|
|
}
|
|
|
|
if (is_null($this->defaultOption) && !empty($this->options)) {
|
|
$this->defaultOption = array_key_first($this->options);
|
|
}
|
|
|
|
return view('components.forms.input-with-select');
|
|
}
|
|
}
|