feat: permettre la modification des portées

This commit is contained in:
Alexandre NOEL 2026-09-15 18:48:25 +02:00
commit f45cfc40f2
15 changed files with 218 additions and 14 deletions

View file

@ -39,7 +39,8 @@
<?= $litter['father_id'] ? '<a href="/animal?id=' . (int)$litter['father_id'] . '">' . h($litter['father_name']) . '</a>' : h(t('animal.unknown_male')) ?>
</div>
</div>
<a class="btn btn-outline-primary btn-sm ms-auto"
<a class="btn btn-outline-primary btn-sm ms-auto" href="/litter/edit?id=<?= (int)$litter['id'] ?>&amp;animal_id=<?= (int)$animal['id'] ?>">✏️ <?= h(t('common.edit')) ?></a>
<a class="btn btn-outline-primary btn-sm"
href="/litter/add-existing?litter_id=<?= (int)$litter['id'] ?>&amp;animal_id=<?= (int)$animal['id'] ?>">+
<?= h(t('animal.add_existing_cat')) ?></a>
</div>

View file

@ -31,8 +31,8 @@
<div class="col-lg-6">
<section class="card h-100">
<div class="card-body">
<span class="badge bg-blue-lt mb-2">1.0.0-rc.24</span>
<h3>Fiabilité des portées</h3>
<span class="badge bg-blue-lt mb-2">1.0.0-rc.25</span>
<h3>Portées modifiables et fiables</h3>
<p class="text-muted">La création d’une fratrie ne dépend plus d’un ancien traitement de photo et
son historique reste compatible avec les bases existantes.</p>
</div>

View file

@ -271,7 +271,7 @@ if ($pageDescription === '') {
if (path.startsWith('/admin') || path.startsWith('/documents')) return 'administrative';
return null;
};
const permissionEditPages = new Set(['/animal/new', '/animal/edit', '/animal/death', '/litter/new',
const permissionEditPages = new Set(['/animal/new', '/animal/edit', '/animal/death', '/litter/new', '/litter/edit', '/litter/update', '/litter/kitten/detach',
'/litter/add-existing', '/litter/add-existing/save', '/bonded/new', '/directory/new',
'/directory/edit', '/care-round/setup'
]);

13
app/Views/litter_edit.php Normal file
View file

@ -0,0 +1,13 @@
<?php $returnId = $sourceAnimalId ?: ((int)($litter['mother_id'] ?? 0) ?: (int)($litter['father_id'] ?? 0)); ?>
<form method="post" action="/litter/update" class="card mb-3">
<input type="hidden" name="csrf" value="<?= h(Auth::csrf()) ?>"><input type="hidden" name="litter_id" value="<?= (int)$litter['id'] ?>"><input type="hidden" name="source_animal_id" value="<?= (int)$returnId ?>">
<div class="card-header"><div><h3 class="card-title mb-1"><?= h(t('litter.edit')) ?></h3><div class="text-muted small"><?= h(t('litter.edit_help')) ?></div></div><a class="btn btn-ghost-secondary ms-auto" href="/animal?id=<?= (int)$returnId ?>#tab-litters"><?= h(t('common.cancel')) ?></a></div>
<div class="card-body"><div class="row g-3">
<div class="col-md-4"><label class="form-label"><?= h(t('litter.mother')) ?></label><select class="form-select" name="mother_id"><option value=""><?= h(t('litter.unknown_parent')) ?></option><?php foreach ($mothers as $parent): ?><option value="<?= (int)$parent['id'] ?>" <?= (int)$litter['mother_id'] === (int)$parent['id'] ? 'selected' : '' ?>><?= h($parent['name']) ?></option><?php endforeach; ?></select></div>
<div class="col-md-4"><label class="form-label"><?= h(t('litter.father')) ?></label><select class="form-select" name="father_id"><option value=""><?= h(t('litter.unknown_parent')) ?></option><?php foreach ($fathers as $parent): ?><option value="<?= (int)$parent['id'] ?>" <?= (int)$litter['father_id'] === (int)$parent['id'] ? 'selected' : '' ?>><?= h($parent['name']) ?></option><?php endforeach; ?></select></div>
<div class="col-md-4"><label class="form-label"><?= h(t('litter.birth_date')) ?></label><input class="form-control" type="date" name="birth_date" value="<?= h($litter['birth_date'] ?? '') ?>"></div>
</div></div><div class="card-footer text-end"><button class="btn btn-primary" type="submit"><?= h(t('common.save')) ?></button></div>
</form>
<div class="card"><div class="card-header"><h3 class="card-title"><?= h(t('litter.kittens')) ?></h3><div class="ms-auto d-flex gap-2"><a class="btn btn-outline-primary btn-sm" href="/litter/new?litter_id=<?= (int)$litter['id'] ?>&amp;animal_id=<?= (int)$returnId ?>">+ <?= h(t('litter.new_kittens')) ?></a><a class="btn btn-outline-primary btn-sm" href="/litter/add-existing?litter_id=<?= (int)$litter['id'] ?>&amp;animal_id=<?= (int)$returnId ?>">+ <?= h(t('animal.add_existing_cat')) ?></a></div></div><div class="list-group list-group-flush">
<?php foreach ($kittens as $kitten): ?><div class="list-group-item d-flex align-items-center gap-2"><span class="coat-swatch" style="<?= h(coat_swatch_style($kitten['color'] ?? '')) ?>"></span><strong><?= h($kitten['name']) ?></strong><span class="text-muted small"><?= h($kitten['internal_code']) ?></span><a class="btn btn-outline-primary btn-sm ms-auto" href="/animal/edit?id=<?= (int)$kitten['id'] ?>"><?= h(t('common.edit')) ?></a><form method="post" action="/litter/kitten/detach" onsubmit="return confirm(<?= h(json_encode(t('litter.detach_confirm'), JSON_UNESCAPED_UNICODE)) ?>)"><input type="hidden" name="csrf" value="<?= h(Auth::csrf()) ?>"><input type="hidden" name="litter_id" value="<?= (int)$litter['id'] ?>"><input type="hidden" name="animal_id" value="<?= (int)$kitten['id'] ?>"><input type="hidden" name="source_animal_id" value="<?= (int)$returnId ?>"><button class="btn btn-outline-danger btn-sm" type="submit"><?= h(t('litter.detach')) ?></button></form></div><?php endforeach; ?>
</div></div>

View file

@ -8,6 +8,7 @@ $prefillCount = max(0, min(20, (int)($_GET['count'] ?? 4)));
?>
<form method="post" action="/litter/save" class="card">
<input type="hidden" name="csrf" value="<?= h(Auth::csrf()) ?>">
<input type="hidden" name="existing_litter_id" value="<?= (int)($existingLitterId ?? 0) ?>">
<div class="card-header d-flex align-items-center justify-content-between">
<h3 class="card-title"><?= h(t('litter.create')) ?></h3>
<a href="<?= $sourceAnimalId ? '/animal?id=' . (int)$sourceAnimalId . '#tab-litters' : '/animals' ?>"
@ -43,7 +44,7 @@ $prefillCount = max(0, min(20, (int)($_GET['count'] ?? 4)));
<div class="col-md-4">
<label class="form-label"><?= h(t('litter.birth_date')) ?> <span
class="text-muted"><?= h(t('common.optional_parentheses')) ?></span></label>
<input class="form-control" type="date" name="birth_date" placeholder="jj/mm/aaaa">
<input class="form-control" type="date" name="birth_date" value="<?= h($birthDate ?? '') ?>" placeholder="jj/mm/aaaa">
</div>
</div>