fix : correction des retours de la V0
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
<template>
|
||||
<template v-if="!isLiotCarrier">
|
||||
<div :class="wrapperClass">
|
||||
<UiLicensePlateInput
|
||||
v-model="form.licensePlate"
|
||||
v-model:allowAny="allowAnyLicensePlate"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="isLiotCarrier">
|
||||
<UiSelect
|
||||
:id="`${idPrefix}-vehicle`"
|
||||
v-model="form.vehicleId"
|
||||
label="Immatriculation"
|
||||
:options="filteredVehicles.map((vehicle) => ({
|
||||
value: String(vehicle.id),
|
||||
label: vehicle.plate
|
||||
}))"
|
||||
:loading="isLoadingVehicles"
|
||||
:disabled="isLoadingVehicles || filteredVehicles.length === 0"
|
||||
:wrapper-class="wrapperClass"
|
||||
/>
|
||||
<UiSelect
|
||||
:id="`${idPrefix}-driver`"
|
||||
v-model="form.driverId"
|
||||
label="Nom du chauffeur si LIOT"
|
||||
:options="filteredDrivers.map((driver) => ({
|
||||
value: String(driver.id),
|
||||
label: driver.name
|
||||
}))"
|
||||
:loading="isLoadingDrivers"
|
||||
:wrapper-class="driverWrapperClass"
|
||||
/>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { DriverData } from '~/services/dto/driver-data'
|
||||
import type { VehicleData } from '~/services/dto/vehicle-data'
|
||||
|
||||
defineProps<{
|
||||
idPrefix: string
|
||||
form: { licensePlate: string; vehicleId: string; driverId: string }
|
||||
isLiotCarrier: boolean
|
||||
allowAnyLicensePlate: boolean
|
||||
filteredVehicles: VehicleData[]
|
||||
filteredDrivers: DriverData[]
|
||||
isLoadingVehicles: boolean
|
||||
isLoadingDrivers: boolean
|
||||
wrapperClass?: string
|
||||
driverWrapperClass?: string
|
||||
}>()
|
||||
|
||||
defineEmits<{
|
||||
'update:allowAnyLicensePlate': [value: boolean]
|
||||
}>()
|
||||
</script>
|
||||
@@ -0,0 +1,72 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center gap-10">
|
||||
<Icon @click="router.push('/')" name="gg:arrow-left-o" size="44" class="cursor-pointer text-primary-500"/>
|
||||
<h1 class="text-3xl font-bold uppercase text-primary-500">{{ title }}</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-[86px]">
|
||||
<div class="mt-6 border border-slate-200 mb-16">
|
||||
<div
|
||||
class="grid gap-4 bg-slate-100 px-4 py-3 text-sm font-semibold uppercase tracking-wide"
|
||||
:style="{ gridTemplateColumns: gridCols }"
|
||||
>
|
||||
<div v-for="col in columns" :key="col.key">{{ col.label }}</div>
|
||||
<div v-if="showActions">Actions</div>
|
||||
</div>
|
||||
<div
|
||||
v-for="item in items"
|
||||
:key="item.id"
|
||||
class="grid gap-4 px-4 py-3 text-sm hover:bg-slate-50 cursor-pointer border-t border-slate-200"
|
||||
:style="{ gridTemplateColumns: gridCols }"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
@click="goToItem(item.id)"
|
||||
@keydown.enter="goToItem(item.id)"
|
||||
>
|
||||
<div v-for="col in columns" :key="col.key">
|
||||
<slot :name="`cell-${col.key}`" :item="item">
|
||||
{{ getNestedValue(item, col.key) }}
|
||||
</slot>
|
||||
</div>
|
||||
<div v-if="showActions" @click.stop>
|
||||
<slot name="actions" :item="item" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
interface Column {
|
||||
key: string
|
||||
label: string
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
title: string
|
||||
columns: Column[]
|
||||
items: any[]
|
||||
routePrefix: string
|
||||
showActions?: boolean
|
||||
}>(), {
|
||||
showActions: false
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const gridCols = computed(() => {
|
||||
const dataCols = props.columns.map(() => '1fr').join(' ')
|
||||
return props.showActions ? `${dataCols} 60px` : dataCols
|
||||
})
|
||||
|
||||
const goToItem = (id: number) => {
|
||||
router.push(`${props.routePrefix}/${id}`)
|
||||
}
|
||||
|
||||
const getNestedValue = (obj: any, path: string): string => {
|
||||
const value = path.split('.').reduce((acc, key) => acc?.[key], obj)
|
||||
return value || '—'
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,78 @@
|
||||
<template>
|
||||
<div class="flex justify-center">
|
||||
<div class="flex flex-col items-center w-[660px]">
|
||||
<h1 class="font-bold text-5xl uppercase text-primary-500">{{ title }}</h1>
|
||||
<p class="text-primary-500 uppercase text-2xl mt-2">Pont-bascule connecté</p>
|
||||
<div
|
||||
v-if="!displayWeight"
|
||||
class="w-full flex flex-col items-center justify-center border border-black h-[90px] mt-12 mb-[86px]">
|
||||
<UiLoadingDots />
|
||||
</div>
|
||||
<div v-else class="w-full">
|
||||
<div
|
||||
class="w-full flex flex-col items-center justify-center border border-black h-[90px] mt-12 mb-[25px] text-4xl text-primary-500">
|
||||
{{ displayWeight }} kg
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center mt-[54px]">
|
||||
<UiButton
|
||||
class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px]"
|
||||
@click="fetchWeight"
|
||||
>{{ displayWeight !== null ? 'refaire une pesée' : 'peser' }}</UiButton>
|
||||
<UiButton
|
||||
v-if="displayWeight !== null && !showGenerateReceipt"
|
||||
class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px] ml-4"
|
||||
@click="saveWeight"
|
||||
>Valider la pesée</UiButton>
|
||||
<UiButton
|
||||
v-if="showGenerateReceipt"
|
||||
class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px] ml-4"
|
||||
@click="printReceipt"
|
||||
>Générer le bon</UiButton>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { toRef } from 'vue'
|
||||
import { useWeighingStep } from '~/composables/steps/useWeighingStep'
|
||||
import type { WeightData } from '~/services/dto/weight-data'
|
||||
|
||||
const props = defineProps<{
|
||||
mode: 'gross' | 'tare'
|
||||
entityName: 'reception' | 'shipment'
|
||||
apiResource: string
|
||||
titleLabel: string
|
||||
isFinal: boolean
|
||||
entity: any
|
||||
getWeightFromScale: () => Promise<WeightData>
|
||||
updateEntity: (id: number, payload: any) => Promise<any>
|
||||
loadEntity: (id: number) => Promise<any>
|
||||
clearEntity: () => void
|
||||
buildReceiptFilename: (entity: any) => string
|
||||
}>()
|
||||
|
||||
const entityRef = toRef(props, 'entity')
|
||||
|
||||
const {
|
||||
displayWeight,
|
||||
title,
|
||||
fetchWeight,
|
||||
saveWeight,
|
||||
showGenerateReceipt,
|
||||
printReceipt
|
||||
} = useWeighingStep({
|
||||
mode: props.mode,
|
||||
entity: entityRef,
|
||||
entityName: props.entityName,
|
||||
apiResource: props.apiResource,
|
||||
titleLabel: props.titleLabel,
|
||||
isFinal: props.isFinal,
|
||||
getWeightFromScale: props.getWeightFromScale,
|
||||
updateEntity: props.updateEntity,
|
||||
loadEntity: props.loadEntity,
|
||||
clearEntity: props.clearEntity,
|
||||
buildReceiptFilename: props.buildReceiptFilename
|
||||
})
|
||||
</script>
|
||||
Reference in New Issue
Block a user