fe96bbdf6e
Les deux inputs [valeur] (date et texte républicain) avaient le même name. x-show ne fait que display:none — les deux étaient soumis, PHP prenait le dernier (républicain vide), ce qui échouait la validation 'required'. Correction : :disabled="..." sur chaque input pour qu'il ne soit pas soumis. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
103 lines
5.4 KiB
PHP
103 lines
5.4 KiB
PHP
{{--
|
|
Rendu d'un champ dynamique selon son FieldType.
|
|
Variables attendues : $field (SourceTypeField), $value (valeur courante ou null)
|
|
--}}
|
|
@php
|
|
use App\Enums\FieldType;
|
|
$name = "data[{$field->name}]";
|
|
$inputId = "field_{$field->name}";
|
|
$oldValue = old("data.{$field->name}", $value);
|
|
@endphp
|
|
|
|
<div class="space-y-1">
|
|
<label for="{{ $inputId }}" class="block text-sm font-medium text-gray-700 dark:text-gray-300">
|
|
{{ $field->label }}
|
|
@if($field->required) <span class="text-red-500">*</span> @endif
|
|
</label>
|
|
|
|
@switch($field->type)
|
|
|
|
@case(FieldType::Text)
|
|
<input type="text" id="{{ $inputId }}" name="{{ $name }}"
|
|
value="{{ $oldValue }}"
|
|
{{ $field->required ? 'required' : '' }}
|
|
class="block w-full rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500 @error("data.{$field->name}") border-red-500 @enderror">
|
|
@break
|
|
|
|
@case(FieldType::Textarea)
|
|
<textarea id="{{ $inputId }}" name="{{ $name }}" rows="3"
|
|
{{ $field->required ? 'required' : '' }}
|
|
class="block w-full rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500 @error("data.{$field->name}") border-red-500 @enderror">{{ $oldValue }}</textarea>
|
|
@break
|
|
|
|
@case(FieldType::Number)
|
|
<input type="number" id="{{ $inputId }}" name="{{ $name }}"
|
|
value="{{ $oldValue }}" step="any"
|
|
{{ $field->required ? 'required' : '' }}
|
|
class="block w-full rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500 @error("data.{$field->name}") border-red-500 @enderror">
|
|
@break
|
|
|
|
@case(FieldType::Boolean)
|
|
@php $checked = old("data.{$field->name}", $value) ? true : false; @endphp
|
|
<div class="flex items-center gap-2 mt-1">
|
|
<input type="hidden" name="{{ $name }}" value="0">
|
|
<input type="checkbox" id="{{ $inputId }}" name="{{ $name }}" value="1"
|
|
{{ $checked ? 'checked' : '' }}
|
|
class="rounded border-gray-300 dark:border-gray-600 text-indigo-600 focus:ring-indigo-500">
|
|
<span class="text-sm text-gray-600 dark:text-gray-400">{{ $field->label }}</span>
|
|
</div>
|
|
@break
|
|
|
|
@case(FieldType::Select)
|
|
<select id="{{ $inputId }}" name="{{ $name }}"
|
|
{{ $field->required ? 'required' : '' }}
|
|
class="block w-full rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500 @error("data.{$field->name}") border-red-500 @enderror">
|
|
@if(!$field->required) <option value="">— Choisir —</option> @endif
|
|
@foreach($field->options ?? [] as $opt)
|
|
<option value="{{ $opt }}" {{ $oldValue === $opt ? 'selected' : '' }}>{{ $opt }}</option>
|
|
@endforeach
|
|
</select>
|
|
@break
|
|
|
|
@case(FieldType::Date)
|
|
@php
|
|
$dateVal = is_array($oldValue) ? ($oldValue['valeur'] ?? '') : '';
|
|
$dateCal = is_array($oldValue) ? ($oldValue['calendrier'] ?? 'gregorien') : old("data.{$field->name}.calendrier", 'gregorien');
|
|
@endphp
|
|
<div x-data="{ cal: '{{ $dateCal }}' }" class="flex gap-2">
|
|
{{-- Sélecteur de calendrier --}}
|
|
<select name="{{ $name }}[calendrier]" x-model="cal"
|
|
class="w-40 rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500">
|
|
<option value="gregorien">Grégorien</option>
|
|
<option value="julien">Julien</option>
|
|
<option value="republicain">Républicain</option>
|
|
</select>
|
|
|
|
{{-- Date grégorienne / julienne : input date HTML5 --}}
|
|
<input x-show="cal !== 'republicain'"
|
|
:disabled="cal === 'republicain'"
|
|
type="date" name="{{ $name }}[valeur]"
|
|
value="{{ $dateCal !== 'republicain' ? $dateVal : '' }}"
|
|
{{ $field->required ? 'required' : '' }}
|
|
class="flex-1 rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500">
|
|
|
|
{{-- Date républicaine : saisie texte libre (ex: "15 Vendémiaire An III") --}}
|
|
<input x-show="cal === 'republicain'" x-cloak
|
|
:disabled="cal !== 'republicain'"
|
|
type="text" name="{{ $name }}[valeur]"
|
|
value="{{ $dateCal === 'republicain' ? $dateVal : '' }}"
|
|
placeholder="ex : 15 Vendémiaire An III"
|
|
class="flex-1 rounded-md border-gray-300 dark:border-gray-600 shadow-sm text-sm focus:border-indigo-500 focus:ring-indigo-500">
|
|
</div>
|
|
@error("data.{$field->name}.valeur")
|
|
<p class="text-sm text-red-600">{{ $message }}</p>
|
|
@enderror
|
|
@break
|
|
|
|
@endswitch
|
|
|
|
@error("data.{$field->name}")
|
|
<p class="text-sm text-red-600">{{ $message }}</p>
|
|
@enderror
|
|
</div>
|