Publier Globinours 1.0.0-rc.3

This commit is contained in:
Alexandre NOEL 2026-09-03 12:39:15 +02:00
commit 9a2b4068da
325 changed files with 38230 additions and 20 deletions

717
app/Views/animal_form.php Normal file
View file

@ -0,0 +1,717 @@
<?php
/** @var array $animal */
/** @var array $statuses */
/** @var array $speciesOptions */
// Liste races (tu pourras lexternaliser plus tard en table ref)
$breeds = [
'Chat Européen',
'Abyssin','Bengal','British Shorthair','Chartreux','Maine Coon','Norvégien',
'Persan','Ragdoll','Siamois','Sphynx','Sacré de Birmanie','Scottish Fold',
'Autre / Inconnu',
];
$statuses = ['refuge' => t('status.refuge'),'fa' => t('status.fa'),'fa_permanente' => t('status.fa_permanente'),'chat_libre' => t('status.chat_libre'),'quarantaine' => t('status.quarantaine'),'soin' => t('status.soin'),'isolation' => t('status.isolation'),'hospitalise' => t('status.hospitalise'),'reserve' => t('status.reserve'),'adopte' => t('status.adopte'),'enfui' => t('status.enfui')];
if (in_array((string)($animal['status'] ?? ''), ['decede','décédé'], true)) {
$statuses['decede'] = t('status.decede');
}
$sexLabels = [
'M' => t('sex.male'),
'F' => t('sex.female'),
'U' => t('animals.to_define'),
];
$hairTypes = [
'' => t('animals.to_define'),
'court' => t('animals.short_hair'),
'mi-long' => t('animals.medium_hair'),
'long' => t('animals.long_hair'),
'frise' => t('animals.curly_hair'),
'sans-poil' => t('animals.hairless'),
];
$lifeProfileOptions = [
'unknown' => t('animals.test_unknown'),
'yes' => 'Oui',
'no' => 'Non',
];
$coatColors = [
'Bicolore Noir / Blanc',
'Bicolore Gris / Blanc',
'Bicolore Roux / Blanc',
'Bicolore Tigré et Blanc',
'Gris',
'Roux',
'Noir',
'Chocolat',
'Blanc',
'Tricolore / Calico',
'Écaille de tortue',
'Colourpoint / Siamois',
'Tigré / Tabby',
];
$breed = (string)($animal['breed'] ?? '');
$id = (int)($animal['id'] ?? 0);
$isEdit = $id > 0;
$isArchivedEdit = $isEdit && !empty($animal['archived_at']);
$status = (string)($animal['status'] ?? 'refuge');
$sex = (string)($animal['sex'] ?? 'U');
$birth_is_estimated = (int)($animal['birth_is_estimated'] ?? 0);
$birth_estimated_months = (int)($animal['birth_estimated_months'] ?? 0);
$estYears = $birth_estimated_months > 0 ? intdiv($birth_estimated_months, 12) : '';
$estMonths = $birth_estimated_months > 0 ? ($birth_estimated_months % 12) : '';
?>
<div class="row row-cards">
<div class="col-12">
<form method="post" action="/animal/save" class="card">
<div class="card-body">
<input type="hidden" name="id" value="<?= $id ?>">
<?php if ($isArchivedEdit): ?><input type="hidden" name="status" value="<?= h($status) ?>">
<div class="alert alert-info">📦 <?= h(t('animal.archive_edit_help')) ?></div><?php endif; ?>
<div class="row g-3">
<!-- IDENTITÉ -->
<div class="col-12">
<div class="card card-sm">
<div class="card-status-top bg-primary"></div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<span class="status status-blue me-2"></span>
<h4 class="m-0"><?= h(t('animal.tab.identity')) ?></h4>
</div>
<div class="row g-3">
<div class="col-12 col-md-8">
<label class="form-label"><?= h(t('common.name')) ?></label>
<input class="form-control" name="name" value="<?= h($animal['name'] ?? '') ?>"
required>
</div>
<div class="col-12 col-md-4">
<label class="form-label required"><?= h(t('animal.species')) ?></label>
<select class="form-select" name="species" id="animalSpecies" required>
<?php foreach (($speciesOptions ?? []) as $option): ?>
<option value="<?= h($option['code']) ?>"
data-category="<?= h($option['category']) ?>"
<?= SpeciesService::normalize((string)($animal['species'] ?? 'chat')) === $option['code'] ? 'selected' : '' ?>>
<?= h($option['icon'] . ' ' . $option['name']) ?><?= empty($option['active']) ? ' (' . h(t('common.disabled')) . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-hint"><?= h(t('animal.form.species_hint')) ?></div>
</div>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('common.weight')) ?></label>
<input class="form-control" name="initial_weight" type="number" step="0.01"
min="0" value="<?= h($animal['initial_weight'] ?? '') ?>"
placeholder="ex: 4.25">
<div class="form-hint"><?= h(t('animal.form.weight_hint')) ?></div>
</div>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('animal.status')) ?></label>
<select class="form-select" name="status_display" id="status"
<?= $isArchivedEdit ? 'disabled' : '' ?>>
<?php foreach ($statuses as $k => $label): ?>
<option value="<?= h($k) ?>" <?= ($status === $k) ? 'selected' : '' ?>>
<?= h($label) ?></option>
<?php endforeach; ?>
</select>
<div class="form-hint"><?= h(t('animal.form.status_hint')) ?></div>
</div>
<div class="col-12 col-md-4" id="refugeRoomField">
<label class="form-label"><?= h(t('animal.form.shelter_room')) ?></label>
<select class="form-select" name="refuge_room"
<?= $isArchivedEdit ? 'disabled' : '' ?>>
<option value=""><?= h(t('animal.assign')) ?></option>
<?php foreach (($shelterRooms ?? []) as $room): ?><option
value="<?= h($room['code']) ?>"
data-status="<?= h($room['status_code']) ?>"
<?= (($animal['refuge_room'] ?? '') === $room['code']) ? 'selected' : '' ?>>
<?= h($room['name']) ?></option><?php endforeach; ?>
</select>
</div>
<div class="col-12 col-md-4" id="fosterContactField">
<label class="form-label"><?= h(t('animal.form.foster')) ?></label>
<select class="form-select" name="foster_contact_id">
<option value=""><?= h(t('animal.form.provide_later')) ?></option>
<?php foreach (($fosterContacts ?? []) as $contact): ?>
<option value="<?= (int)$contact['id'] ?>"
<?= (int)($currentFosterId ?? 0) === (int)$contact['id'] ? 'selected' : '' ?>>
<?= h($contact['name'] . (!empty($contact['city']) ? ' · ' . $contact['city'] : '')) ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-hint"><?= h(t('animal.form.foster_hint')) ?></div>
</div>
<div class="col-12 d-none" id="freeCatFields">
<div class="card bg-green-lt border-green-lt">
<div class="card-body py-3">
<div class="d-flex align-items-center gap-2 mb-3"><span
aria-hidden="true">🌿</span>
<div><strong><?= h(t('freecat.journey')) ?></strong>
<div class="text-muted small">
<?= h(t('freecat.journey_help')) ?></div>
</div>
</div>
<div class="row g-3">
<div class="col-md-6"><label
class="form-label"><?= h(t('freecat.site')) ?></label><input
class="form-control" name="free_cat_site_name"
value="<?= h($animal['free_cat_site_name'] ?? '') ?>"
maxlength="180"
placeholder="<?= h(t('freecat.site_example')) ?>"></div>
<div class="col-md-3"><label
class="form-label"><?= h(t('common.city')) ?></label><input
class="form-control" name="free_cat_city"
value="<?= h($animal['free_cat_city'] ?? '') ?>"
maxlength="120"></div>
<div class="col-md-3"><label
class="form-label"><?= h(t('freecat.tracking_state')) ?></label><select
class="form-select"
name="free_cat_tracking_status"><?php foreach (['present' => t('freecat.present'),'missing' => t('freecat.missing'),'moved' => t('freecat.moved')] as $key => $label): ?>
<option value="<?= h($key) ?>"
<?= ($animal['free_cat_tracking_status'] ?? 'present') === $key ? 'selected' : '' ?>>
<?= h($label) ?></option><?php endforeach; ?></select>
<div class="form-hint"><?= h(t('freecat.death_help')) ?></div>
</div>
<div class="col-md-6"><label
class="form-label"><?= h(t('freecat.precise_location')) ?>
<span
class="text-muted">(<?= h(t('common.internal')) ?>)</span></label><input
class="form-control" name="free_cat_address"
value="<?= h($animal['free_cat_address'] ?? '') ?>"
maxlength="255"
placeholder="<?= h(t('freecat.address_placeholder')) ?>">
</div>
<div class="col-md-6"><label
class="form-label"><?= h(t('freecat.caretaker')) ?></label><select
class="form-select" name="free_cat_caretaker_contact_id">
<option value=""><?= h(t('common.not_provided')) ?></option>
<?php foreach (($freeCatCaretakers ?? []) as $contact): ?>
<option value="<?= (int)$contact['id'] ?>"
<?= (int)($animal['free_cat_caretaker_contact_id'] ?? 0) === (int)$contact['id'] ? 'selected' : '' ?>>
<?= h($contact['name'] . (!empty($contact['city']) ? ' · ' . $contact['city'] : '')) ?>
</option><?php endforeach; ?>
</select>
<div class="form-hint"><?= h(t('freecat.directory_person')) ?>
</div>
</div>
<div class="col-md-6"><label
class="form-label"><?= h(t('freecat.capture_date')) ?></label><input
class="form-control" type="date" name="free_cat_captured_at"
value="<?= h($animal['free_cat_captured_at'] ?? '') ?>">
</div>
<div class="col-md-6"><label
class="form-label"><?= h(t('freecat.release_date')) ?></label><input
class="form-control" type="date" name="free_cat_released_at"
value="<?= h($animal['free_cat_released_at'] ?? '') ?>">
</div>
</div>
</div>
</div>
</div>
<?php if (!empty($animal['id'])): ?>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('animal.form.location_reason')) ?></label>
<input class="form-control" name="location_change_reason" maxlength="255"
placeholder="Facultatif : changement de salle, retour de FA…"
<?= $isArchivedEdit ? 'disabled' : '' ?>>
<div class="form-hint"><?= h(t('animal.form.location_reason_hint')) ?></div>
</div>
<?php endif; ?>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('animal.breed')) ?></label>
<input class="form-control" name="breed" list="breedSuggestions"
value="<?= h($breed) ?>" placeholder="Race ou type, facultatif">
<datalist id="breedSuggestions"><?php foreach ($breeds as $b): ?><option
value="<?= h($b) ?>"><?php endforeach; ?></datalist>
</div>
<div class="col-12 col-md-6">
<label class="form-label"><?= h(t('animal.coat')) ?></label>
<?php $currentColor = trim((string)($animal['color'] ?? '')); ?>
<div class="input-group">
<span class="input-group-text"><span id="coatColorSwatch"
class="coat-swatch"
style="<?= h(coat_swatch_style($currentColor)) ?>"></span></span>
<select class="form-select" name="color" id="coatColorSelect">
<option value="" data-swatch="<?= h(coat_swatch_style('')) ?>"
<?= $currentColor === '' ? 'selected' : '' ?>>
<?= h(t('animals.to_define')) ?></option>
<?php if ($currentColor !== '' && !in_array($currentColor, $coatColors, true)): ?>
<option value="<?= h($currentColor) ?>"
data-swatch="<?= h(coat_swatch_style($currentColor)) ?>" selected>
<?= h($currentColor) ?> (valeur actuelle)</option>
<?php endif; ?>
<?php foreach ($coatColors as $coatColor): ?>
<option value="<?= h($coatColor) ?>"
data-swatch="<?= h(coat_swatch_style($coatColor)) ?>"
<?= $currentColor === $coatColor ? 'selected' : '' ?>>
<?= h($coatColor) ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="col-12 col-md-6">
<label class="form-label"><?= h(t('animal.form.hair_type')) ?></label>
<select class="form-select" name="hair_type">
<?php foreach ($hairTypes as $value => $label): ?>
<option value="<?= h($value) ?>"
<?= ((string)($animal['hair_type'] ?? '') === $value) ? 'selected' : '' ?>>
<?= h($label) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-12 col-md-3">
<label class="form-label"><?= h(t('animal.sex')) ?></label>
<select class="form-select" name="sex">
<option value="U" <?= $sex === 'U' ? 'selected' : '' ?>>
<?= h(t('animals.to_define')) ?></option>
<option value="M" <?= $sex === 'M' ? 'selected' : '' ?>>
<?= h(t('sex.male')) ?></option>
<option value="F" <?= $sex === 'F' ? 'selected' : '' ?>>
<?= h(t('sex.female')) ?></option>
</select>
</div>
<div class="col-12 col-md-3">
<label class="form-label"><?= h(t('animal.form.sterilization')) ?></label>
<select class="form-select" name="sterilization_status"
id="sterilizationStatus">
<option value="unknown"
<?= (($animal['sterilization_status'] ?? 'unknown') === 'unknown') ? 'selected' : '' ?>>
<?= h(t('common.unknown')) ?></option>
<option value="no"
<?= (($animal['sterilization_status'] ?? 'unknown') === 'no') ? 'selected' : '' ?>>
<?= h(t('animals.not_sterilized')) ?></option>
<option value="yes"
<?= (($animal['sterilization_status'] ?? 'unknown') === 'yes') ? 'selected' : '' ?>>
<?= h(t('animal.sterilized')) ?></option>
</select>
</div>
<div class="col-12 row g-3 m-0 p-0 <?= (($animal['sterilization_status'] ?? 'unknown') === 'yes') ? '' : 'd-none' ?>"
id="sterilizationDetails">
<div class="col-md-4"><label
class="form-label"><?= h(t('animal.form.sterilization_date')) ?></label><input
class="form-control" type="date" name="sterilization_date"
value="<?= h($animal['sterilization_date'] ?? '') ?>"></div>
<div class="col-md-4"><label
class="form-label"><?= h(t('animal.form.veterinarian')) ?></label><select
class="form-select" name="sterilization_vet_contact_id">
<option value=""><?= h(t('common.not_provided')) ?></option>
<?php foreach (($sterilizationVets ?? []) as $contact): ?><option
value="<?= (int)$contact['id'] ?>"
<?= ((int)($animal['sterilization_vet_contact_id'] ?? 0) === (int)$contact['id']) ? 'selected' : '' ?>>
<?= h($contact['name']) ?></option><?php endforeach; ?>
</select></div>
<div class="col-md-4"><label
class="form-label"><?= h(t('animal.form.clinic')) ?></label><select
class="form-select" name="sterilization_clinic_contact_id">
<option value=""><?= h(t('common.not_provided')) ?></option>
<?php foreach (($sterilizationClinics ?? []) as $contact): ?><option
value="<?= (int)$contact['id'] ?>"
<?= ((int)($animal['sterilization_clinic_contact_id'] ?? 0) === (int)$contact['id']) ? 'selected' : '' ?>>
<?= h($contact['name']) ?></option><?php endforeach; ?>
</select></div>
</div>
<div class="col-12">
<hr class="my-1">
<h5 class="mb-0"><?= h(t('animal.form.identification')) ?></h5>
</div>
<div class="col-12 col-md-3"><label
class="form-label"><?= h(t('animal.form.type')) ?></label><select
class="form-select" name="identification_type">
<option value="unknown"
<?= (($animal['identification_type'] ?? 'unknown') === 'unknown') ? 'selected' : '' ?>>
<?= h(t('animal.form.none_identification')) ?></option>
<option value="microchip"
<?= (($animal['identification_type'] ?? 'unknown') === 'microchip') ? 'selected' : '' ?>>
<?= h(t('animal.microchip')) ?></option>
<option value="tattoo"
<?= (($animal['identification_type'] ?? 'unknown') === 'tattoo') ? 'selected' : '' ?>>
<?= h(t('animal.tattoo')) ?></option>
</select></div>
<div class="col-12 col-md-3"><label
class="form-label"><?= h(t('animal.form.number')) ?></label><input
class="form-control" name="chip_id"
value="<?= h($animal['chip_id'] ?? '') ?>"
placeholder="<?= h(t('animal.form.chip_number')) ?>"></div>
<div class="col-12 col-md-3"><label
class="form-label"><?= h(t('animal.form.implant_date')) ?></label><input
class="form-control" type="date" lang="<?= h(I18n::locale()) ?>"
name="identification_date"
value="<?= h($animal['identification_date'] ?? '') ?>"></div>
<div class="col-12 col-md-3"><label
class="form-label"><?= h(t('animal.form.registration')) ?></label><select
class="form-select" name="identification_registration_status">
<option value="unknown"
<?= (($animal['identification_registration_status'] ?? 'unknown') === 'unknown') ? 'selected' : '' ?>>
<?= h(t('common.unknown')) ?></option>
<option value="pending"
<?= (($animal['identification_registration_status'] ?? 'unknown') === 'pending') ? 'selected' : '' ?>>
<?= h(t('animal.form.pending')) ?></option>
<option value="registered"
<?= (($animal['identification_registration_status'] ?? 'unknown') === 'registered') ? 'selected' : '' ?>>
<?= h(t('animal.form.registered')) ?></option>
</select></div>
<div class="col-12">
<hr class="my-1">
<h5 class="mb-0"><?= h(t('animal.form.adoption')) ?></h5>
</div>
<div class="col-12 col-md-4"><label
class="form-label"><?= h(t('animal.form.availability')) ?></label><select
class="form-select" name="adoption_availability" id="adoptionAvailability">
<option value="unknown"
<?= (($animal['adoption_availability'] ?? 'unknown') === 'unknown') ? 'selected' : '' ?>>
<?= h(t('animals.to_define')) ?></option>
<option value="not_available"
<?= (($animal['adoption_availability'] ?? 'unknown') === 'not_available') ? 'selected' : '' ?>>
<?= h(t('animal.form.not_available')) ?></option>
<option value="available"
<?= (($animal['adoption_availability'] ?? 'unknown') === 'available') ? 'selected' : '' ?>>
<?= h(t('animals.available_title')) ?></option>
</select></div>
<div class="col-12 col-md-4" id="adoptionAvailableFrom"><label
class="form-label"><?= h(t('animal.form.available_from')) ?></label><input
class="form-control" type="date" lang="<?= h(I18n::locale()) ?>"
name="adoption_available_from"
value="<?= h($animal['adoption_available_from'] ?? '') ?>"></div>
<div class="col-12 col-md-4" id="adoptionUnavailableReason"><label
class="form-label"><?= h(t('animal.form.unavailable_reason')) ?></label><input
class="form-control" name="adoption_unavailability_reason" maxlength="255"
value="<?= h($animal['adoption_unavailability_reason'] ?? '') ?>"
placeholder="Soins, sociabilisation…"></div>
<div class="col-12">
<div class="card card-sm bg-green-lt">
<div class="card-body"><label class="form-check"><input
class="form-check-input" type="checkbox"
name="website_published" value="1"
<?= !empty($animal['website_published']) ? 'checked' : '' ?>><span
class="form-check-label fw-bold"><?= h(t('public_site.publish_animal')) ?></span></label>
<div class="form-hint mb-2">
<?= h(t('public_site.publish_animal_help')) ?></div><label
class="form-label"><?= h(t('public_site.public_description')) ?></label><textarea
class="form-control" name="website_description" rows="4"
maxlength="5000"
placeholder="<?= h(t('public_site.public_description_example')) ?>"><?= h($animal['website_description'] ?? '') ?></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="text-muted"><?= h(t('animal.rescue_location')) ?></div>
<input class="form-control" type="text" name="rescue_address"
value="<?= h($animal['rescue_address'] ?? '') ?>"
placeholder="<?= h(t('animal.rescue_location_placeholder')) ?>">
<div class="text-muted small mt-1"><?= h(t('animal.geocode_help')) ?></div>
</div>
<div class="col-md-4">
<div class="text-muted"><?= h(t('animal.form.current_location')) ?></div>
<input class="form-control" type="text" name="current_address"
value="<?= h($animal['current_address'] ?? '5 RUE NOTRE DAME 29260 LESNEVEN') ?>"
<?= $isArchivedEdit ? 'readonly' : '' ?> disabled>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- PROFIL DE VIE -->
<div class="col-12">
<div class="card card-sm">
<div class="card-status-top bg-cyan"></div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<span class="status status-cyan me-2"></span>
<div>
<h4 class="m-0"><?= h(t('animal.form.life_profile')) ?></h4>
<div class="text-muted small"><?= h(t('animal.form.life_profile_hint')) ?></div>
</div>
</div>
<div class="row g-3">
<?php foreach ([
'compatibility_dogs' => ['🐶',t('animal.compatible_dogs')],
'compatibility_cats' => ['🐱',t('animal.compatible_cats')],
'compatibility_children' => ['🧒',t('animal.compatible_children')],
'house_trained' => ['🧼',t('animal.house_trained')],
] as $field => $profile): ?>
<div class="col-12 col-sm-6 col-lg-3">
<label class="form-label"><span aria-hidden="true"><?= $profile[0] ?></span>
<?= h($profile[1]) ?></label>
<select class="form-select" name="<?= h($field) ?>">
<?php foreach ($lifeProfileOptions as $value => $label): ?><option
value="<?= h($value) ?>"
<?= (($animal[$field] ?? 'unknown') === $value) ? 'selected' : '' ?>>
<?= h($label) ?></option><?php endforeach; ?>
</select>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<!-- ÂGE -->
<div class="col-12">
<div class="card card-sm">
<div class="card-status-top bg-red"></div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<span class="status status-red me-2"></span>
<h4 class="m-0"><?= h(t('animal.form.age')) ?></h4>
</div>
<div class="row g-3 align-items-start">
<div class="col-12 col-md-5">
<label class="form-label"><?= h(t('animal.form.birth_date')) ?></label>
<input class="form-control" type="date" name="birth_date"
value="<?= h($animal['birth_date'] ?? '') ?>">
</div>
<div class="col-12 col-md-2">
<label class="form-label"><?= h(t('animal.form.estimated_birth')) ?></label>
<div class="pt-2">
<label class="form-check form-switch">
<input class="form-check-input" type="checkbox"
name="birth_is_estimated" value="1" id="birth_is_estimated"
<?= $birth_is_estimated ? 'checked' : '' ?>>
<span class="form-check-label">Oui</span>
</label>
</div>
</div>
<div class="col-6 col-md-2">
<label class="form-label"><?= h(t('animal.form.estimated_years')) ?></label>
<input class="form-control" type="number" min="0" max="40"
name="birth_est_years" value="<?= h($estYears) ?>" placeholder="ex: 7">
</div>
<div class="col-6 col-md-3">
<label class="form-label"><?= h(t('animal.form.estimated_months')) ?></label>
<input class="form-control" type="number" min="0" max="11"
name="birth_est_months" value="<?= h($estMonths) ?>" placeholder="ex: 4">
</div>
</div>
</div>
</div>
</div>
<!-- LOCALISATION -->
<div class="col-12">
<div class="card card-sm">
<div class="card-status-top bg-orange"></div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<span class="status status-orange me-2"></span>
<h4 class="m-0"><?= h(t('animal.form.location')) ?></h4>
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label"><?= h(t('animal.form.origin_city')) ?></label>
<input type="text" name="rescue_location_name" class="form-control"
value="<?= h($animal['rescue_location_name'] ?? '') ?>"
placeholder="<?= h(t('common.city_example')) ?>">
<div class="form-hint"><?= h(t('animal.form.origin_hint')) ?></div>
<input type="hidden" name="rescue_lat"
value="<?= h($animal['rescue_lat'] ?? '') ?>">
<input type="hidden" name="rescue_lng"
value="<?= h($animal['rescue_lng'] ?? '') ?>">
</div>
<div class="col-md-6">
<label class="form-label"><?= h(t('animal.form.current_location')) ?></label>
<input type="text" name="location_name" class="form-control"
value="<?= h($animal['location_name'] ?? '5 Rue Notre Dame 29260 LESNEVEN') ?>"
readonly>
<div class="form-hint"><?= h(t('animal.form.current_location_hint')) ?></div>
<input type="hidden" name="location_lat"
value="<?= h($animal['location_lat'] ?? '') ?>">
<input type="hidden" name="location_lng"
value="<?= h($animal['location_lng'] ?? '') ?>">
</div>
</div>
</div>
</div>
</div>
<!-- ENTRÉE AU REFUGE -->
<div class="col-12">
<div class="card card-sm">
<div class="card-status-top bg-green"></div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<span class="status status-green me-2"></span>
<div>
<h4 class="m-0"><?= h(t('animal.form.intake')) ?></h4>
<div class="text-muted small"><?= h(t('animal.form.intake_hint')) ?></div>
</div>
</div>
<div class="row g-3">
<div class="col-12 col-md-4" id="intakeWrap">
<label class="form-label"><?= h(t('animal.form.intake_date')) ?></label>
<input class="form-control" type="date" name="intake_date"
value="<?= h($animal['intake_date'] ?? '') ?>">
</div>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('animal.form.intake_type')) ?></label>
<select class="form-select"
name="intake_type"><?php foreach (($intakeTypes ?? []) as $value => $label): ?>
<option value="<?= h($value) ?>"
<?= (($animal['intake_type'] ?? 'unknown') === $value) ? 'selected' : '' ?>>
<?= h($label) ?></option><?php endforeach; ?></select>
</div>
<div class="col-12 col-md-4">
<label class="form-label"><?= h(t('animal.form.intake_reason')) ?></label>
<select class="form-select"
name="intake_reason"><?php foreach (($intakeReasons ?? []) as $value => $label): ?>
<option value="<?= h($value) ?>"
<?= (($animal['intake_reason'] ?? 'unknown') === $value) ? 'selected' : '' ?>>
<?= h($label) ?></option><?php endforeach; ?></select>
</div>
<div class="col-12 col-md-6">
<label class="form-label"><?= h(t('animal.form.depositor')) ?></label>
<select class="form-select" name="depositor_contact_id" id="depositorContact">
<option value=""><?= h(t('animal.form.no_depositor')) ?></option>
<?php foreach (($depositors ?? []) as $contact): ?><option
value="<?= (int)$contact['id'] ?>"
<?= ((int)($animal['depositor_contact_id'] ?? 0) === (int)$contact['id']) ? 'selected' : '' ?>>
<?= h($contact['name'] . (!empty($contact['city']) ? ' · ' . $contact['city'] : '')) ?>
</option><?php endforeach; ?><option value="new">
<?= h(t('animal.form.new_depositor')) ?></option>
</select>
</div>
<div class="col-12 col-md-6 d-none" id="newDepositorWrap">
<label class="form-label"><?= h(t('animal.form.new_depositor_name')) ?></label>
<input class="form-control" name="new_depositor_name" maxlength="160"
placeholder="Personne ou structure">
<div class="form-hint"><?= h(t('animal.form.depositor_hint')) ?></div>
</div>
<div class="col-12">
<label class="form-label"><?= h(t('animal.form.circumstances')) ?></label>
<textarea class="form-control" name="intake_circumstances" rows="3"
placeholder="<?= h(t('animal.intake_circumstances_placeholder')) ?>"><?= h($animal['intake_circumstances'] ?? '') ?></textarea>
</div>
<div class="col-12 col-md-6" id="quUntilWrap">
<label class="form-label"><?= h(t('animal.form.quarantine_exit')) ?></label>
<input class="form-control" value="<?= h($animal['quarantine_until'] ?? '') ?>"
readonly>
<div class="form-hint">
<?= h(t('animal.form.quarantine_hint', ['count' => AppSettings::int('quarantine_days', 1, 90)])) ?>
</div>
</div>
<div class="col-12">
<label class="form-label"><?= h(t('common.notes')) ?></label>
<textarea class="form-control" name="notes"
rows="5"><?= h($animal['notes'] ?? '') ?></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer d-flex justify-content-between">
<a class="btn" href="/animals">Annuler</a>
<button class="btn btn-primary" type="submit"><?= h(t('common.save')) ?></button>
</div>
</form>
</div>
</div>
<script>
(function() {
const status = document.getElementById('status');
const intakeWrap = document.getElementById('intakeWrap');
const quUntilWrap = document.getElementById('quUntilWrap');
const refugeRoomField = document.getElementById('refugeRoomField');
const fosterContactField = document.getElementById('fosterContactField');
const freeCatFields = document.getElementById('freeCatFields');
const coatSelect = document.getElementById('coatColorSelect');
const coatSwatch = document.getElementById('coatColorSwatch');
function sync() {
const v = (status.value || '').toLowerCase();
const show = (v === 'quarantaine');
quUntilWrap.style.display = show ? '' : 'none';
const roomSelect = refugeRoomField.querySelector('select');
const hasRooms = Array.from(roomSelect.options).some(option => option.dataset.status === v);
refugeRoomField.style.display = hasRooms ? '' : 'none';
roomSelect.querySelectorAll('option[data-status]').forEach(option => option.hidden = option.dataset
.status !== v);
if (roomSelect.selectedOptions[0]?.hidden) roomSelect.value = '';
fosterContactField.style.display = (v === 'fa' || v === 'fa_permanente') ? '' : 'none';
freeCatFields?.classList.toggle('d-none', v !== 'chat_libre');
}
status.addEventListener('change', sync);
sync();
function syncCoatSwatch() {
const option = coatSelect?.options[coatSelect.selectedIndex];
if (coatSwatch && option) coatSwatch.style.cssText = option.dataset.swatch || 'background:#d9dde3';
}
coatSelect?.addEventListener('change', syncCoatSwatch);
syncCoatSwatch();
const sterilizationStatus = document.getElementById('sterilizationStatus');
const sterilizationDetails = document.getElementById('sterilizationDetails');
const syncSterilization = () => sterilizationDetails?.classList.toggle('d-none', sterilizationStatus
?.value !== 'yes');
sterilizationStatus?.addEventListener('change', syncSterilization);
syncSterilization();
const depositorContact = document.getElementById('depositorContact');
const newDepositorWrap = document.getElementById('newDepositorWrap');
const syncDepositor = () => newDepositorWrap?.classList.toggle('d-none', depositorContact?.value !== 'new');
depositorContact?.addEventListener('change', syncDepositor);
syncDepositor();
const adoptionAvailability = document.getElementById('adoptionAvailability');
const adoptionAvailableFrom = document.getElementById('adoptionAvailableFrom');
const adoptionUnavailableReason = document.getElementById('adoptionUnavailableReason');
const syncAdoption = () => {
const value = adoptionAvailability?.value;
adoptionAvailableFrom?.classList.toggle('d-none', value !== 'available');
adoptionUnavailableReason?.classList.toggle('d-none', value !== 'not_available');
};
adoptionAvailability?.addEventListener('change', syncAdoption);
syncAdoption();
})();
</script>