feat(front) : retouches UX saisie bovin (filtre, toast, partial save, fix isSaisi)
- isSaisi : != null couvre les champs absents du JSON (API Platform strip null) - UiNumberInput : ne réécrit target.value que si réellement clampé (fix saisie décimaux) - Form : champs optionnels, payload partiel, toast de confirmation - Page : filtre N° national au-dessus de la liste Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,32 +1,32 @@
|
||||
<template>
|
||||
<form class="space-y-6" :class="{ submitted }" @submit.prevent="submit">
|
||||
<div class="grid grid-cols-2 gap-x-12 gap-y-6">
|
||||
<form class="space-y-6" @submit.prevent="submit">
|
||||
<div class="grid grid-cols-4 gap-x-12 gap-y-6">
|
||||
<UiNumberInput
|
||||
v-model="form.receivedWeight"
|
||||
label="Poids d'arrivée (kg)"
|
||||
wrapperClass="flex-col"
|
||||
labelClass="font-bold uppercase text-xl text-primary-700"
|
||||
:min="0"
|
||||
:step="1"
|
||||
required
|
||||
/>
|
||||
<UiNumberInput
|
||||
v-model="form.pricePerKg"
|
||||
label="Prix d'achat (kg)"
|
||||
label="Prix au kg"
|
||||
wrapperClass="flex-col"
|
||||
labelClass="font-bold uppercase text-xl text-primary-700"
|
||||
:min="0"
|
||||
:step="0.01"
|
||||
required
|
||||
/>
|
||||
<UiSelect
|
||||
v-model="form.buildingId"
|
||||
label="Bâtiment"
|
||||
:options="buildingOptions"
|
||||
required
|
||||
/>
|
||||
<UiSelect
|
||||
v-model="form.buildingCaseId"
|
||||
label="Case"
|
||||
:options="caseOptions"
|
||||
:disabled="form.buildingId === null"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -66,15 +66,14 @@ interface FormState {
|
||||
}
|
||||
|
||||
const form = reactive<FormState>({
|
||||
receivedWeight: props.bovine.receivedWeight,
|
||||
pricePerKg: props.bovine.pricePerKg,
|
||||
receivedWeight: props.bovine.receivedWeight ?? null,
|
||||
pricePerKg: props.bovine.pricePerKg ?? null,
|
||||
buildingId: props.bovine.buildingCase?.building?.id
|
||||
?? props.bovine.effectiveBuilding?.id
|
||||
?? null,
|
||||
buildingCaseId: props.bovine.buildingCase?.id ?? null
|
||||
})
|
||||
|
||||
const submitted = ref(false)
|
||||
const isSaving = ref(false)
|
||||
|
||||
const buildingOptions = computed(() =>
|
||||
@@ -101,13 +100,15 @@ watch(() => form.buildingId, (newId) => {
|
||||
})
|
||||
|
||||
const submit = async () => {
|
||||
submitted.value = true
|
||||
if (
|
||||
form.receivedWeight === null
|
||||
|| form.pricePerKg === null
|
||||
|| form.buildingId === null
|
||||
|| form.buildingCaseId === null
|
||||
) {
|
||||
const payload: Record<string, unknown> = {}
|
||||
if (form.receivedWeight != null) payload.receivedWeight = form.receivedWeight
|
||||
if (form.pricePerKg != null) payload.pricePerKg = form.pricePerKg
|
||||
if (form.buildingCaseId != null) {
|
||||
payload.buildingCase = `/api/building_cases/${form.buildingCaseId}`
|
||||
}
|
||||
|
||||
if (Object.keys(payload).length === 0) {
|
||||
emit('saved', props.bovine)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -115,11 +116,8 @@ const submit = async () => {
|
||||
try {
|
||||
const updated = await api.patch<BovineData>(
|
||||
`bovines/${props.bovine.id}`,
|
||||
{
|
||||
receivedWeight: form.receivedWeight,
|
||||
pricePerKg: form.pricePerKg,
|
||||
buildingCase: `/api/building_cases/${form.buildingCaseId}`
|
||||
}
|
||||
payload,
|
||||
{ toastSuccessMessage: `Bovin ${props.bovine.nationalNumber} enregistré.` }
|
||||
)
|
||||
emit('saved', updated)
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user