feat : dernier push avant finalisation de affichage reception finie
This commit is contained in:
@@ -1,6 +1,22 @@
|
||||
<template>
|
||||
<form @submit.prevent="validate">
|
||||
<div class="grid grid-cols-2 gap-x-40 gap-y-8 mb-8">
|
||||
<form>
|
||||
<div class="grid grid-cols-3 gap-x-40 gap-y-8 mb-8">
|
||||
<UiNumberInput
|
||||
:key="weight.type"
|
||||
:label="'POIDS'"
|
||||
labelClass="font-bold uppercase text-xl "
|
||||
v-model="weight.weight"
|
||||
:disabled="!auth.isAdmin"
|
||||
:min="0"
|
||||
:max="48000"
|
||||
/>
|
||||
|
||||
<UiDateInput
|
||||
label="Date pesée"
|
||||
v-model="sharedWeightMeta.weighedAt"
|
||||
:disabled="!auth.isAdmin"
|
||||
/>
|
||||
|
||||
<UiNumberInput
|
||||
label="Dsd"
|
||||
class="col-start-2"
|
||||
@@ -8,38 +24,7 @@
|
||||
v-model="sharedWeightMeta.dsd"
|
||||
:disabled="!auth.isAdmin"
|
||||
/>
|
||||
<UiDateInput
|
||||
label="Date pesée"
|
||||
v-model="sharedWeightMeta.weighedAt"
|
||||
:disabled="!auth.isAdmin"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-x-40 mb-16">
|
||||
<UiNumberInput
|
||||
v-for="weight in form.weights"
|
||||
:key="weight.type"
|
||||
:label="getWeightLabel(weight.type)"
|
||||
labelClass="font-bold uppercase text-xl"
|
||||
inputClass="w-24"
|
||||
v-model="weight.weight"
|
||||
:wrapper-class="weight.type === 'tare' ? 'col-start-1 row-start-1' : 'col-start-2 row-start-1'"
|
||||
:disabled="!auth.isAdmin"
|
||||
:min="0"
|
||||
:max="48000"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<UiButton
|
||||
v-if="auth.isAdmin"
|
||||
type="submit"
|
||||
class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px]"
|
||||
|
||||
>
|
||||
Valider
|
||||
</UiButton>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</template>
|
||||
|
||||
@@ -48,12 +33,17 @@ import type {ReceptionFormWeight} from '~/services/dto/reception-data'
|
||||
import {getReception} from '~/services/reception'
|
||||
import {updateWeight} from "~/services/weight";
|
||||
import {useAuthStore} from "~/stores/auth";
|
||||
import {ref, watch} from "vue";
|
||||
|
||||
const props = defineProps<{
|
||||
idReception: number
|
||||
weightType: string
|
||||
isValidate: boolean
|
||||
}>()
|
||||
|
||||
const idReception = props.idReception
|
||||
const weightType = props.weightType
|
||||
|
||||
const auth = useAuthStore()
|
||||
|
||||
const form = reactive({
|
||||
@@ -62,6 +52,10 @@ const form = reactive({
|
||||
{id: 0, type: 'gross' as const, weight: 0, dsd: null, weighedAt: null}
|
||||
]
|
||||
})
|
||||
|
||||
const weight = form.weights.find(w => w.type === weightType)
|
||||
const initialWeight = ref<{ weight: number | null; dsd: number | null; weighedAt: string | null } | null>(null)
|
||||
|
||||
// DSD et date de pesée sont partagés entre tare et gross dans l'UI.
|
||||
const sharedWeightMeta = reactive<{
|
||||
dsd: number | string | null
|
||||
@@ -71,8 +65,20 @@ const sharedWeightMeta = reactive<{
|
||||
weighedAt: null
|
||||
})
|
||||
|
||||
const getWeightLabel = (type: 'tare' | 'gross'): string => {
|
||||
return type === 'tare' ? 'Pesée à vide' : 'Pesée à plein'
|
||||
const normalizeMeta = () => {
|
||||
const sharedDsd =
|
||||
sharedWeightMeta.dsd === null || sharedWeightMeta.dsd === undefined || sharedWeightMeta.dsd === ''
|
||||
? null
|
||||
: Number(sharedWeightMeta.dsd)
|
||||
const sharedWeighedAt =
|
||||
sharedWeightMeta.weighedAt === null || sharedWeightMeta.weighedAt === undefined || sharedWeightMeta.weighedAt === ''
|
||||
? null
|
||||
: sharedWeightMeta.weighedAt
|
||||
|
||||
return {
|
||||
dsd: Number.isFinite(sharedDsd) ? sharedDsd : null,
|
||||
weighedAt: sharedWeighedAt
|
||||
}
|
||||
}
|
||||
|
||||
const hydrateFromReception = (reception: ReceptionFormWeight) => {
|
||||
@@ -94,6 +100,15 @@ const hydrateFromReception = (reception: ReceptionFormWeight) => {
|
||||
sharedWeightMeta.dsd = weightWithMeta.dsd ?? null
|
||||
sharedWeightMeta.weighedAt = weightWithMeta.weighedAt ?? null
|
||||
}
|
||||
|
||||
if (weight) {
|
||||
const normalized = normalizeMeta()
|
||||
initialWeight.value = {
|
||||
weight: weight.weight ?? null,
|
||||
dsd: normalized.dsd,
|
||||
weighedAt: normalized.weighedAt
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
@@ -101,24 +116,48 @@ onMounted(async () => {
|
||||
hydrateFromReception(reception)
|
||||
})
|
||||
|
||||
async function validate() {
|
||||
const sharedDsd =
|
||||
sharedWeightMeta.dsd === null || sharedWeightMeta.dsd === undefined || sharedWeightMeta.dsd === ''
|
||||
? null
|
||||
: Number(sharedWeightMeta.dsd)
|
||||
const sharedWeighedAt =
|
||||
sharedWeightMeta.weighedAt === null || sharedWeightMeta.weighedAt === undefined || sharedWeightMeta.weighedAt === ''
|
||||
? null
|
||||
: sharedWeightMeta.weighedAt
|
||||
for (const weight of form.weights) {
|
||||
if (weight.id) {
|
||||
await updateWeight(weight.id, {
|
||||
weight: weight.weight,
|
||||
dsd: Number.isFinite(sharedDsd) ? sharedDsd : null,
|
||||
weighedAt: sharedWeighedAt
|
||||
})
|
||||
}
|
||||
watch(
|
||||
() => props.isValidate,
|
||||
async (val) => {
|
||||
if (!val) return
|
||||
await runValidate()
|
||||
}
|
||||
)
|
||||
|
||||
const hasChanged = (current: { weight: number | null; dsd: number | null; weighedAt: string | null }) => {
|
||||
if (!initialWeight.value) {
|
||||
return true
|
||||
}
|
||||
return (
|
||||
(current.weight ?? null) !== (initialWeight.value.weight ?? null) ||
|
||||
(current.dsd ?? null) !== (initialWeight.value.dsd ?? null) ||
|
||||
(current.weighedAt ?? null) !== (initialWeight.value.weighedAt ?? null)
|
||||
)
|
||||
}
|
||||
|
||||
const runValidate = async () => {
|
||||
if (!weight?.id) {
|
||||
return
|
||||
}
|
||||
|
||||
const normalized = normalizeMeta()
|
||||
const current = {
|
||||
weight: weight.weight ?? null,
|
||||
dsd: normalized.dsd,
|
||||
weighedAt: normalized.weighedAt
|
||||
}
|
||||
|
||||
if (!hasChanged(current)) {
|
||||
return
|
||||
}
|
||||
|
||||
await updateWeight(weight.id, {
|
||||
weight: current.weight,
|
||||
dsd: current.dsd,
|
||||
weighedAt: current.weighedAt
|
||||
})
|
||||
|
||||
initialWeight.value = current
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user