Files
mesreleves-php/resources/views/releves/_field.blade.php
T
yann64 79bbf3671a Ajout du type de champ "place" (Lieu) pour les relevés
- FieldType::Place = 'place' dans l'enum
- _field.blade.php : composant lieu-picker réutilisé pour la saisie
- Validation : integer + exists:lieux,id dans Store/UpdateReleveRequest
- buildData() : stocke {id, nom_long} dans le JSONB (évite les requêtes à l'affichage)
- releves/show.blade.php : affiche nom_long pour les champs de type place

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:33:56 +02:00

118 lines
6.0 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);
// Pour le type place : $value est soit null, soit ['id'=>…,'nom_long'=>…]
$placeId = $field->type === FieldType::Place ? ($value['id'] ?? null) : null;
$placeNomLong = $field->type === FieldType::Place ? ($value['nom_long'] ?? '') : '';
@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
@case(FieldType::Place)
<x-lieu-picker
:name="$name"
:value="$placeId"
:display-value="$placeNomLong"
:required="$field->required"
label=""
placeholder="Rechercher un lieu…"
/>
@break
@endswitch
@error("data.{$field->name}")
<p class="text-sm text-red-600">{{ $message }}</p>
@enderror
</div>